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

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

在频率域中直接生成滤波器_第1张图片              在频率域中直接生成滤波器_第2张图片

2)n阶巴特沃斯低通滤波器,在距离滤波器中心D0处具有截止频率,传递函数为:

与理想低通滤波器不同的是,巴特沃斯低通滤波器的传递函数在D0点并没有一个尖锐的不连续,对于具有平滑传递函数的滤波器,通常将截止频率轨迹定义在H(u,v)降低为其最大值的一个指定的比例的点处。用mesh同样可以将该滤波器显示出来:

在频率域中直接生成滤波器_第3张图片                   在频率域中直接生成滤波器_第4张图片

3)高斯低通滤波器的传递函数如下:

其中,为标准差。该滤波器可以用mesh显示出来

在频率域中直接生成滤波器_第5张图片                    在频率域中直接生成滤波器_第6张图片

4)低通滤波器的例子

用高斯低通滤波器对一幅500*500的图像进行滤波,效果如下:

在频率域中直接生成滤波器_第7张图片

该例子的代码如下:

%用高斯低通滤波器进行滤波
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

 

下图显示了三个高通滤波器的透视图和图像,

在频率域中直接生成滤波器_第8张图片

代码也比较简单,

%高通滤波器的透视图和图像
 
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)给出,因此,高通滤波器偏离了傅里叶变换的原点,图像会失去大部分原始图像的亮度,变得比较黑。

在频率域中直接生成滤波器_第9张图片

代码如下:

%高斯高通滤波   
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):

在频率域中直接生成滤波器_第10张图片

最明显的就是理想高通滤波器有振铃效应,但是边缘都被增强了。除了用高频强调滤波,我发现直接在高通滤波后的图像上叠加原图也可以达到不错的效果,因为高通滤波后的图像均值接近0,所以叠加了原图像可以增强亮度和细节,而且振铃效应也没有那么强烈。如下所示:

在频率域中直接生成滤波器_第11张图片

2)结合使用高频强调滤波和直方图均衡

例子源于数字图像处理例3.8,增强一幅数字的胸部X射线图像。

在频率域中直接生成滤波器_第12张图片

上述操作的代码如下:

%联合使用高频强调滤波和直方图均衡

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);

 

你可能感兴趣的:(在频率域中直接生成滤波器)