标题:基于matlab的理想滤波器和巴特沃斯滤波器设计 关键词:一阶巴特沃斯滤波器 理想滤波器 二维傅里叶变换 fft2 描述:对任意图像进行灰度化,然后进行二维傅里叶变化,设定一个阈值,对高频或者低频信号进行滤波操作。 通过设置阈值,选择类型可设置理想低通,理想高通滤波器和一阶巴特沃斯高通和一阶巴特沃斯低通滤波器。 基于matlab的图像处理小实验,
最近在折腾图像处理的时候发现,频率域滤波像给照片开了上帝视角——原本藏在像素背后的高频细节和低频轮廓突然变得可控。今天咱们拿Matlab当画笔,试试怎么用理想滤波器和巴特沃斯滤波器给图像做"美颜"。
先抓张图进来折腾:
% 灵魂画手的第一步 img = imread('lena.jpg'); gray_img = rgb2gray(img); figure(1), imshow(gray_img), title('原图:等待滤镜的素颜照')!图1:原图
接下来要进入核心环节——二维傅里叶变换。这时候图像会变成频域里的一团星云:
% 施展空间魔法 f_img = fft2(double(gray_img)); f_shift = fftshift(f_img); magnitude = log(abs(f_shift)+1); figure(2), imshow(magnitude,[]), title('频域星云图')!图2:频域分布
重点来了,咱们先做个理想低通滤波器试试。这玩意儿就像个暴君,对超出阈值的频率直接封杀:
% 专制型滤镜生成器 [M,N] = size(gray_img); D0 = 30; % 试试把这个值调到15看看会发生什么 u = 0:(M-1); v = 0:(N-1); [V,U] = meshgrid(v,u); D = sqrt((U-floor(M/2)).^2 + (V-floor(N/2)).^2); ideal_LP = double(D <= D0);!图3:理想低通效果
看这个滤镜模板,边缘锋利得像菜刀切出来的。这种简单粗暴的方式虽然有效,但处理后的图像边缘总带着奇怪的振铃,就像给照片套了个劣质相框。
这时候就该巴特沃斯滤波器出场了。一阶的设计让它像个温和的管家,对频率成分的过渡处理得更圆滑:
% 温柔版滤镜配方 n = 1; % 一阶设计 butter_HP = 1./(1 + (D./D0).^(2*n)); figure(4), mesh(butter_HP), title('巴特沃斯曲面')!图4:巴特沃斯模板
把这两个滤镜往频域信号上一套,效果立竿见影:
% 理想低通实战 filtered_ideal = f_shift .* ideal_LP; f_ishift_ideal = ifftshift(filtered_ideal); img_back_ideal = real(ifft2(f_ishift_ideal)); % 巴特沃斯高通表演 butter_HP = 1 - butter_HP; % 秒变高通 filtered_butter = f_shift .* butter_HP; f_ishift_butter = ifftshift(filtered_butter); img_back_butter = real(ifft2(f_ishift_butter));最后对比看看处理效果:
% 作品展示环节 figure(5) subplot(121),imshow(img_back_ideal,[]),title('理想低通:柔光效果') subplot(122),imshow(img_back_butter,[]),title('巴特沃斯高通:边缘提取')!图5:对比效果
玩的时候注意几个关键点:
fftshift就像个搬运工,把低频部分搬到频谱图中心- 恢复图像时用
real()是因为计算时可能残留微小虚部 - D0这个阈值相当于滤镜的力度旋钮,调太小会丢失细节
下次想更刺激的话,可以试试把巴特沃斯的阶数调高,看看会不会出现类似理想滤波器的效果。或者做个滑块交互界面,实时看滤镜变化——不过那就是另一个故事了。