频域低通滤波器1

匿名 (未验证) 提交于 2019-12-02 22:59:29
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013146742/article/details/52942697

在频谱中低频主要对应图像在平滑区域的总体灰度级分布,而高频对应图像的细节部分,如边缘和噪声。因此图像平滑可以通过衰减图像频谱中的高频部分来实现,这就建立了空间域图像平滑和频域低通滤波之间的对应关系。

理论基础

最容易想到的衰减高频成分方法是在一个称为‘截止频率’的位置截断所有的高频成分,将图像频谱中所有高于这一截止的频谱 成分设为0,低于截止频率的成分设为保持不变。能够达到这种效果的滤波器我们称之为理想低通滤波器。如果图像的宽度为 M,高度为N,那么理想的低通频域滤波器可以形式化的描述为

其中D0表示理想低通滤波器的截止频率,滤波器的频率域原点在频谱图像的中心处,在以截止频率为半径的圆形区域 之内的滤镜元素值全部为1,而该圆之外的滤镜元素值全部为0.理想低通滤波器的频率特性在截止频率处十分陡峭,无法用硬件实现,这也是我们称之为理想的原因,但其软件编程的模拟实现较为简单。

理想低通滤波器可以在一定程度上去除图像噪声,但由此带来的图像边缘和细节的模糊效应也比较明显,其滤波之后的处理效果比较类似于平均模板的平均平滑,实际上,理想低通滤波器是一个与频谱图像同样尺寸的二维矩阵,通过将矩阵中对应较高频率的部分设为0,较低频率的部分设为1,可在与频谱图像相乘后有效去除频谱的高频部分,其中0和1的交界处即对应滤波器的截止频率。

我们用imidealflpf 函数可以得到截止频率为freq的理想低通滤波器。代码如下

  1. function out=imidealflpf(I, freq)
  2. %imidealflpf 函数 构造理想的频域低通滤波其
  3. %I参数 输入的灰度图像
  4. %freq 低通滤波器的截止频率
  5. %返回值 out指定的理想低通滤波
  6. [M,N]=size(I);
  7. out=ones(M,N);
  8. for i=1:M
  9. for j=1:N
  10. if (sqrt(((i-M/2)^2+(j-N/2)^2))>freq)
  11. out(i,j)=0;
  12. end
  13. end
  14. end

用imfreqfilt 函数表示频率滤波的基本步骤代码如下:

  1. function out=imfreqfilt(I,ff)
  2. % imfreqfilt函数 对灰度图像进行频域滤波
  3. %参数I 输入的空域图像
  4. %参数ff 应用的与原图等大的频域滤镜
  5. if (ndims(I)==3)&&(size(I,3)==3) %RGB图像
  6. I=rgn2gray(I);
  7. end
  8. if (size(I)~=size(ff))
  9. msg1=sprintf('%s: 滤镜与原图像不等大,检查输入',mfilename);
  10. msg2=sprintf('%s: 滤波操作已经取消',mfilename);
  11. eid=sprintf('Images:%s: ImagesSizeNotEqual',mfilename);
  12. error(eid,'%s',msg1,msg2);
  13. end
  14. %快速傅里叶变换
  15. f=fft2(double(I));
  16. %移动原点
  17. s=fftshift(f);
  18. %应用滤镜及反变换
  19. out=s.*ff;%对应元素相乘实现频域滤波
  20. out=ifftshift(out);
  21. out=ifft2(out);
  22. %求模值
  23. out=abs(out);
  24. %归一化以便显示
  25. out=out/max(out(:));


 

用ditonglvbo 函数来进行图像处理代码

  1. I=imread('lena.bmp');
  2. I=rgb2gray(I);
  3. ff=imidealflpf(I,20);%生成滤镜
  4. out=imfreqfilt(I,ff);%应用滤镜
  5. figure(1);
  6. subplot(2,2,1);
  7. imshow(I);
  8. title('source');
  9. %计算FFT并显示
  10. temp=fft2(double(I));
  11. temp=fftshift(temp);
  12. temp=log(1+abs(temp));
  13. figure(2);
  14. subplot(2,2,1);
  15. imshow(temp,[]);
  16. title('source1');
  17. figure(1);
  18. subplot(2,2,2);
  19. imshow(out);
  20. title('Ideal LPF ,freq=20');
  21. %计算FFT并显示
  22. temp=fft2(out);
  23. temp=fftshift(temp);
  24. temp=log(1+abs(temp));
  25. figure(2);
  26. subplot(2,2,2);
  27. imshow(temp,[]);
  28. title('Ideal LPF ,freq=20');
  29. ff=imidealflpf(I,40);%生成滤镜
  30. out=imfreqfilt(I,ff);%应用滤镜
  31. figure(1);
  32. subplot(2,2,3);
  33. imshow(out);
  34. title('Tdeal LPF,freq=40');
  35. %计算FFT并显示
  36. temp=fft2(out);
  37. temp=fftshift(temp);
  38. temp=log(1+abs(temp));
  39. figure(2);
  40. subplot(2,2,3);
  41. imshow(temp,[]);
  42. title('Ideal LPF ,freq=40');
  43. ff=imidealflpf(I,60);%生成滤镜
  44. out=imfreqfilt(I,ff);%应用滤镜
  45. figure(1);
  46. subplot(2,2,4);
  47. imshow(out);
  48. title('Tdeal LPF,freq=60');
  49. %计算FFT并显示
  50. temp=fft2(out);
  51. temp=fftshift(temp);
  52. temp=log(1+abs(temp));
  53. figure(2);
  54. subplot(2,2,4);
  55. imshow(temp,[]);
  56. title('Ideal LPF ,freq=60');


 

效果如下:


  1. function out=imfreqfilt(I,ff)
  2. % imfreqfilt函数 对灰度图像进行频域滤波
  3. %参数I 输入的空域图像
  4. %参数ff 应用的与原图等大的频域滤镜
  5. if (ndims(I)==3)&&(size(I,3)==3) %RGB图像
  6. I=rgn2gray(I);
  7. end
  8. if (size(I)~=size(ff))
  9. msg1=sprintf('%s: 滤镜与原图像不等大,检查输入',mfilename);
  10. msg2=sprintf('%s: 滤波操作已经取消',mfilename);
  11. eid=sprintf('Images:%s: ImagesSizeNotEqual',mfilename);
  12. error(eid,'%s',msg1,msg2);
  13. end
  14. %快速傅里叶变换
  15. f=fft2(double(I));
  16. %移动原点
  17. s=fftshift(f);
  18. %应用滤镜及反变换
  19. out=s.*ff;%对应元素相乘实现频域滤波
  20. out=ifftshift(out);
  21. out=ifft2(out);
  22. %求模值
  23. out=abs(out);
  24. %归一化以便显示
  25. out=out/max(out(:));


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013146742/article/details/52942697
转载请标明出处:频域低通滤波器1
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!