1

图像处理中经常用到快速傅里叶变换(FFT),使用Matlab命令fftfft2很容易实现快速傅里叶变换,由于Matlab/C++混合编程接口性能太差,实际项目中使用C++实现具有更高的性能。

网上有不少关于快速傅里叶变换的C++实现方式,要么实验结果和Matlab运算结果不一样(我们通常使用Matlab做实验,验证算法可行性),要么算法不完整,却少逆变换或者频率对齐函数(fftshift)。本文程序实现了所有程序,包括正变换、逆变换,以及频率对齐函数。

1、正变换(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;  //实部
};

通常图像在傅里叶域处理就是对傅里叶变换系数进行处理,再进行逆变换得到处理后的结果。

2、逆变换(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:傅里叶变换系数;

3、频率对齐函数(fftshift
fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称,因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来。具体实现,每一行后半部分移到前半部分,每一列后半部分移到前半部分。
void FFTShift(int width,int height,ComplexNumber *m_pFFTBuf)
形参解释
(1)int width:图像宽度;
(2)int height:图像高度;
(3)ComplexNumber *m_pFFTBuf:傅里叶变换系数,同时输出结果;

4、频域内卷积操作
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:图像宽度

附件
1、FFT.h
2、dll & lib.zip
C++项目中加入FFT.dll FFT.lib及FFT.h,直接调用封装函数。
参考资料:《Visual C++数字图像处理.谢凤英 等》


角落里的阳光
141 声望26 粉丝

Golang/PHP/Python


引用和评论

0 条评论