数字图像处理完整MATLAB代码在我的资源可以看到,为方便下载,下面是百度网盘资源:
链接:https://pan.baidu.com/s/17S7PZJwwvb3PFMFVxqEY5w
提取码:HUAT
滤波代码:
function l_f = low_filter(img,fre)
%此函数用于对图像进行滤波
%主要原理为在图像平移后频谱图进行圈定范围(面积)操作,面积外的设为0(滤除高频成分)
%img为图像平移后频谱图,fre为圈定的频谱范围
[a,b] = size(img);
a0 = round(a/2);
b0 = round(b/2);
for i=1:a
for j=1:b
distance = (i-a0)^2+(j-b0)^2;
if distance<fre
h = 1;
else
h = 0;
end
l_f(i,j) = h*img(i,j);
end
end
end
一、灰度图像滤波
具体处理过程如下:
1.Imread函数读取图像数据
2.RGB图像转换为灰度二维图
3.调用fft2函数对灰度二维图像进行DFT处理
4.调用abs函数取得频谱采用log处理,进行灰度压缩
5.调用fftshift函数中心化处理
6.利用理想低通滤波器low_filter(现有多种低通滤波器,自己可以进行选择设计)对图像频谱进行滤波,滤除高频成分
在我看来, 这里的低通滤波器设计原理其实很简单,就是在步骤5处理后,图像频谱图的分布规律为:图像的低频信息位于图像频谱图的中心,自图像频谱图中心向外延申,图像所包含的信息的频率越高(而噪声的频率也很高),这也就可以通过保留靠近频谱图中心的部分(图像包含的低频信息),舍去远离频谱图中心的部分(高频噪声),滤除图像中的噪声。下面是圆形低通滤波器的代码,以及滤波前后的图像频谱图。
(1).步骤5处理后的图像频谱图 (2).理想低通滤波器low_filter滤除高频后的图像频谱图
7.调用ifftshift函数去中心化处理
8.对输出结果ifft2反变化得到滤波后的图像
下面是滤波的过程结果,左侧滑块功能为调节低通滤波器的滤波范围。
global My_GUI_handles;
fre=get(hObject,'Value');
set(handles.text_l_f1,'String',num2str(fre));
axes(My_GUI_handles.axes_dst);
img_src=getimage(My_GUI_handles.axes_src);
img_src=rgb2gray(img_src);%转换为灰度二维
img_src1=double(img_src); %数据类型转换
% % img_src2=fft2(img_src1);%快速傅里叶变换
% % img_src3=fftshift(img_src2);%频谱平移
% % img_src4=abs(img_src3);%计算I的幅度谱
img_src2=abs(fftshift(fft2(img_src1)));
imshow(log(img_src2),[]);
title('图像傅里叶变换取对数所得频谱');
axes(My_GUI_handles.axes_src1);
[a,b] = size(img_src1);
s_max = min(a/2,b/2);
s_max = s_max^2;
set(handles.slider_l_f1,'Max',double(s_max));
img_src5= low_filter(fftshift(fft2(img_src1)),fre);
imshow(log(abs(img_src5)),[]);
title('低通滤波频谱');
axes(My_GUI_handles.axes_dst1);
new_img = uint8(real(ifft2(ifftshift(img_src5))));
imshow(new_img,[]);
title('低通滤波后的图像');
set(handles.slider_l_f2,'Enable','off');
二、彩色图像(RGB)滤波
我们知道一般对于RGB图像频域滤波都需要先转换成灰度二维图,才能进行频域低通滤波,这也导致最终显示的图像也只能是灰度图。分析其原因可知,这是由于我们对于图像处理需要用到fft2等函数造成的。那么如何才能对RGB图像进行频域滤波后,让它显示为RGB图像呢?在参考了网上一篇北京交通大学王潇的《利用MATLAB对彩色图像进行低通滤波》的文章后,得知可以对图像的R、G、B图像分别进行上述滤波后,再将R、G、B滤波后的图合成一张显示出来,以此达到对RGB图像进行频域滤波后依然可以显示滤波后的RGB图像。具体过程如下。
1.Imread函数读取图像
2.将RGB图像拆分为R、G、B三张单色图
3.调用fft2函数对R、G、B单色图分别进行进行DFT处理
4.调用abs函数取得频谱采用log处理,进行灰度压缩
5.调用fftshift函数中心化处理
6.利用理想低通滤波器low_filter对图像频谱进行滤波,滤除高频成分
7.调用ifftshift函数去中心化处理
8.对输出结果ifft2反变化得到滤波后的R、G、B图像
9.将分别处理后的R、G、B图像合成为一幅图像,然后进行显示,得到频域滤波后的RGB图像
下面是滤波的过程结果,第一行第二列和第二行第一列分别为:R单色图滤波后的频谱图、G单色图滤波后的频谱图。左侧滑块功能为调节低通滤波器的滤波范围。
global My_GUI_handles;
fre=get(hObject,'Value');
set(handles.text_l_f2,'String',num2str(fre));
axes(My_GUI_handles.axes_dst);
img_src=getimage(My_GUI_handles.axes_src);
[a,b] = size(img_src);
s_max = min(a/2,b/2);
s_max = s_max^2;
set(handles.slider_l_f2,'Max',double(s_max));
for i=1:3
A=img_src(:,:,i);
B=double(A);
C= low_filter(fftshift(fft2(B)),fre);
D = uint8(real(ifft2(ifftshift(C))));
img_src(:,:,i)=D;
end
img_src_R= low_filter(fftshift(fft2(double(img_src(:,:,1)))),fre);
imshow(log(abs(img_src_R)),[]);
axes(My_GUI_handles.axes_src1);
img_src_G= low_filter(fftshift(fft2(double(img_src(:,:,2)))),fre);
imshow(log(abs(img_src_G)),[]);
axes(My_GUI_handles.axes_dst1);
imshow(img_src);
set(handles.slider_l_f1,'Enable','off');