图像处理中经常用到快速傅里叶变换(FFT),使用Matlab命令
fft
或fft2
很容易实现快速傅里叶变换,由于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++数字图像处理.谢凤英 等》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。