基于MATLAB的图像处理的课程设计论文 下载本文

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