基于频率域的平滑滤波论文Word格式文档下载.docx
《基于频率域的平滑滤波论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于频率域的平滑滤波论文Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
1,
0,
>
0是一个正常数,
是频率域中点
与频率矩形中心的距离,即
2
1/2(*)
其中,与以前一样,P和Q是
和
填充后的尺寸。
图4.40(a)显示了
的透视图,图4.40(b)显示了以图像显示的滤波器。
理想这一名称表明在半径
0的圆内,所有频率无衰减地通过,而在此圆之外的所有频率则完全被衰减。
理想低通滤波器是关于原点径向对称的,这意味着该滤波器完全由一个径向横截面来定义,如图4.40(c)所示。
将该横截面旋转360o得到二维滤波器。
3.2布特沃斯低通滤波器
截止频率位于距原点
0处的n阶布特沃斯低通滤波器(BLPF)的传递函数定义为
由(*)式给出。
图4.44显示了该BLPF函数的透视图、图像显示和径向剖面图。
3.3高斯低通滤波器
二维高斯滤波器的形式由下式给出:
是距频率矩形中心的距离。
是关于中心的扩展度的度量。
通过令
=
,我们可以使用其他滤波器的表示法来表示该滤波器:
是截止频率。
当
时,GLPF下降到其最大值的0.607处。
四.Matlab实现:
4.1理想低通滤波matlab实现:
函数程序:
理想低通滤波器(以D0=5为例)
•I1=imread(‘D:
\Matlab\project\低通、高通滤波实验原图.jpg’);
•imshow(I1);
title('
原图‘);
•s=fftshift(fft2(I1));
•[M,N]=size(s);
%分别返回s的行数到M中,列数到N中
•n1=floor(M/2);
%对M/2进行取整
•n2=floor(N/2);
%对N/2进行取整
•%ILPF滤波,d0=5,15,30(程序中以d0=5为例)
•d0=5;
%初始化d0
•fori=1:
M
•forj=1:
N
•d=sqrt((i-n1)^2+(j-n2)^2);
%点(i,j)到傅立叶变换中心的距离
•ifd<
=d0%点(i,j)在通带内的情况
•h=1;
%通带变换函数
•else%点(i,j)在阻带内的情况
•h=0;
%阻带变换函数
•end
•s(i,j)=h*s(i,j);
%ILPF滤波后的频域表示
•end
•s=ifftshift(s);
•%对s进行反FFT移动%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
•s=uint8(real(ifft2(s)));
•figure;
%创建图形图像对象
•Imshow(s);
%显示ILPF滤波后的图像
•title(‘ILPF滤波(d0=5)‘)
4.2布特沃斯低通滤波matlab实现
函数程序:
巴特沃斯低通滤波:
(以D0=5为例)
•I1=imread('
D:
\Matlab\project\低通、高通滤波实验原图.jpg'
);
title('
原图'
•n=2;
%对n赋初值
•%BLPF滤波,d0=5,15,30,80(程序中以d0=15为例)
%初始化d0
•n2=floor(N/2);
•h=1/(1+(d/d0)^(2*n));
%BLPF滤波函数
%BLPF滤波后的频域表示
%对s进行反FFT移动
•%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数
•s=uint8(real(ifft2(s)));
•imshow(s);
%显示BLPF滤波处理后的图像
•title('
BLPF滤波(d0=5)'
4.3高斯低通滤波matlab实现
函数程序如下:
高斯低通滤波器:
•imshow(I1);
•[M,N]=size(s);
•%GLPF滤波,d0=5,15,30(程序中以d0=30为例)
M
•h=1*exp(-1/2*(d^2/d0^2));
%GLPF滤波函数
%GLPF滤波后的频域表示
•figure;
•imshow(s);
%显示GLPF滤波处理后的图像
GLPF滤波(d0=5)'
5.GUI
基于数字信号处理原理,在数字滤波器设计理论和Matlab编程技术及其GUI图形用户界面设计的基础上,开发了具有交互式特点的数字图像处理GUI软件,界面操作简单方便。
MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。
它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。
根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
MATLAB中集成了功能强大的图像处理工具箱。
由于MATLAB语言的语法特征与C语言极为相似,而且更加简单、更加符合科技人员对数学表达式的书写格式,而且可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。
一、设计基本原理
图形用于界面(GUI)是提供人机交互的工具和方法。
GUI是包含图形对象(如窗口、图标、菜单和文本)的用户界面。
MATLAB的GUI为开发者提供了一个不脱离MATLAB的开发环境,有助于MATLAB程序的GUI集成。
在MATLAB中的GUIDE就是图形用户界面开发环境(GraphicalUserInterfaceDevelopmentEnvironment),它向用户提供了一系列的创建用户图形界面的工具。
这些工具大大简化了GUI设计和生成的过程。
(一)、GUIDE操作界面的使用方法
下面对GUIDE的操作界面及使用方法做一简单介绍。
在命令窗口中直接键入guide,启动GUIDE,利用GUIDE模板创建GUI,或者打开已经存在的GUI,GUIDE把GUI设计的内容保存在两个文件中,它们在第一次保存或运行时生成。
一个是FIG文件,扩展名为.Fig,它包含对GUI和GUI组件的完整描述;
另外一个是M文件,扩展名为.M,它包含控制GUI的代码和组件的回调事件代码。
这两个文件与GUI显示和编程任务相对应。
在版面设计器中创建GUI时,内容保存在FIG文件中;
对GUI编程时,内容保存在M文件中。
用GUIDE版面设计器,根据设计需要:
首先拖拽两个图形窗口(Axes),一个作为待处理图片区域,另一个作为已处理图片区域;
其次,拖拽五个电子按钮(RadioButton),作为边缘检测操作按钮;
第三,拖拽五个按钮(PushButton),作为输入等的按钮;
最后,将上面的所有按钮及图形窗口合理的布局,达到美观工整的效果,然后运行一下GUI,系统会自动生成GUI文件。
信息化社会中,计算机在各种信息处理中发挥着重要的作用。
我们可以借助计算机,对数字图像进行处理,以达到不同的效果。
根据题目的要求,除了实现要求的功能外,还有很多的功能需要用到。
(1)、将一个RGB图像转换为灰度图像。
(2)、可以对图像做各种变换,如旋转等。
(3)、有时并不需要图像显示其细节部分,只要其轮廓,这时候不要很高的灰度级。
可以把图像转换为二值图像,进行图像腐蚀,或是创建索引图像等。
(4)、分析一个图像的频谱特征,利用傅里叶变换,将图像从空间域变换到频域,然后进行各种处理,经过高通滤波器或是低通滤波器。
(5)、为了科学地定量描述和使用颜色,人们提出了各种颜色模型,按用途可分为三类:
计算颜色模型,视觉颜色模型和工业颜色模型。
有时为了不同的需要要对颜色模型进行转换。
二、GUI程序总体设计
(一)MATLABGUI程序要实现的功能:
①将一个RGB图像转换为灰度图像。
②可以对图像做各种变换,如旋转等。
③可以对图像进行任意的亮度和对比度调整,显示和对比变换前后的图像。
④通过最近邻插值和双线性插值算法,将用户所选取的图像区域,进行放大和缩小整数倍,并保存,比较几种插值的效果。
⑤对颜色模型进行转换。
为了科学地定量描述和使用颜色,人们提出了各种颜色模型,按用途可分为三类:
计算颜色模型,视觉颜色模型和工业颜色模型。
有时为了不同的需要,要对颜色模型进行转换。
三、具体设计与实现
3.1、文件操作
3.1.1、打开
为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件,所以设置这里的缺省后缀名为“.bmp”。
Uigetfile函数的调用格式为[name,path]=yigetfile(…),在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“name”和“path”中。
如果按下取消按钮或是发生错误,则返回值是0。
根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.img。
3.1.2、保存
同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。
3.1.3、退出
退出比较简单,程序如下所示:
clc;
closeall;
close(gcf);
3.2、编辑
3.2.1、灰度
由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示灰度图像,把三维图像降为二维,可以只取其中的二维数据,实现方法程序为:
y=(handles.img(:
:
1));
%当然也可以选择(:
2)或(:
3)imshow(y);
但是这样的话,根据程序所选的不同,图像数据也不同,显示也就不一样。
另一种方法就是,运用rgb2gray函数实现彩色图像到灰度图像的转换。
程序为:
y=rgb2gray(handles.img);
imshow(y);
这个程序只能用于RGB图像转换灰度图像,当原始图像本来就是灰度图像时,运行该程序时就会出错,但是使用者在使用时有时并不知道这些,为了使该程序更加完善,应该在使用者原先图像时灰度图像时使用该功能时,应该要显示提示类信息。
所以在开始时应该要有一个RGB图像或是灰度图像的判断过程。
完整的程序如下:
ifisrgb(handles.img)
y=rgb2gray(handles.img);
imshow(y);
else
msgbox('
这已经是灰度图像'
'
转换失败'
end
3.2.2、亮度
用imadjust函数,其调用格式如下:
g=imadust(f,[low_inhigh_in],[low_outhigh_out]),gamma)gamma表示映射性质,默认值是1表示线性映射。
由于该函数有五个参数需要输入,为了方便用户改变,所以这里设计一个输入对话框,用户通过对话框把五个参数赋值给[low_inhigh_in],[low_outhigh_out],gamma这五个参数,如下一组命令建立了如图所示的输入对话框:
prompt={'
输入参数1'
输入参数2'
输入gamma'
};
defans={'
[00.7]'
[01]'
1'
p=inputdlg(prompt,'
输入参数'
1,defans);
但是,这种方法并不能很好的让用户能够对图像进行任意的亮度和对比度变化调整,有时并不事先知道参数的值要多少,也不关心,而是任意调节的,直到满意为止。
所以应该用滑动条来调节图像的亮度和对比度,这样更适合用户的使用习惯。
由于imadjust函数有五个参数,所以原则上需要设计五个滑动条来调节对比度,这对用户来说显然比较麻烦,因此在设计的时候固定其中的三个参数,通过调节两个参数的值来改变亮度和对比度。
[0handles.beta],[01],handles.gm,这里的变量handles.beta和handles.gm就通过滑动条得到,
亮度调整的tag名为ld,取值范围0~1,gamma值的tag名为gamma,取值范围为0~5。
获取滑动条参数的程序如下:
handles.beta=get(handles.ld,'
value'
handles.gm=get(handles.gamma,'
:
3.2.3、截图
在MATLAB中,用函数imcrop实现对图像的剪切操作。
该操作剪切的是图像中的一个矩形子图,用户可以通过参数指定这个矩形四个顶点的坐标,也可以交互地用鼠标选取这个矩形。
Imcrop函数的调用格式如下:
y=imcrop(handles.img);
不管handles.img是三维的还是二维数据,该函数都能进行操作。
3.2.4、缩放
在MATLAB中,用函数imresize来实现对图像的放大或缩小。
插值方法可选用三种方法,最近邻插值,双线性插值,双三次插值。
该函数的调用格式如下:
B=imresize(A,m,method)其中:
参数method用于指定插值的方法,可选的值为“nearest”(最近邻法),“bilinear”(双线性插值)、“bicubic”(双三次插值),缺省值为“nearest”。
B=imresizee(A.m,method)表示返回原图A的m倍放大图像(m小于1时实际上是缩小);
参数值保持默认设置:
虽然处理后看不出放大的效果,这是由于坐标轴限制的原因,如果把处理后的图片保存起来,再把处理后的文件打开,就可以看到比较明显的放大效果。
3.3、旋转
3.3.1、上下翻转函数flipud是实现一个二维矩阵的上下翻转,如a=[12;
34],经过该函数处理后,原矩阵变为[34;
12];
所以利用该函数也可以对图像进行上下翻转处理,但由于该函数针对二维数据的处理,所以在写程序时,要对RGB图像和灰度图像分开处理,这就要用到isrgb函数来判断,如果是灰度图像,则可以直接用这个函数进行处理,否则就要对RGB图像进行降维处理,
fork=1:
3
y(:
k)=flipud(x(:
k));
3.3.2、左右翻转
对图像的左右翻转也可以用fliplr函数来处理,同样的,也要对灰度和彩色图像分开处理。
3.3.3、任意角度翻转
用函数imrotate来实现对图像的插值旋转。
B=imrotate(A,angle,method,’crop’)其中,参数method用于指定插值的方法,可选的值可以有三种,分别为邻近插值,双线性插值,双三次插值,缺省时为邻近插值,参数angle代表旋转的角度。
一般来说,旋转后的图像会比原图大,用户可以指定“crop”参数对旋转后的图像进行剪切(取图像的中间部分),使返回的图像与原图大小相同。
执行结果为:
3.4、加入噪声
经常用到的噪声有三种,高斯噪声,椒盐噪声,乘性噪声,可以通过以下三个函数来实现:
y=imnoise(handles.img,'
gaussian'
p1,p2);
%高斯噪声
y=imnoise(x,'
salt&
pepper'
p1);
%椒盐噪声y=imnoise(handles.img,'
speckle'
%乘性噪声
p1,p2的参数也通过输入对话框的形式得到,原图加入高斯噪声后结果如下所示:
3.5、滤波
这里选择三种滤波方法,k=medfilt2(handles.noise_img);
%中值滤波k=wiener2(handles.noise_img,[5,5]);
%自适应滤波k=filter2(fspecial('
average'
3),handles.noise_img)/255;
%平滑滤波
同样的,这些函数也是针对二维数据,所以要先判断是彩色图像还是灰度图像,然后分别进行处理,下面是对彩色图像的自适应滤波处理:
i=handles.noise_img;
if
isrgb(i)
a=handles.noise_img(:
1);
b=handles.noise_img(:
2);
c=handles.noise_img(:
3);
k(:
1)=wiener2(a,[5,5]);
2)=wiener2(b,[5,5]);
3)=wiener2(c,[5,5]);
imshow(k);
对其他方法的滤波程序也类似,由于把各个滤波方法放在一个选择框里,所以程序要用以下的选择语句:
switchstrcase'
中值滤波'
case'
自适应滤波'
平滑滤波'
end
3.6、直方图统计
用imhist函数对图像数据进行直方图统计,x=imhist(handles.img(:
bar(horz,x);
其中,x矩阵的数据是0~255灰度值的统计个数,如果直接对x矩阵数据进行图形图显示,由于有256个数据,在坐标系中就会很密集,为了更清楚的显示条形图,所以在程序设计时,把x数据进行部分提取,x1=x(1:
10:
256);
horz=1:
256;
bar(horz,x1);
除了显示数据的直方图统计外,还可以对图像进行均衡处理,所用到的函数是histeq,这两个函数同样只使用于二维数据,所以也要对二维和三维数据分开处理。
直方图显示和均衡后的图像分别如下图所示
12
3.7、频谱分析
3.7.1、频谱图为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC组件移到光谱中心。
这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。
如下图所示:
3.7.2、通过高通滤波器axes(handles.axes2);
x=(handles.img);
ifisrgb(x)msgbox('
这是彩色图像,不能通过高通滤波器'
失败'
elsey1=imnoise(x,'
%加高斯噪声f=double(y1);
%数据类型转换k=fft2(f);
%傅立叶变换g=fftshift(k);
%转换数据矩阵[M,N]=size(g);
nn=2;
d0=3;
%截止频率为3m=fix(M/2);
n=fix(N/2);
fori=1:
Mforj=1:
Nd=sqrt((i-m)^2+(j-n)^2);
%计算高通滤波器传递函数ifd<
=d0h=0;
13
elseh=1;
endresult(i,j)=h*g(i,j);
endendresult=ifftshift(result);
y2=ifft2(result);
y3=uint8(real(y2));
imshow(y3);
end3.7.3、通过低通滤波器axes(handles.axes2