数字图像处理中不同的低通滤波器的区别以及cut-off frequency 对于图像的影响

本文介绍了图像处理中常用的低通滤波器类型及其原理,包括理想低通滤波器、Butterworth低通滤波器和高斯低通滤波器,并探讨了不同滤波器在图像处理中的应用效果。

首先要清楚的概念是,图像(假设是灰度图,便于描述,或者是单个channel的图)在时域和频域中的分别是什么含义。在时域中,很显然,对应的是每个像素,每个像素上的点的灰度值。 如果该图像用matlab显示的话,(x,y)代表图中的每个像素,每个像素对应Z的值就是该图像在这个像素点的灰度。那么在频域中,也就是如果我对这个矩阵进行傅里叶变换,我们得到的该图像在频域中的表达。 图像在频域中,是该图像的颜色变化的剧烈程度。低频部分表示那些颜色变化不是很剧烈的部分,而高频部分则是那些颜色变化剧烈的部分。举个例子,如果我们有一副海洋和沙滩的图,沙滩上可能有些人以及其他的东西。 那么,我们可以发现,图像中,低频部分所关联的就是颜色变化平滑的,或者说不太变化的,如大片的沙滩以及海洋。而高频部分则关联的是颜色变化剧烈的部分,如海洋和沙滩交接的部分,或者其他颜色变化剧烈的东西,一般高频部分所关联的是两个颜色的相交接的部分,而这一般都发生在两个不同物体的轮廓上,所以,如果我们只取特定高频的部分,那我们就能得到物体的轮廓了(本文主要讲解低通滤波器,所以涉及的基本都是低频部分,高频部分会在其他博文中阐述)。

好了,现在我们对于图像的傅里叶变化有了一个大概的认识。那么我们来说说为什么在图像处理时,要使用低通滤波器呢。出于某些目的,我们希望我们的图像不那么清晰,即去除噪点或者不要有那么多的细节(比如,美图秀秀中磨皮。。。 我们不希望皮肤上的毛孔都出现在图像上,但现在的手机像素都很高,所以如果不做处理,那么脸上就会有很多细节都展现在图片上,如痘印啊,粗大的毛孔等)。那么这个时候,我们就需要使用低通滤波器了,即把那些高频的细节都过滤掉,留下的就只有平滑的皮肤了。

接下来,在来看看低通滤波器的种类。低通滤波器的种类有很多,比较常接触的大概是以下几类:

(1)理想的低通滤波器

   以上是二维中,低通滤波器的公式。其实很好理解,一维中的低通滤波器就是一个窗口函数,在D0的时候,直接从1变成0. 那么二维中的低通滤波器就是讲一维中的低通滤波器绕着y轴旋转一周,所得到的圆柱就是二维中低通滤波器的样子。而绕的点一般是图像的中心(P,Q代表了图像的横纵像素点的个数)。而D0 代表了截止频率。matlab中自己构造理想低通滤波器的话,代码应该如下所示:

  1. lowPF = zeros(p,Q);  
  2.   
  3. for i = 1:P  
  4.     for j =1:Q  
  5.         if((i-P/2)^2+(j-Q/2)^2 <=D0^2)  
  6.             lowPF(i,j) = 1;  
  7.         end  
  8.               
  9.     end  
  10. end  
  11.   
  12. figure;  
  13. title('low_pass_filter_cf=D0');  
  14. imshow(lowPF,[]);  
lowPF = zeros(p,Q);

for i = 1:P
    for j =1:Q
        if((i-P/2)^2+(j-Q/2)^2 <=D0^2)
            lowPF(i,j) = 1;
        end
            
    end
end

figure;
title('low_pass_filter_cf=D0');
imshow(lowPF,[]);
而得到的图像应该是这样的:


由于理想滤波器的傅里叶反变换的是二维的sinc函数,即将一维的sinc函数绕着y轴旋转一周(就像水波浪漾开那样),所以当用这种滤波器处理图像时,在边缘变化剧烈的地方会产生ringing。

