频域低通滤波器(MATLAB 含代码)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013146742/article/details/52942697

在频谱中低频主要对应图像在平滑区域的总体灰度级分布,而高频对应图像的细节部分,如边缘和噪声。因此图像平滑可以通过衰减图像频谱中的高频部分来实现,这就建立了空间域图像平滑和频域低通滤波之间的对应关系。

理论基础

最容易想到的衰减高频成分方法是在一个称为‘截止频率’的位置截断所有的高频成分,将图像频谱中所有高于这一截止的频谱 成分设为0,低于截止频率的成分设为保持不变。能够达到这种效果的滤波器我们称之为理想低通滤波器。如果图像的宽度为 M,高度为N,那么理想的低通频域滤波器可以形式化的描述为

其中D0表示理想低通滤波器的截止频率,滤波器的频率域原点在频谱图像的中心处,在以截止频率为半径的圆形区域 之内的滤镜元素值全部为1,而该圆之外的滤镜元素值全部为0.理想低通滤波器的频率特性在截止频率处十分陡峭,无法用硬件实现,这也是我们称之为理想的原因,但其软件编程的模拟实现较为简单。

理想低通滤波器可以在一定程度上去除图像噪声,但由此带来的图像边缘和细节的模糊效应也比较明显,其滤波之后的处理效果比较类似于平均模板的平均平滑,实际上,理想低通滤波器是一个与频谱图像同样尺寸的二维矩阵,通过将矩阵中对应较高频率的部分设为0,较低频率的部分设为1,可在与频谱图像相乘后有效去除频谱的高频部分,其中0和1的交界处即对应滤波器的截止频率。

我们用imidealflpf 函数可以得到截止频率为freq的理想低通滤波器。代码如下

function out=imidealflpf(I, freq)
%imidealflpf 函数                       构造理想的频域低通滤波其
%I参数                                  输入的灰度图像
%freq                                   低通滤波器的截止频率
%返回值           out指定的理想低通滤波
[M,N]=size(I);
out=ones(M,N);
for i=1:M
    for j=1:N
        if (sqrt(((i-M/2)^2+(j-N/2)^2))>freq)
            out(i,j)=0;
        end
    end
end

用imfreqfilt 函数表示频率滤波的基本步骤代码如下:

function out=imfreqfilt(I,ff)
% imfreqfilt函数                对灰度图像进行频域滤波
%参数I                    输入的空域图像
%参数ff                       应用的与原图等大的频域滤镜
if (ndims(I)==3)&&(size(I,3)==3) %RGB图像
    I=rgn2gray(I);
end
if (size(I)~=size(ff))
    msg1=sprintf('%s: 滤镜与原图像不等大,检查输入',mfilename);
    msg2=sprintf('%s: 滤波操作已经取消',mfilename);
    eid=sprintf('Images:%s: ImagesSizeNotEqual',mfilename);
    error(eid,'%s',msg1,msg2);
end
%快速傅里叶变换
f=fft2(double(I));
%移动原点
s=fftshift(f);
%应用滤镜及反变换
out=s.*ff;%对应元素相乘实现频域滤波
out=ifftshift(out);
out=ifft2(out);
%求模值
out=abs(out);
%归一化以便显示
out=out/max(out(:));


 

用ditonglvbo 函数来进行图像处理代码

I=imread('lena.bmp');
I=rgb2gray(I);
ff=imidealflpf(I,20);%生成滤镜
out=imfreqfilt(I,ff);%应用滤镜
figure(1);
subplot(2,2,1);
imshow(I);
title('source');
%计算FFT并显示
temp=fft2(double(I));
temp=fftshift(temp);
temp=log(1+abs(temp));
figure(2);
subplot(2,2,1);
imshow(temp,[]);
title('source1');
figure(1);
subplot(2,2,2);
imshow(out);
title('Ideal LPF ,freq=20');
%计算FFT并显示
temp=fft2(out);
temp=fftshift(temp);
temp=log(1+abs(temp));
figure(2);
subplot(2,2,2);
imshow(temp,[]);
title('Ideal LPF ,freq=20');

ff=imidealflpf(I,40);%生成滤镜
out=imfreqfilt(I,ff);%应用滤镜
figure(1);
subplot(2,2,3);
imshow(out);
title('Tdeal LPF,freq=40');
%计算FFT并显示
temp=fft2(out);
temp=fftshift(temp);
temp=log(1+abs(temp));
figure(2);
subplot(2,2,3);
imshow(temp,[]);
title('Ideal LPF ,freq=40');

ff=imidealflpf(I,60);%生成滤镜
out=imfreqfilt(I,ff);%应用滤镜
figure(1);
subplot(2,2,4);
imshow(out);
title('Tdeal LPF,freq=60');
%计算FFT并显示
temp=fft2(out);
temp=fftshift(temp);
temp=log(1+abs(temp));
figure(2);
subplot(2,2,4);
imshow(temp,[]);
title('Ideal LPF ,freq=60');


 

效果如下:


function out=imfreqfilt(I,ff)
% imfreqfilt函数                对灰度图像进行频域滤波
%参数I                    输入的空域图像
%参数ff                       应用的与原图等大的频域滤镜
if (ndims(I)==3)&&(size(I,3)==3) %RGB图像
    I=rgn2gray(I);
end
if (size(I)~=size(ff))
    msg1=sprintf('%s: 滤镜与原图像不等大,检查输入',mfilename);
    msg2=sprintf('%s: 滤波操作已经取消',mfilename);
    eid=sprintf('Images:%s: ImagesSizeNotEqual',mfilename);
    error(eid,'%s',msg1,msg2);
end
%快速傅里叶变换
f=fft2(double(I));
%移动原点
s=fftshift(f);
%应用滤镜及反变换
out=s.*ff;%对应元素相乘实现频域滤波
out=ifftshift(out);
out=ifft2(out);
%求模值
out=abs(out);
%归一化以便显示
out=out/max(out(:));


 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页