频域滤波是一种图像处理技术,可以通过在频域中增加或减弱某些频率分量,从而实现图像去噪、锐化、平滑等功能。常见的频域滤波包括频域低通滤波、频域高通滤波和频域同态滤波。 在使用这些滤波器进行频域处理时,通常需要选择合适的参数、预处理和后处理方法,以达到理想的处理效果。同时,不同的图像场景和需求也需要选择适合的滤波器和处理方法。
1.频域低通滤波
频域低通滤波:低通滤波器将保留图像中低频信息,同时削弱高频信息,从而实现图像模糊、平滑等效果。低通滤波器的频率响应通常为一个圆形区域,圆形区域内表示通过的频率分量,圆形区域外表示被滤掉的频率分量。低通滤波器适合处理噪声较多或需要平滑图像的场景。
以下是实现频域低通滤波中的理想低通滤波:
close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
I=imread('lena.bmp');
I=rgb2gray(I);
I=im2double(I);
[m,n]=size(I);
M=2*m;N=2*n;%滤波器的行数和列数
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u,v);%meshgrid(u,v)的作用是分别产生以向量u为行,向量v为裂的两个大小相同的矩阵
D=sqrt(U.^2+V.^2);%设置频率点(U,V)与频域中心的距离为D(U,V)
D0=40; %截止频率
H=double(D<=D0); %理想低通滤波器
J=fftshift(fft2(I,size(H,1),size(H,2)));%通过傅里叶变换将时域图像转换到频域图像,并移动到中心位置
K=J.*H; %滤波处理
L=ifft2(ifftshift(K)); %傅里叶反转换
L=L(1:m,1:n); %设置图像的大小
figure;
subplot(131),imshow(J);
subplot(132),imshow(I);
subplot(133),imshow(L);
2.频域高通滤波
频域高通滤波:高通滤波器则削弱低频信息,同时保留高频信息,从而实现图像增强、锐化等效果。高通滤波器的频率响应通常为一环形区域,环形区域内表示被滤掉的频率分量,环形区域外表示通过的频率分量。高通滤波器适合处理模糊或需要突出细节、边缘等特定信息的场景。
以下是实现频域高通滤波中的理想高通滤波:
close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
I=imread('lena.bmp');
I=rgb2gray(I);
I=im2double(I);
[m,n]=size(I);
M=2*m;N=2*n;%滤波器的行数和列数
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u,v);%meshgrid(u,v)的作用是分别产生以向量u为行,向量v为裂的两个大小相同的矩阵
D=sqrt(U.^2+V.^2);%设置频率点(U,V)与频域中心的距离为D(U,V)
D0=40; %截止频率
H=double(D>D0); %理想高通滤波器
J=fftshift(fft2(I,size(H,1),size(H,2)));%通过傅里叶变换将时域图像转换到频域图像,并移动到中心位置
K=J.*H; %滤波处理
L=ifft2(ifftshift(K)); %傅里叶反转换
L=L(1:m,1:n); %设置图像的大小
figure;
subplot(131),imshow(J);
subplot(132),imshow(I);
subplot(133),imshow(L);
3.频域同态滤波
频域同态滤波:同态滤波器可以同时处理低频和高频信息,通过在频域中对图像进行对数变换,将乘积域转化为加法域,从而实现亮度和反差的调整。同态滤波器常用于处理光照不均和阴影等问题,同时也有一定的去噪和增强效果。
close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
I=imread('lena.bmp');
I=rgb2gray(I);
J=log(im2double(I)+1); %取对数
K=fft2(J); %傅里叶变换
n=5; %同态滤波参数
D0=0.1*pi;
rh=0.8;
rl=0.3;
[row,column]=size(J);
for i=1:row
for j=1:column
D1=sqrt(i^2+j^2);
H(i,j)=rl+(rh/(1+(D0/D1)^(2*n)));
end
end
L=K.*H; %滤波
M=ifft2(L); %傅里叶反变换
N=exp(M)-1; %取指数
figure;
subplot(121),imshow(I);
subplot(122),imshow(real(N));