然而正如它的名字一样,它是理想低通滤波器,在实际使用中,我们不会使用这种滤波器,原因有二:首先是在实际上来说,不可能产生瞬时的阶跃,即在D0位置,我们不可能能马上从1跳到0.二是因为理想滤波器所得到的图片ringing现象很严重(后文会有详细说明)

(2)Butterworth 低通滤波器


以上是Butterworth滤波器的公式,相比于理想滤波器,它的阶跃部分更加圆滑,而幂系数n可以改变滤波器的形状,n越大,则该滤波器越接近于理想滤波器。以下为该滤波器的侧面图,以及用图像显示的图。


上图为n取1-4所得到的butterworth函数傅里叶反变换所得到的函数的侧视图,我们可以看到n越小,晕越少。

与理想滤波器相比,Butterworth函数的傅里叶反变换所产生的晕比理想滤波器更平滑,所以该滤波器形成的图片的ringing更少,且容易实现。以下是该滤波器的matlab代码

  1. lowPF = zeros(P,Q);  
  2. n=1;  
  3.   
  4. for i = 1:P  
  5.     for j =1:Q  
  6.         
  7.             lowPF(i,j) = 1/(1+((i-P/2)^2+(j-Q/2)^2)^0.5/D0)^(2*n);  
  8.     
  9.               
  10.     end  
  11. end  
  12.   
  13. figure;  
  14.   
  15. imshow(lowPF,[]);  
lowPF = zeros(P,Q);
n=1;

for i = 1:P
    for j =1:Q
      
            lowPF(i,j) = 1/(1+((i-P/2)^2+(j-Q/2)^2)^0.5/D0)^(2*n);
  
            
    end
end

figure;

imshow(lowPF,[]);


(3).高斯低通滤波器


以上为高斯低通滤波器的公式,我们可以看到因为高斯滤波器是e的幂函数,所以该滤波器的傅里叶反变换应该也是e的幂函数,所以不会有晕的现象,相比以上两种滤波器,ringing现象几乎没有。以下为高斯滤波器的侧视图以及图像显示的图

高斯滤波器的matlab代码

  1. lowPF3 = zeros(P,Q);  
  2.   
  3. for i = 1:P  
  4.     for j =1:Q  
  5.         lowPF3(i,j) = exp(-((i-P/2)^2+(j-Q/2)^2)/(2*D0^2));  
  6.               
  7.     end  
  8. end  
lowPF3 = zeros(P,Q);

for i = 1:P
    for j =1:Q
        lowPF3(i,j) = exp(-((i-P/2)^2+(j-Q/2)^2)/(2*D0^2));
            
    end
end



(4)滤波器截止频率对于图像的影响

就像我们前面所说的,高频的部分是图像的细节,那么如果截止频率越大,则保留的细节越多,相反截止频率越小,那么就会有更多的细节被过滤了,所以图像会更模糊,且ringing现象会更明显。

以下上图分别为截止频率为460、160、60、30得到的图


可以发现当截止频率变为160时,字母a周围的晕变得十分明显,当截止频率变为30时,图像整个变得十分模糊。

(5)相同截止频率下选择不同滤波器的效果


以上我们可以看到相同的截止频率下,理想滤波器的ringing效果十分明显,Butterworth的有点朦胧,但是ringing效果比较弱,而高斯滤波器效果很不错。









