图像处理中常常用到快速傅里叶变换(FFT),使用Matlab命令
fft
或fft2
很容易实现快速傅里叶变换,因为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