除了之前说的从空间滤波器中获得频率域滤波器,还可以从频率域中直接生成滤波器,这些滤波器被规定为距滤波器中心点的距离不同的函数。可以创建一个用于实现频率滤波器的网格数组,最主要的是需要计算任何点到频率矩形中一个指定点的距离函数,FFT(快速傅里叶)算法是假设变换的原点位于频率矩形的左上角,因此需要将原点平移到频率矩形的中心,用fftshift。网格数组如下:
%(频域滤波函数) 提供了距离计算及其所需的网格数组 function [U,V] = dftuv(M,N) u=0:(M-1); v=0:(N-1); idx = find(u>M/2); u(idx) = u(idx)-M; idy=find(v>N/2); v(idy)=v(idy)- N; [V,U] = meshgrid(v,u); end
一、低通(平滑)频率域滤波器
常见的频率域低通滤波器有三个,理想低通滤波器(ILPF),巴特沃斯低通滤波器(BLPF),高斯低通滤波器(GLPF)。
1)理想低通滤波器的传递函数如下:
其中,D0为正数,D(u,v)为点(u,v)到滤波器中心的距离,满足D(u,v)=D0的点的轨迹为一个圆。如果用滤波器乘以一幅图像的傅里叶变换,我们会看到一个理想滤波器会切断(乘以0)该圆之外的所有F(u,v)分量,而保留圆上和圆内的所有分量不变(乘以1)。
可以用之前的mesh将滤波器显示出来:
2)n阶巴特沃斯低通滤波器,在距离滤波器中心D0处具有截止频率,传递函数为:
与理想低通滤波器不同的是,巴特沃斯低通滤波器的传递函数在D0点并没有一个尖锐的不连续,对于具有平滑传递函数的滤波器,通常将截止频率轨迹定义在H(u,v)降低为其最大值的一个指定的比例的点处。用mesh同样可以将该滤波器显示出来:
3)高斯低通滤波器的传递函数如下:
其中,为标准差。该滤波器可以用mesh显示出来
4)低通滤波器的例子
用高斯低通滤波器对一幅500*500的图像进行滤波,效果如下:
该例子的代码如下:
%用高斯低通滤波器进行滤波 f=imread('G:\数字图像处理(冈萨雷斯)\DIP3E_CH04_Original_Images\DIP3E_Original_Images_CH04\Fig0441(a)(characters_test_pattern).tif'); subplot(221);imshow(f); title('原图') f = im2double(f); %[f,revertclass] = tofloat(f); PQ = paddedsize(size(f)); [U,V] = dftuv(PQ(1),PQ(2)); D = hypot(U,V); D0 = 0.05*PQ(2); F = fft2(f,PQ(1),PQ(2)); H = exp(-(D.^2)/(2*(D0^2))); g = dftfilt(f,H); g = im2uint8(g); %g = revertclass(g); subplot(222);imshow(fftshift(H)); title('高斯低通滤波器图像'); %显示滤波器图像 subplot(223);imshow(log(1+abs(fftshift(F))),[]);title('滤波器的谱'); subplot(224);imshow(g);title('滤波器后的图像')
各种滤波器的传递函数不同,但是滤波的过程是一样的,因此,可以将这几种滤波器封装成一个函数,如下:
%频率域低通滤波函数,生成几个低通滤波器的传递函数 function [H,D] = lpfilter(type,M,N,D0,n) [U,V] = dftuv(M,N); D = sqrt(U.^2+V.^2); switch type case 'ideal' H=double(D<=D0); case 'btw' if nargin ==4 n=1; end H=1./(1+(D./D0).^(2*n)); case 'gaussian' H=exp(-(D.^2)./(2*(D0^2))); otherwise error('unkown filter type'); end
二、高通(锐化)频率域滤波器
就像低通滤波模糊一幅图像那样,高通滤波是相反的过程,会锐化图像,其原理是衰减傅里叶变换的低频部分而保持高频部分相对不变。若给定低通滤波器的传递函数Hlp(u,v),则相应高通滤波器的传递函数为:
与低通滤波器相对应的高通滤波器的传递函数如下:
基于前面的公式,可以使用前面的函数lpfilter来构建一个生成高通滤波器的函数,如下所示:
%生成高通滤波器的函数 function H = hpfilter(type,M,N,D0,n) if nargin ==4 n=1; end Hlp = lpfilter(type,M,N,D0,n); H = 1-Hlp; end
下图显示了三个高通滤波器的透视图和图像,
代码也比较简单,
%高通滤波器的透视图和图像 H1 = fftshift(hpfilter('ideal',500,500,50)); %理想高通滤波器 H2 = fftshift(hpfilter('btw',500,500,50)); %巴特沃斯高通滤波器 H3 = fftshift(hpfilter('gaussian',500,500,50)); %高斯高通滤波器 subplot(231);mesh(double(H1(1:10:500,1:10:500)));title('理想高通滤波器') ; %线框图 colormap([0 0 0]); %黑色 axis off subplot(232);mesh(double(H2(1:10:500,1:10:500)));title('巴特沃斯高通滤波器') ; %线框图 colormap([0 0 0]); %黑色 axis off subplot(233);mesh(double(H3(1:10:500,1:10:500)));title('高斯高通滤波器') ; %线框图 colormap([0 0 0]); %黑色 axis off subplot(234);imshow(H1,[]); title('理想高通滤波器'); %高通滤波器对应的图像 subplot(235);imshow(H2,[]); title('巴特沃斯高通滤波器'); subplot(236);imshow(H3,[]); title('高斯高通滤波器');
1)高通滤波例子
高通滤波时,图像的边缘和其他灰度变化剧烈的地方得到了增强,但由于图像的平均值由F(0,0)给出,因此,高通滤波器偏离了傅里叶变换的原点,图像会失去大部分原始图像的亮度,变得比较黑。
代码如下:
%高斯高通滤波 f=imread('G:\数字图像处理(冈萨雷斯)\DIP3E_CH04_Original_Images\DIP3E_Original_Images_CH04\Fig0441(a)(characters_test_pattern).tif'); PQ = paddedsize(size(f)); %补0填充 D0 = 0.05*PQ(1); %截止频率 H1 = hpfilter('ideal',PQ(1),PQ(2),D0); %理想高通滤波器 H2 = hpfilter('btw',PQ(1),PQ(2),D0); %巴特沃斯高通滤波器 H3 = hpfilter('gaussian',PQ(1),PQ(2),D0); %高斯高通滤波器 %H = 1+1.5*H; g1 = dftfilt(f,H1); %滤波 g2 = dftfilt(f,H2); g3 = dftfilt(f,H3); subplot(221);imshow(f);title('原图'); %g = g+f; subplot(222);imshow(g1);title('理想高通滤波'); subplot(223);imshow(g2);title('巴特沃斯高通滤波'); subplot(224);imshow(g3);title('高斯高通滤波');
高通滤波器偏离了直流项,因此将图像的平均值降低为0 。解决的方法之一是给高通滤波器加一个偏移量,如果把偏移量与将滤波器乘以一个大于1的常数结合起来,那么这种方法就称为高频强调滤波。高频强调滤波比较麻烦的地方就是ab参数需要根据实际情况进行不断尝试才会发现比较合适的参数。其传递函数为:
a是偏移量,b是乘数。
经过高频强调滤波后的结果如下,将原来的高通滤波器都改成相应的高频强调滤波器(a=1,b=1.5):
最明显的就是理想高通滤波器有振铃效应,但是边缘都被增强了。除了用高频强调滤波,我发现直接在高通滤波后的图像上叠加原图也可以达到不错的效果,因为高通滤波后的图像均值接近0,所以叠加了原图像可以增强亮度和细节,而且振铃效应也没有那么强烈。如下所示:
2)结合使用高频强调滤波和直方图均衡
例子源于数字图像处理例3.8,增强一幅数字的胸部X射线图像。
上述操作的代码如下:
%联合使用高频强调滤波和直方图均衡 f=imread('G:\数字图像处理(冈萨雷斯)\DIP3E_CH04_Original_Images\DIP3E_Original_Images_CH04\Fig0459(a)(orig_chest_xray).tif'); PQ = paddedsize(size(f)); %获取填充范围 D0 = 0.05*PQ(1); %截止频率 HBW = hpfilter('btw',PQ(1),PQ(2),D0,2); %二阶巴特沃斯高通滤波器 H = 0.5+2*HBW; %高频强调滤波,比直接的高通滤波准确 gbw = dftfilt(f,HBW,'fltpoint'); gbw = gscale(gbw); ghf = dftfilt(f,H,'fltpoint'); %滤波 ghf = gscale(ghf); %该函数考虑的负值,可以保留细节 ghe = histeq(ghf,256); %直方图均衡化(由较窄灰度级范围内的灰度表征的图像是直方图均衡的理想选择) subplot(221); imshow(f);title('原图'); subplot(222); imshow(gbw);title('高通滤波后'); subplot(223); imshow(ghf);title('高频强调滤波后'); subplot(224); imshow(ghe,[]);title('高频后再直方图均衡化后'); % figure;imhist(ghf);