好的,以下是一个用Matlab编写的数字图像处理界面,可以使用指数低通滤波器图像进行滤波: ```matlab function lowpass_filter_gui % 创建GUI窗口 hFig = figure('Name','Exponential Low Pass Filter','NumberTitle','off',... 'Position',[200 200 600 400],'Toolbar','none','MenuBar','none'); % 创建绘图区域和控制面板 hAx = axes('Units','pixels','Position',[50 50 400 300]); hPanel = uipanel('Title','Filter Settings','Units','pixels','Position',[450 50 130 300]); % 创建滑动条和标签 hSlider = uicontrol(hPanel,'Style','slider','Units','pixels','Position',[10 240 100 20],... 'Min',0,'Max',1,'Value',0.5,'SliderStep',[0.01 0.1],'Callback',@slider_callback); uicontrol(hPanel,'Style','text','Units','pixels','Position',[10 220 100 20],'String','Cutoff Frequency'); % 创建复选框和标签 hCheckbox = uicontrol(hPanel,'Style','checkbox','String','Show Original','Value',1,... 'Position',[10 180 100 20],'Callback',@checkbox_callback); uicontrol(hPanel,'Style','text','Units','pixels','Position',[10 160 100 20],'String','Original Image'); % 创建按钮 uicontrol(hPanel,'Style','pushbutton','Units','pixels','Position',[10 100 100 30],... 'String','Open Image','Callback',@open_image_callback); uicontrol(hPanel,'Style','pushbutton','Units','pixels','Position',[10 50 100 30],... 'String','Save Image','Callback',@save_image_callback); % 初始化滤波器 fc = 0.1; % 截止频率 alpha = exp(-2*pi*fc); % 指数衰减系数 show_original = true; % 是否显示原始图像 % 滑动条回调函数 function slider_callback(hObject,eventdata) fc = get(hObject,'Value'); % 更新截止频率 alpha = exp(-2*pi*fc); % 更新指数衰减系数 filter_image(); % 更新滤波后的图像 end % 复选框回调函数 function checkbox_callback(hObject,eventdata) show_original = get(hObject,'Value'); % 更新显示原始图像的状态 filter_image(); % 更新滤波后的图像 end % 打开图像文件 function open_image_callback(hObject,eventdata) [filename, pathname] = uigetfile({'*.jpg;*.png;*.bmp', 'Image files (*.jpg,*.png,*.bmp)'}); if filename ~= 0 im = imread(fullfile(pathname,filename)); % 读取图像文件 imshow(im,'Parent',hAx); % 显示图像 filter_image(); % 更新滤波后的图像 end end % 保存图像文件 function save_image_callback(hObject,eventdata) [filename, pathname] = uiputfile({'*.jpg', 'JPEG image (*.jpg)'; '*.png', 'PNG image (*.png)'}); if filename ~= 0 imwrite(get(hAx,'Children').CData,fullfile(pathname,filename)); % 保存图像文件 end end % 对图像进行滤波 function filter_image() if show_original % 如果需要显示原始图像,则直接显示 set(hAx,'Visible','on'); else % 否则进行滤波后显示 set(hAx,'Visible','off'); im = get(hAx,'Children').CData; % 获取当前图像 im = double(im)/255; % 将图像转换为double类型,并归一化到[0,1] im_filtered = exp_filter(im,alpha); % 对图像进行指数低通滤波 imshow(im_filtered,'Parent',hAx); % 显示滤波后的图像 end end % 指数低通滤波器函数 function im_filtered = exp_filter(im,alpha) [m,n] = size(im); % 获取图像大小 % 创建卷积核 H = zeros(m,n); for i = 1:m for j = 1:n H(i,j) = alpha^sqrt((i-m/2)^2 + (j-n/2)^2); % 计算卷积核中心到当前像素的距离 end end H = repmat(H,[1 1 3]); % 将卷积核复制到三个通道 H = ifftshift(H); % 对卷积核进行中心化 % 对图像进行滤波 im_fft = fft2(im); im_filtered_fft = im_fft.*H; im_filtered = real(ifft2(im_filtered_fft)); im_filtered = im_filtered/max(im_filtered(:)); % 对滤波后的图像进行归一化 end end ``` 此代码创建了一个数字图像处理GUI界面,其中包含一个绘图区域和一个控制面板。控制面板包括一个滑动条、一个复选框和两个按钮,用于控制指数低通滤波器的截止频率、显示原始图像和打开/保存图像文件。程序通过调用回调函数来更新截止频率、显示原始图像的状态和进行图像处理操作。当打开图像文件时,程序将读取图像文件并显示在绘图区域中。当复选框被选中时,程序将直接显示原始图像;否则,程序将对图像进行指数低通滤波,并显示滤波后的图像。指数低通滤波器函数将对图像进行处理,并返回滤波后的图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值