快速傅里葉變換C++完整實現(包括FFT、IFFT & FFTShift)

圖像處理中常常用到快速傅里葉變換(FFT),使用Matlab命令fftfft2很容易實現快速傅里葉變換,因爲Matlab/C++混合編程接口性能太差,實際項目中使用C++實現具備更高的性能。算法

網上有很多關於快速傅里葉變換的C++實現方式,要麼實驗結果和Matlab運算結果不同(咱們一般使用Matlab作實驗,驗證算法可行性),要麼算法不完整,卻少逆變換或者頻率對齊函數(fftshift)。本文程序實現了全部程序,包括正變換、逆變換,以及頻率對齊函數。編程

一、正變換(FFT
void ImgFFT2D(unsigned char* imgBuf, int width, int height,unsigned char *imgBufOut,ComplexNumber *m_pFFTBuf)
形參解釋
(1)unsigned char* imgBuf:圖像輸入矩陣,二維轉成一維後顯示;
(2)int width:圖像寬度;
(3)int height:圖像高度;
(4)unsigned char *imgBufOut:傅里葉變換後頻譜圖像輸出;
(5)ComplexNumber *m_pFFTBuf:傅里葉變換後係數;
ComplexNumber:複數類型函數

struct ComplexNumber
{
    float imag;  //虛部
    float real;  //實部
};

一般圖像在傅里葉域處理就是對傅里葉變換系數進行處理,再進行逆變換獲得處理後的結果。性能

二、逆變換(IFFT
void ImgIFFT2D(unsigned char* imgBufOut, int width, int height,ComplexNumber *m_pFFTBuf)
形參解釋
(1)unsigned char* imgBufOut:圖像輸出矩陣,逆變換結果;
(2)int width:圖像寬度;
(3)int height:圖像高度;
(4)ComplexNumber *m_pFFTBuf:傅里葉變換系數;code

三、頻率對齊函數(fftshift
fftshift的做用正是讓正半軸部分和負半軸部分的圖像分別關於各自的中心對稱,由於直接用fft得出的數據與頻率不是對應的,fftshift能夠糾正過來。具體實現,每一行後半部分移到前半部分,每一列後半部分移到前半部分。
void FFTShift(int width,int height,ComplexNumber *m_pFFTBuf)
形參解釋
(1)int width:圖像寬度;
(2)int height:圖像高度;
(3)ComplexNumber *m_pFFTBuf:傅里葉變換系數,同時輸出結果;接口

四、頻域內卷積操做
void FourierTrans(unsigned char **imgInput,double **mtfInput ,unsigned char **imgBufout,int pWidth,int pHeight)
形參解釋
(1)unsigned char **imgInput:輸入圖像;
(2)double **mtfInput:卷積模版;
(3)unsigned char **imgBufout:輸出後結果;
(4)int pWidth:圖像高度
(5)int pHeight:圖像寬度ip

附件
一、FFT.h
二、dll & lib.zip
C++項目中加入FFT.dll FFT.lib及FFT.h,直接調用封裝函數。
參考資料:《Visual C++數字圖像處理.謝鳳英 等》get

相關文章
相關標籤/搜索