一、实验目的:
掌握基本的图象增强和变换方法,观察图象增强的效果,加深对图像增强和一些基本变换的理解。熟悉如何用matlab实验平台对图像进行增强和变换处理。
二、实验内容:
1.编程实现打开一个灰度图像,能够显示图像。
2.图像数字化以及相关操作(图像灰度的平均值,协方差矩阵,灰度标准差)。
3.编程实现图像傅立叶变换和反变换,实现带噪小丑图像去除噪音。
4.用直接灰度变换改变图像(求反,增强对比度,动态范围压缩,灰度切分)。
三、实验过程:
注:除小丑去噪外其他操作均用图1所示的Gem图像(Gem是我的网名);
这里面的所有图象我都先变换为灰度图
判断是否为灰度图象:
flag=isgray(A)
判断是否为真彩图象:
flag=isrgb(A)
真彩图象→灰度图象:
I=rgb2gray(A);
1.打开并显示一幅灰度图像:
在matlab命令窗口中输入如下代码:
>>I=imread('d:/gem.bmp');
>> flag=isgray(I) %判断是否是灰度图片flag=1,ture是灰度图片;否则不是
flag =
1
>>imshow(I)
所显示结果如下:
2.求图像灰度平均值,协方差矩阵和灰度标准差:
(1) 求灰度平均值
① 实现方式1:因为实验过程1中打开灰度图像时已完成图像的数字化,即图像已经变成一个矩阵,因此直接调用matlab自带的求矩阵均值函数mean2()求图像的均值。代码如下:
>>I=imread('d:/gem.bmp');
>>J=mean2(I)
J =
189.8383
>>
② 实现方式2:先调用size函数求出矩阵的大小,然后求出矩阵所有值的平均值即是原始图像的灰度均值。代码如下:
>>I=imread('d:/gem.bmp');%读入原始图像
>>[m,n]=size(I); %求对应矩阵的规格,即图像的像素总数
>>J=double(I);
>>a=0; %变量a赋初值
>>for j=1:m %循环求和
for k=1:n
a=a+J(j,k);
end
end
>>avg=a/(238*107) %求平均
运行结果:avg =189.8383
(2)灰度标准差:
>>K=std2(I)
K =
88.4966
>>
(3)协方差矩阵
cov(double(I))
4.0607 4.2491 4.5113 4.8265 5.2313 6.1461 8.7791 8.6492 8.4031
3.9241 4.0898 4.3327 4.6267 5.0069 5.9301 8.6492 8.8390 8.6943
3.7321 3.8970 4.1378 4.4305 4.8065 5.7193 8.4031 8.6943 8.8302
3.6235 3.7439 3.9634 4.2335 4.5807 5.4701 8.0734 8.4097 8.6483
3.4612 3.5449 3.7612 4.0290 4.3694 5.2420 7.7879 8.1323 8.3975
3.2847 3.3375 3.5481 3.8118 4.1397 4.9820 7.4237 7.7602 8.0192
3.1529 3.2837 3.5100 3.7920 4.1366 4.9723 7.3915 7.6752 7.9027
2.5251 2.6593 2.9130 3.2128 3.6099 4.4803 7.0184 7.2345 7.4691
..... .....
3.图像傅立叶变换和反变换
直接调用matlab自带的函数实现,代码如下:
>> I=imread('d:/gem.bmp');
>>C= fft2(double(I)); %对图像进行傅立叶变换
>> B=fftshift(fft2(double(I))); %对频谱图进行平移处理
>> D=ifft2(B); %傅立叶反变换
>> subplot(1,3,1), imshow(I) %画图像原始图
>> subplot(1,3,2), imshow(log(abs(B)+1),[]) %画直接变换频谱图
>> subplot(1,3,3), imshow(abs(D),[]) %显示反傅立叶变换后的图像
显示效果如下:
实现小丑图像去除噪音:
小丑图象除噪,是我经过多次探索才辛苦的弄出来的
>> A=imread('d:/小丑.jpg');
>> I=rgb2gray(A);
>> subplot(2,2,1),imshow(I);
>> B=fftshift(fft2(double(I)));
>> subplot(2,2,2),imshow(log(abs(B)+1),[]);
%如图 对B里面的数据进行如下修改:
(x,y)={(44,52),(107,41),(22,89),(87,76)}
"这些点是我用QQ抓图定位"
对上面(x,y)这些点为中心N8领域D8=2的幅值全部置为0 %
图3显示的是对第一个点(44,52)处理数据
>>subplot(2,2,3),imshow(log(abs(B)+1),[]);
>>D=ifft2(B);
>> subplot(2,2,4), imshow(abs(D),[])
>>
显示效果如下:
图4为除噪后的图片
4.用直接灰度变换改变图像
(1)图像求反
图象求反即是让图象的像素分布反过来,即黑变白,白变黑。
%x1=y1时斜率k=1的效果:
代码如下:
>> I=imread('d:/gem.bmp');
>> subplot(2,2,1), imshow(I)
>> level=graythresh(I);
>> bw=im2bw(I,level);
>> subplot(2,2,2), imshow(bw);
>> x1=107;
>> y1=238;
>> subplot(2,2,3),plot([0,x1],[y1,0])
>> axis tight,xlabel('x'),ylabel('y')
>> title('变换曲线')
>> k=y1/x1;
>> [m,n]=size(I);
>> J=double(I);
>> for i =1:m
for j=1:n
x=J(i,j);
y(i,j)=0;
if (x>=0)&(x<=x1)
y(i,j)=y1-k*x;
else
y(i,j)=0;
end
end
end
>> subplot(2,2,4),imshow(mat2gray(y))
>>
显示效果如下:
图5求反
增强对比度:
代码如下:
>>I=imread('d:/gem.bmp');
>> subplot(1,3,1), imshow(I)
>> f0=0;g0=0;
>> f1=70;g1=30;
>> f2=180;g2=230;
>> f3=255;g3=255;
>> subplot(1,3,2),plot([f0,f1,f2,f3],[g0,g1,g2,g3])
>> axis tight,xlabel('f'),ylabel('g')
>> title('变换曲线')
>> r1=(g1-g0)/(f1-f0);
>> b1=g0-r1*f0;
>> r2=(g2-g1)/(f2-f1);
>> b2=g1-r2*f1;
>> r3=(g3-g2)/(f3-f2);
>> b3=g2-r3*f2;
>> [m,n]=size(I);
>> X2=double(I);
>> for i=1:m
for j=1:n;
f=X2(i,j);
g(i,j)=0;
if(f>=0)&(f<=f1)
g(i,j)=r1*f+b1;
elseif (f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;
elseif (f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;
end
end
end
>> subplot(1,3,3),imshow(mat2gray(g))
>>
显示效果如下:
图6增强对比度
动态范围压缩:
代码如下:
>> I=imread('d:/gem.bmp');
>> subplot(1,3,1), imshow(I)
>> c=255/log(256);
>> x=0:1:255;
>> y=c*log(1+x);
>> subplot(1,3,2),plot(x,y)
>> axis tight,xlabel('f'),ylabel('g')
>> title('变换曲线')
>> [m,n]=size(I);
>> X2=double(I);
>> for i=1:m
for j=1:n;
g(i,j)=c*log(X2(i,j)+1);
end
end
>> subplot(1,3,3),imshow(mat2gray(g))
>>
显示效果如下:
图7动态范围压缩
灰度切分 :
代码如下:
>> I=imread('d:/gem.bmp');
>> subplot(1,3,1), imshow(I)
>> s1=100;s2=200;g1=20;g2=200;
>> subplot(1,3,2),plot([0,s1,s1,s2,s2,255],[g1,g1,g2,g2,g1,g1])
>> axis tight,xlabel('f'),ylabel('g')
>> title('变换曲线')
>> [m,n]=size(I);
>> X2=double(I);
>> for i=1:m
for j=1:n
f=X2(i,j);
g(i,j)=0;
if(f>=s1)&(f<=s2)
g(i,j)=g2;
else
g(i,j)=g1;
end
end
end
>> subplot(1,3,3),imshow(mat2gray(g))
>>
显示效果如下:
图8灰度切分
四、心得:
本次上机难点在于概念理解很重要,开始也许我课堂没有认真的听或者听的不是很深入,似懂非懂,导致上机时不知所措。课后在寝室认真的和同学讨论,收获非浅。
这次上机,最难的是小丑除噪,我使个很多方法才有这样的处理效果,开始由于概念不是很清楚对频谱图象直接涂黑,ifft2后发现全部为黑色,没有什么效果,后来对fft2变换后的图片进行上面的处理后才探索出这种方法,虽然效果不是很好,但是很有成就感。
通过这次实习,明白上课老师讲的概念如此重要,而且要有探索精神,勇于实践。