当前位置:   article > 正文

MATLAB图像的频域低通滤波(灰度图像滤波+彩色图像滤波)_灰度图像带通滤波 matlab

灰度图像带通滤波 matlab

数字图像处理完整MATLAB代码在我的资源可以看到,为方便下载,下面是百度网盘资源:

链接:https://pan.baidu.com/s/17S7PZJwwvb3PFMFVxqEY5w 
提取码:HUAT

滤波代码:

  1. function l_f = low_filter(img,fre)
  2. %此函数用于对图像进行滤波
  3. %主要原理为在图像平移后频谱图进行圈定范围(面积)操作,面积外的设为0(滤除高频成分)
  4. %img为图像平移后频谱图,fre为圈定的频谱范围
  5. [a,b] = size(img);
  6. a0 = round(a/2);
  7. b0 = round(b/2);
  8. for i=1:a
  9. for j=1:b
  10. distance = (i-a0)^2+(j-b0)^2;
  11. if distance<fre
  12. h = 1;
  13. else
  14. h = 0;
  15. end
  16. l_f(i,j) = h*img(i,j);
  17. end
  18. end
  19. 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反变化得到滤波后的图像

下面是滤波的过程结果,左侧滑块功能为调节低通滤波器的滤波范围。

  1. global My_GUI_handles;
  2. fre=get(hObject,'Value');
  3. set(handles.text_l_f1,'String',num2str(fre));
  4. axes(My_GUI_handles.axes_dst);
  5. img_src=getimage(My_GUI_handles.axes_src);
  6. img_src=rgb2gray(img_src);%转换为灰度二维
  7. img_src1=double(img_src); %数据类型转换
  8. % % img_src2=fft2(img_src1);%快速傅里叶变换
  9. % % img_src3=fftshift(img_src2);%频谱平移
  10. % % img_src4=abs(img_src3);%计算I的幅度谱
  11. img_src2=abs(fftshift(fft2(img_src1)));
  12. imshow(log(img_src2),[]);
  13. title('图像傅里叶变换取对数所得频谱');
  14. axes(My_GUI_handles.axes_src1);
  15. [a,b] = size(img_src1);
  16. s_max = min(a/2,b/2);
  17. s_max = s_max^2;
  18. set(handles.slider_l_f1,'Max',double(s_max));
  19. img_src5= low_filter(fftshift(fft2(img_src1)),fre);
  20. imshow(log(abs(img_src5)),[]);
  21. title('低通滤波频谱');
  22. axes(My_GUI_handles.axes_dst1);
  23. new_img = uint8(real(ifft2(ifftshift(img_src5))));
  24. imshow(new_img,[]);
  25. title('低通滤波后的图像');
  26. 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单色图滤波后的频谱图。左侧滑块功能为调节低通滤波器的滤波范围。

  1. global My_GUI_handles;
  2. fre=get(hObject,'Value');
  3. set(handles.text_l_f2,'String',num2str(fre));
  4. axes(My_GUI_handles.axes_dst);
  5. img_src=getimage(My_GUI_handles.axes_src);
  6. [a,b] = size(img_src);
  7. s_max = min(a/2,b/2);
  8. s_max = s_max^2;
  9. set(handles.slider_l_f2,'Max',double(s_max));
  10. for i=1:3
  11. A=img_src(:,:,i);
  12. B=double(A);
  13. C= low_filter(fftshift(fft2(B)),fre);
  14. D = uint8(real(ifft2(ifftshift(C))));
  15. img_src(:,:,i)=D;
  16. end
  17. img_src_R= low_filter(fftshift(fft2(double(img_src(:,:,1)))),fre);
  18. imshow(log(abs(img_src_R)),[]);
  19. axes(My_GUI_handles.axes_src1);
  20. img_src_G= low_filter(fftshift(fft2(double(img_src(:,:,2)))),fre);
  21. imshow(log(abs(img_src_G)),[]);
  22. axes(My_GUI_handles.axes_dst1);
  23. imshow(img_src);
  24. set(handles.slider_l_f1,'Enable','off');

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/72572?site
推荐阅读
相关标签
  

闽ICP备14008679号