关于matlab图像滤波详解(二维傅里叶滤波)
作者:袁德波
这篇文章主要介绍了关于matlab图像滤波详解(二维傅里叶滤波),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
matlab图像滤波详解(二维傅里叶滤波)
在matlab中,图像滤波有很多中
- 比如平滑滤波(smooth()函数)
- 中值滤波medfilt2()函数)
这些相对简单,可以直接参考函数解释,不做详细解说
这里重点讲解一下傅里叶滤波,在matlab中,常用的为快速傅里叶变换。进行滤波的难点就在于如何将图像转换到频率域以及如何将频率域的图像逆变换为空间域中的图像
第一步:读取图像并对图像进行傅里叶变换
Path='images.jpg'; im=imread(Path); img=rgb2gray(im);%将彩色图变成二维灰度图图像 img2=double(img);%将数据改成double类型,方便进行数据变换 subplot(131) imshow(img); title('原始图像') f=fft2(img2);
此时,f为图像的二维频谱,但是此时的零频分量并不在中间,如果直接进行显示的话,会出现如下结果(见左图),matlab提供ffishift()函数,可以将图像零频分量移到中间
代码见下:
subplot(121) imshow(log(abs(f)+1),[]);%直接显示图像,未移动零频分量 title('未移动零频分量频谱图') subplot(122) f2=fftshift(f); imshow(log(abs(f2)+1),[]);%直接显示图像,未移动零频分量 title('移动零频分量频谱图')
这里有人肯定会疑问 log(abs(f)+1)中为什么要+1,不加也行,就是为了画图的时候,让f为零 log(abs(f)+1),不加1的话 log(abs(f))会很大,图像不好看
结果如下
第二步:滤波
滤波分为低通、高通、带通、带阻、高斯低通、高低高通滤波,其本质就是令频谱F乘以滤波器H,针对不同的滤波器,H不同
低通滤波器【D(u,v)表示点(u,v)到中心的距离】
在此我们以高斯低通滤波器为例,利用matlab设计滤波器(设D0为10)
D0=10; [M,N]=size(f2); m=floor(M/2); n=floor(N/2);%(n,m)为中心点 for i=1:M for j=1:N D=sqrt((i-m)^2+(j-n)^2); H(i,j)=exp(-1/2*D^2/D0^2); end end figure subplot(121) imshow(H); title('高斯低通滤波器')
滤波器与频谱相乘,即得到滤波后的频谱
subplot(122) f3=f2.*H; imshow(log(abs(f3)+1),[]) title('滤波后的频谱')
结果如下
第三步:傅里叶逆变换
进行逆变换时,要先将频谱移动回原位置,即通过ifftshift( )函数实现,代码如下
img3 = (ifft2(ifftshift(f3))); img4 = uint8(real(img3));%real函数表示留下复数的实部 figure subplot(121) imshow(img); title('原图'); subplot(122) imshow(img4); title('逆变换');
结果如下
这里要注意的是逆变换后的img3为复数,要删除虚数部分,并转换成uint8图像格式数据才能用imshow显示
总结
1. 其他滤波器原理只要在H函数定义部分稍微改动一下即可
2. 不必过多纠结log(abs(f3)+1)为什么取对数以及为何加1,只是单纯的为了显示更加直观
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。