0%

图像的傅立叶变换

  空域上的图像利于人眼分析,但是对于计算机来说分析困难,所以在很多情况下(比如滤波),需要在频域对图像进行处理。傅立叶变换把信号拆分成不同频率sin的组合,即可将空域的图像化到频域。

傅立叶变换

一维傅立叶变换

  一维傅立叶变换,即任何信号都可以拆分成 $A\sin (wx+\varPhi )$ 的组合。

连续的傅立叶变换

离散的傅立叶变换(DFT)

快速傅立叶变换(FFT)时间复杂度:$N\log N$

  对于每个频率w来说,都有一个$A\sin (wx+\varPhi )$,其中

幅值(R为H(w)的实部,I为H(w)的虚部)构成频谱图

相位(R为H(w)的实部,I为H(w)的虚部)构成相位图

二维傅立叶变换

  图像的傅立叶变换是二维的傅立叶变换。

二维的连续傅立叶变换

二维离散的傅立叶变换(对于$M\times N$的图像)

  如此图像从$(x,y)$的空域矩阵,变成了$(u,v)$的频域矩阵。(频域矩阵的大小与原空间域矩阵大小相同)

幅值(R为H(u,v)的实部,I为H(u,v)的虚部)

相位(R为H(u,v)的实部,I为H(u,v)的虚部)

一维傅立叶变换的三角函数系是$sin(wx)$、$cos(wx)$以及常数$1$,二维傅立叶变换的三角函数系是$sin(ux+vy)$、$cos(ux+vy)$和常数$1$。

频谱图

频谱图生成

图像频谱图生成Matlab代码如下

1
2
3
4
5
6
7
8
img = imread('Lenna.jpg');
img = rgb2gray(img);
img = double(img);
f1 = fft2(img); % 二维快速傅里叶变换
f2 = fftshift(f1); % FFT频谱平移
magnitude1 = log(1+abs(f1)); % (未中心化)频谱对数变换(由于幅度值范围很大,所以要取对数处理)
magnitude2 = log(1+abs(f2)); % (中心化)
imshow(magnitude2,[]),title('频谱图');

二维傅里叶变换

  首先需将图像进行二维傅里叶变换,得到未中心化的频谱图。此时频谱图中间区域是高频,而四个角则是DC低频分量。

频谱的中心化

  DFT具有周期性,且频谱图关于原点对称。

  在原图像乘以系数$(-1)^{x+y}$,再进行傅立叶变换,可以得到中心化的频谱图(中间低频、四周高频)。相当于对未中心化的频谱图的四个象限进行对调:1 <—> 3、2 <—> 4

频谱图进行中心化

如此得到最终的频谱图

频率分布

  经过频谱居中后的频谱中,中间最亮的点是最低频率,属于直流分量(DC分量)。越往边外走,频率越高。所以,频谱图中的四个角和X,Y轴的尽头都是高频。

  频谱图的亮度表示对应频率的幅度的大小。

平移和旋转

  • 原图像平移,频谱图不变;
  • 原图像旋转,频谱随着原图像旋转相同的角度。

Matlab代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Isize = 512;
Rwidth = 50;
Rlength = 3*Rwidth;

Irect = zeros(Isize);
Irect(floor((Isize - Rlength)/2) + 1:floor((Isize - Rlength)/2) + Rlength,...
(floor(Isize - Rwidth)/2) + 1:floor((Isize - Rwidth)/2) + Rwidth) = 1;
Idft = fft2(Irect);
subplot(2,3,1),imshow(Irect),title('原图');
subplot(2,3,4),imshow(log(abs(fftshift(Idft))+1),[]),title('原图的频谱图');

Irect = zeros(Isize);
Irect(floor((Isize - Rlength)/2) + 150 + 1:floor((Isize - Rlength)/2) + 150 + Rlength,...
(floor(Isize - Rwidth)/2) + 1 + 200:floor((Isize - Rwidth)/2) + Rwidth + 200) = 1;
Idft = fft2(Irect);
subplot(2,3,2),imshow(Irect),title('平移');
subplot(2,3,5),imshow(log(abs(fftshift(Idft))+1),[]),title('平移后的频谱图');

Irect = zeros(Isize);
Irect(floor((Isize - Rlength)/2) + 1:floor((Isize - Rlength)/2) + Rlength,...
(floor(Isize - Rwidth)/2) + 1:floor((Isize - Rwidth)/2) + Rwidth) = 1;
Irot = imrotate(Irect, 45, 'crop', 'bilinear');
Idft = fft2(Irot);
subplot(2,3,3),imshow(Irot),title('旋转');
subplot(2,3,6),imshow(log(abs(fftshift(Idft))+1),[]),title('旋转后的频谱图');

方向性

  在二维傅里叶变换中,空间域中横向的周期变化会反应在频谱图中的Y轴上,而空间域中纵向的周期变化会反应在频谱图中的X轴上。空间域中东南方向的周期变化会反应在频谱图中的东北方向,反之亦然。

Matlab代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Isize = 512;

Irect = zeros(Isize);
Irect(floor(Isize/2)+1:Isize, 1:Isize) = 0.1;
Irect(1:floor(Isize/2), 1:Isize) = 1;
Idft = fft2(Irect);
subplot(2,2,1),imshow(Irect);
subplot(2,2,3),imshow(log(abs(fftshift(Idft))+1),[]);

Irect = zeros(Isize);
Irect(1:Isize, floor(Isize/2)+1:Isize) = 0.1;
Irect(1:Isize, 1:floor(Isize/2)) = 1;
Idft = fft2(Irect);
subplot(2,2,2),imshow(Irect);
subplot(2,2,4),imshow(log(abs(fftshift(Idft))+1),[]);

参考

  1. 图像的傅里叶变换的频谱特征 一(周期性,能量分布,fftshift,交错性)
  2. 图像的傅里叶变换的频谱特征 三(平移,旋转,相位的重要性)
  3. WiKi 傅立叶变换
  4. 二维图像的傅立叶变换