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

1,创建用于实现频域滤波器的网格数组的M函数
要在频域内生成一个滤波器,创建一个能够计算任何一点到频率矩形中指定点的距离的M函数是基础的一步。
M函数代码如下:

function [U,V]=dftuv(M,N)
u=single(0:(M-1));
v=single(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);

dftuv函数能够得到一个网格数组,利用网格数组能够得到任何一点到频率矩形中指定点的距离。

[U,V]=dftuv(8,5);
>> DSQ=U.^2+V.^2

DSQ =

  8×5 single 矩阵

     0     1     4     4     1
     1     2     5     5     2
     4     5     8     8     5
     9    10    13    13    10
    16    17    20    20    17
     9    10    13    13    10
     4     5     8     8     5
     1     2     5     5     2

>> fftshift(DSQ)

ans =

  8×5 single 矩阵

    20    17    16    17    20
    13    10     9    10    13
     8     5     4     5     8
     5     2     1     2     5
     4     1     0     1     4
     5     2     1     2     5
     8     5     4     5     8
    13    10     9    10    13

将 DSQ的ans进行dftshift后得到的就是各点相对频域中心点的距离的平方。

2,低通频域滤波器

理想低通滤波器(ILPF)的传递函数:

matlab simulink 信号均值滤波算法_高通滤波


其中D0是正数,D(u,v)是点(u,v)到滤波器中心的距离。该滤波器乘以一幅图像的傅里叶变换,显然滤波器会切断以D0为半径的圆的圆外F(u,v)分量,圆内以及圆上保持不变。但是事实上电子元件无法实现理想的低通滤波器。

常用的有,巴特沃斯低通滤波器,高斯低通滤波器等。

n阶巴特沃斯低通滤波器(BLPF)的传递函数是:

matlab simulink 信号均值滤波算法_高通滤波_02


在滤波器中心D0有截止频率,与理想滤波器的区别在于在D0出没有一个尖锐的不连接点。

高斯滤波器(GLPF)的传递函数:

matlab simulink 信号均值滤波算法_传递函数_03


定义M函数生成低通滤波器的传递函数。

