一、频域滤波知识梳理
频域滤波和空间域滤波可以视为对同一个图像增强问题的两种解决方式,二者殊途同归。在一些情况下,图像增强问题适合在频域中完成,另一些情况下,适合在空间域中完成,我们常常根据需要在二者之间做抉择,或是在二者之间相互转换,选择一个合适的方法来解决问题。
频域增强导图如下:
二.频域滤波基础
频域滤波必不可少的工具是 傅里叶变换。傅里叶变换提供了一种从空间域到频域的转换手段,且用傅里叶反变换可以实现从频域到空间域的无损转换,不丢失任何信息。
下面仅将频域滤波(二维图像)中用到的fft和ifft的实现附上,具体的傅里叶相关知识可查看另一篇博客:《傅里叶家族》。
2.1 二维快速傅里叶变换fft2
%% imgFft2
%{
函数: Y=fft2(X,m,n)
函数说明:计算二维快速傅里叶变换
参数说明: X:输入图像
m,n:为将X的第一和第二维规整到指定的长度,当m和n均为2的整数次幂时算法的执行速度要比m和n均为素数要快
返回值:Y是计算得到的傅里叶频谱,是一个复数矩阵
备注: abs(Y)可得到幅度谱
angle(Y)可得到相位谱
fftshift(X) 可将频谱图像零点移到中心位置
备注:此程序可帮助理解FFT后,幅度谱的意义
%}
clc; %清空命令行
clear;%清空变量
I1=imread('beauty.jpg');
subplot(1,2,1);
imshow(I1);
title('beauty.jpg');
I2=fft2(I1);%计算二维FFT
spectrum =fftshift(I2);%将零点移到中心
temp= log(1+ abs(spectrum) ); %对幅值做 对数变换 以压缩动态范围
subplot(1,2,2);
imshow(temp,[]);
title('FFT');
I1=imread('line.bmp');
figure,
subplot(1,2,1);
imshow(I1);
title('line');
I2=fft2(I1);%计算二维FFT
spectrum =fftshift(I2);%将零点移到中心
temp= log(1+ abs(spectrum) ); %对幅值做 对数变换 以压缩动态范围
subplot(1,2,2);
imshow(temp,[]);
title('FFT_line');
处理结果:
处理结果分析:
1、横向比较。原图与经过FFT后的频谱图之间的关系,低频区实质图像中变化较缓慢的像素区,如变化不明显的背景区域;高频区指灰度变化较剧烈的像素区,如边缘和噪声等。
2、纵向比较。FFT后的图像以幅度谱显示,可看出图beauty与图line的幅度谱之间的差异。图beauty较为平滑,在其傅里叶频谱图FFT.jpg中,低频部分对应的幅值比较高,即低频分量占优势;而图line中的水平与竖直的线灰度变化更加剧烈,相应的频谱中高频分量较强(注意是与beauty图相比,高频区域更多一些,但整体还是低频区域更多,毕竟背景无变化的黑色区都属于低频嘛)。由此可知,FFT后的幅度谱,可以反映原图像中的灰度变化情况(即灰度变化是否剧烈)。
2.2 逆快速傅里叶变换 Ifft2
%% imgIfft2
%{
函数: Y=ifft2(X)
函数说明:逆二维快速傅里叶变换
参数说明:X:输入图像
m,n:将图像规整到m*n
返回值: 反变换后得到的原始图像
备注:此程序为美女与猫--交换两幅图像的相位谱
%}
clc;
clear;
I1=imread('beauty.jpg');
I2=imread('CAT.jpg');
subplot(1,2,1);
imshow(I1);
title('beauty原图');
subplot(1,2,2);
imshow(I2);
title('CAT原图');
%计算二维FFT,得到频谱
F1=fft2(I1);
F2=fft2(I2);
%分别求幅度谱和相位谱
A1=abs(F1);
A2=abs(F2);
Phase1=angle(F1);
Phase2=angle(F2);
%交换相位谱并重建图像
New1=A1.*cos(Phase2) +A1.*sin(Phase2).*i;
New2=A2.*cos(Phase1) +A2.*sin(Phase1).*i;
%傅里叶反变换
New1=abs(ifft2(New1));
New2=abs(ifft2(New2));
figure,
subplot(1,2,1);
imshow(New1,[]);
title('beauty幅度和c