在频率域中直接生成滤波器

除了之前说的从空间滤波器中获得频率域滤波器,还可以从频率域中直接生成滤波器,这些滤波器被规定为距滤波器中心点的距离不同的函数。可以创建一个用于实现频率滤波器的网格数组,最主要的是需要计算任何点到频率矩形中一个指定点的距离函数,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
        
        

  

上一篇:算法习题---5.7丑数(Uva136)


下一篇:HDU 6071 Lazy Running (最短路)