function H=lpfilter(type,M,N,D0,n)
[u,v]=dftuv(M,N);
D=hypot(U,V);
switch type
    case 'ideal'
        H=single(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('unkonw filter type.')
end

运用理想低通滤波器对图像进行滤波:

>> f=imread('C:/experiment/test8.jpg');
>> [f,revertclass]=tofloat(f);
>> PQ=paddedsize(size(f));
>> D0=0.05*PQ(2);
>> H=lpfilter('ideal',PQ(1),PQ(2),D0);
>> mesh(H(1:10:540,1:10:800))
>> axis tight
>> F=fft2(f,PQ(1),PQ(2));
>> g=dftfilt(f,H);
>> g=revertclass(g);
>> figure,imshow(fftshift(H))
>> figure,imshow(log(1+abs(fftshift(F))),[])
>> figure,imshow(g)

matlab simulink 信号均值滤波算法_高通滤波_04


平滑类图像:

matlab simulink 信号均值滤波算法_传递函数_05


matlab simulink 信号均值滤波算法_低通滤波器_06


三幅原始图像各自有着不同的特点,第一幅风景图像边缘明显,第二幅沙滩图像沙滩与水面处边界明显,第三幅图想边界模糊。对三幅图像使用理想低通滤波器进行处理,三幅图像与原始图像相比都有些模糊。第一幅图象图像内容的边缘较多,图像边缘全部被模糊,而且由于选择的是理想低通滤波器,可以清楚地看到“振铃效应”。第二幅图像经过滤波后,图像水面与沙滩的边界细节也都被模糊,也存在着”振铃效应“。第三幅图像的原始图像边界模糊,经过理想低通滤波器之后,模糊程度不大,但是依然存在振铃效应。

因为存在“振铃效应”,争对这一点,再次对三幅图像进行处理,选择使用高斯滤波器。

clear all
>> f=imread('C:/experiment/test10.jpg');
f=rgb2gray(f);
[f,revertclass]=tofloat(f);
PQ=paddedsize(size(f));
D0=0.05*PQ(2);
H=lpfilter('gaussian',PQ(1),PQ(2),D0);
mesh(H(1:10:500,1:10:500))
axis tight
F=fft2(f,PQ(1),PQ(2));
g=dftfilt(f,H);
g=revertclass(g);
subplot(221),imshow(f),title('原图像');
subplot(222),imshow(fftshift(H)),title('图像形式显示滤波器');
subplot(223),imshow(log(1+abs(fftshift(F))),[]),title('原图像的谱');
 subplot(224),imshow(g),title('滤波后的图像');

matlab simulink 信号均值滤波算法_高通滤波_07


matlab simulink 信号均值滤波算法_传递函数_08


使用高斯低通滤波器,沙滩与水面的边界依旧被模糊,水面以及沙滩上的边缘细节也被模糊,与理想低通滤波器滤波之后的效果类似,区别在于 ,经过高斯低通滤波器处理过后,“振铃效应”消失了。第二幅原始图像边缘细节模糊,经过低通滤波器处理过后,与原图像差别相对与其他两幅图像来说不大,理想滤波器滤波的“振铃效应”也消失了。

显然,低通滤波器使高频分量被滤除,抑制变化快的信号(锯齿,边缘),能够起到平滑图像的作用。当使用理想低通滤波存在振铃效应和折叠误差。

二、高通频域滤波器

与低通频域滤波器模糊图像那样,高通滤波使其相反过程,会锐化图像,原理是抑制低频,保持高频。若给定的低频滤波器的传递函数H(u,v),则,相应高通滤波器的传递函数是1-H(u,v)
利用这一特性可以写出生成高通频域滤波器的M函数:

function H=hpfilter(type,M,N,D0,n)
if nargin==4
    n=1;
end
Hlp=lpfilter(type,M,N,D0,n);
H=1-Hlp;

理想高通滤波器的透视图和图像

matlab simulink 信号均值滤波算法_低通滤波器_09


对上面三幅图像使用高通滤波器处理

f=imread('C:/experiment/test9.jpg');
>> f=rgb2gray(f);
>> PQ=paddedsize(size(f));
>> D0=0.05*PQ(1);
>> H=hpfilter('ideal',PQ(1),PQ(2),D0);
>> g=dftfilt(f,H);
>> figure,imshow(g)

matlab simulink 信号均值滤波算法_传递函数_10


matlab simulink 信号均值滤波算法_高通滤波_11


matlab simulink 信号均值滤波算法_高通滤波_12


观察三幅经过理想高通滤波器的图像,第一幅沙滩与水面的分界以及沙滩,水面上的细节边缘得到锐化,清晰分明;第二幅图像经过高通滤波后,其中的石像与背景边缘明显;第三幅图像由于本身的边缘细节模糊,经过高通滤波后,低频分量全部得到抑制,得到一幅黑色图像,信息全部丢失,可以通过修改截至频域进行优化。可以看出图像中的边缘和其他灰度急转得到了增强,而消除了模糊的部分,抑制了低频分量,使图像的线条,边沿变得清晰,完成了图像锐化的目的。

三、高频强调滤波器

但是,由于高通滤波器偏离了傅里叶变换的原点,经过高通滤波后,图像都是去了大部分原始图像中呈现的灰度,这是需要进行高频强调滤波。
高频强调滤波的原理是基于原始高频滤波器传递函数的。原始高频强调滤波器的传递函数为H(u,v),则高频强调滤波的传递函数是a+bH(u,v)
通过对高通滤波器补偿一个偏移量,再有一个大于1的常数乘数来突出高频部分,来构成一个高频强调滤波器。
一个高频强调滤波器的实例:

clear all
>> f=imread('C:/experiment/test11.jpg');
>> f=rgb2gray(f);
>> 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);
>> figure,imshow(gbw)
>> figure,imshow(ghf)
>> figure,imshow(f)

matlab simulink 信号均值滤波算法_高通滤波_13


matlab simulink 信号均值滤波算法_高通滤波_14


matlab simulink 信号均值滤波算法_高通滤波_15


后两幅图像显示了对初始图像的滤波结果,所用的是一个二阶巴特沃斯滤波器,D0的值等于填充后的图像的垂直长度的0.05倍。第二幅图像是高频滤波的结果,第三幅图像是高频强调滤波的结果。一幅非零图像具有零均值的唯一方法是,该图像的某些灰度值为负,即如同第二幅图像显示结果。因此,必须在dftfilt中使用fltpoint选项来得到浮点型结果,否则会失去一些细节。

观察得知,高频滤波丢失了一些原始图像低频分量引起的灰色调,而在高频强调滤波中得以保留。图像的一些主要边缘仍然有些模糊,在高频强调滤波中,得到了改善。