图像的傅里叶变换的迷思----频谱居中

                     图像的傅里叶变换在频谱居中上的误区

 

   如果你用MATLAB去计算图像的傅里叶变换那么你一定会用到FFTSHIFT这一函数为了保证计算后的频谱能够居中化。如下图。

                               

Matlab代码:

clear all;
close all;
I = im2double(imread('cameraman.tif'));
imshowpair(I,log(abs(fftshift(fft2(I)))+1),'montage')

 

     但是你如果去看matlab的介绍或者在计算FFT之后调用FFTSHIFT函数,那么经过该函数处理过的图像会变成如下形式。如下图。一定要注意:fftshift这一函数的调用是放在傅里叶变换之后的,这和频谱居中的真实计算原理(即,利用傅里叶变换的属性)根本就不一样,可以说是一种投机取巧的方法,但也不失为一个好的方法。

 

Matlab代码:

Ishift = fftshift(I);
imshow(Ishift,[])

并且MATLAB还给出了如下图所示的示意图,即交换四个象限。注意:所以MATLAB的这种做法是一种投机取巧的做法。

而实际情况不是这样的,根据傅里叶变换的属性或者说是傅里叶变换对。

     要想对频域的信号进行移位,时域的信号需要乘以一个对应的指数函数。这条属性叫做频域移位特性。图像信号在进行变换之前需要对每一个像素乘以(-1)^x+y次方。这是根据欧拉公式计算出来的(注意:e^jπ = -1)。

Matlab代码:

Ie = zeros(size(I));
for i = 1:size(I,1)
    for j = 1:size(I,2)
        Ie(i,j) = (-1)^(i+j).*I(i,j);
    end
end
imshowpair(I,Ie,'montage')

计算出来的图像如下,左边是原始图像,右图是乘以(-1)为底的幂函数后的图像。

     简单点说就是一正一负,每隔一个像素乘以一个负号,得到的图像就好像黑白间隔的棋盘一样。如下图放大后的图像细节所示。而不是那种四个象限互换后的结果。

      最后我用空间域图像乘以指数函数即(-1)^(x+y)的方式对图像的频谱进行居中化的操作,能够得到和MATLAB自带的函数fftshift一模一样的结果。如下图。

      Wherefore,不论是一维信号的频谱还是二维信号的频谱,一定要记得真正的频谱居中不只是简单的fftshift或是四个象限的对调而是在进行变换之前,用一个指数函数乘以原始信号。而这个指数函数根据著名的欧拉公式e^jπ+1=0,最终变成了以(-1)为底的幂函数。

 

(全文完)

 

鸣谢:

【1】Digital image processing, Third Edition.  冈萨雷斯

【2】signals and systems,Second Edition. 奥本海姆

【3】Matlab 2017a

 

谢谢收看!

再见!

 

《圣经》箴言 14章12节   有一条路,人以为正,至终成为死亡之路。

                                                                                                 *配图与本文无关*

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章