for j=1:N
d=sqrt((i-m)^2+(j-n)^2); % 计算高通滤波器传递函数 if d<=d0 h=0; else h=1; end
result(i,j)=h*g(i,j); end end
result=ifftshift(result); y2=ifft2(result); y3=uint8(real(y2)); imshow(y3); end
6.7.3、通过低通滤波器
axes(handles.axes2); x=(handles.img); if isrgb(x)
msgbox('这是彩色图像,不能通过低通滤波器','失败'); else
y1=imnoise(x,'salt & pepper'); % 叠加椒盐噪声
f=double(y1); % 数据类型转换,不支持图像的无符号整型的计算 g=fft2(f); % 傅立叶变换 g=fftshift(g); % 转换数据矩阵 [M,N]=size(g);
nn=2; % 二阶巴特沃斯(Butterworth)低通滤波器 d0=10; %截止频率为10 m=fix(M/2); n=fix(N/2); for i=1:M
for j=1:N
d=sqrt((i-m)^2+(j-n)^2);
h=1/(1+0.414*(d/d0)^(2*nn));% 计算低通滤波器传递函数 result(i,j)=h*g(i,j); end end
result=ifftshift(result); y2=ifft2(result); y3=uint8(real(y2));
imshow(y3); % 显示滤波处理后的图像 end
13
6.8、 灰度图像处理 6.8.1、二值图像
用j=im2bw(x);来对灰度图像到二值图像的转换。转换结果为:
6.8.2、创建索引图像
用X = grayslice(I,n)函数来实现,转换后得到的图像为:
6.9、 颜色模型转换
下面是RGB颜色模型到HSV模型的转换程序:
axes(handles.axes2);
x=(handles.img); if isrgb(x)
HSV=rgb2hsv(x); imshow(HSV); else
msgbox('这是灰度图像,不能转换','转换失败');
end
转换后的结果为:
14
同样的,转化为ntsc和ycbcr模型,只要改为相应的函数即可。函数如下: rgb2ntsc(x);% rgb模型转ntsc模型 rgb2ycbcr(x);% rgb模型转ycbcr模型 6.10、 操作界面设计
为了使整个操作界面更加的美观,对背景颜色和字体颜色进行设置。
七、 程序调试及结果分析
在程序设计过程中,碰到很多的问题。
1、 一个函数只能对灰度图像处理,不能对RGB图像处理,那么如何才
能对RGB图像处理呢?
这主要是对MATLAB函数的不够清楚,用到的很多函数是针对二维数据的,而RGB图像的数据是一个三维矩阵,所以处理要与灰度图像不同,在开始的时候,我认为应该找一个能够应用于三维矩阵的函数,结果却没找到,后来想到可以把三维数据进行降维处理,同样使用二维的函数,只要是同样处理三次。比如,彩色图像的滤波处理,直方图均衡等。
2、 同一个操作对灰度图像可以使用,当用户选择的是彩色图像时,该操
作就会出错?
这是由于设计程序时,本身程序是有针对性的,有些程序只能对灰度图像有效,有些对彩色图像有效,但是用户并不清楚这些,所以在设计的过程中就要考虑全面,要分开设计。在本次课程设计中,我均对每个程序的开始时,用if isrgb(x)进行判断。
3、 在没有加入噪声的情况下,点击“中值滤波”或是其它滤波,会提示
错误?
这是由于在滤波程序设计的过程中,开始用到的变量是handles.noise_img,而这个变量是在加入噪声时候才定义的,所以在没有加入噪声的情况下,点击各个滤波就会弹出变量没有定义的错误,解决方法就是在文件打开的时候就给定义handles.noise_img=x。
4、 本次设计存在一个比较大的问题,就是每次操作都是独立的,比如:
要对图像加入噪声,然后在此基础上进行亮度调整,截图,频谱分析等等就不行。
我认为应该是整个程序设计过程中对变量的设置没有做好,应该每次操作后,把处理后的数据保存在一个全局变量,这样还要对处理后的数据进行在处理时,只要把这个全局变量作为原始数据带入就可。
15
八、 心得体会
1、在这次课程设计过程中,感触很深,由于对MATLAB图像处理的函数不熟悉,导致自己走了很多的弯路,比如在设计图像左转90度和右转90度时,由于开始并不知道imrotate函数,只知道上下翻转flipud和左右翻转fliplr函数,想着要怎么用这两个函数来实现左转和右转呢,如果当当只用矩阵转置的话,并不能达到要求,后来想可以结合flipud和fliplr函数来实现,下面程序是实现左转90度: axes(handles.axes2); x=(handles.img);
if isrgb(handles.img) a=x(:,:,1); b=x(:,:,2); c=x(:,:,3); e=a'; g=b'; f=c';
y(:,:,1)=e; y(:,:,2)=g; y(:,:,3)=f;
axes(handles.axes2); for k=1:3
f(:,:,k)=flipud(y(:,:,k)); end imshow(f); else m=x'; y=flipud(m); imshow(y); end
同理,也可以通过转置和fliplr函数实现右转90度。
但是后来发现其实只要用imrotate函数就可以解决问题。通过这次经历后,后来在设计其它程序时,尽量找MATLAB自带的现成函数,而不是一碰到问题就自己想算法,这样可以节省较多的时间。
2、在理工科的专业应用背景下,用matlab 进行相关计算与仿真编程的优势非常突出。特定的问题处理算法,我们通常都以M文件的文本形式给定最终的解决方案,自己设计的程序是在MATLAB环境下,用MATLAB语言编写的,这对于有安装MATLAB软件的计算机上运行并不存在什么问题,关键是一般的计算机很少有去安装MATLAB软件的,那么要在这些机子上运行该程序要怎么办呢,难道要先安装MATLAB软件,这显然太麻烦了,对于一个通用的,比较成熟的解决方案,我们当然期望它能应用到更多的场合,而.exe (可执行)文件可运行于所有的通用WINDOWS操作系统,为此,将M文件转换成.exe文件倒是个不错的想法。
通过查找资料,了解到在生成可执行性文件之前,需要进行一系列编译环境方面的配置:
16