实数矩阵f(原图)-Fourier transform->复数矩阵-Fourier inversion->复数矩阵F'-剪切(取实部)->实数矩阵f
注意:傅里叶逆变换理论上是实数矩阵,但由于计算误差所以造成复数矩阵,可求实部、虚部平方和开根号,或直接取实部
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
//快速傅里叶变换
void fft2Image(InputArray _src, OutputArray _dst)
{
//得到Mat类型
Mat src = _src.getMat();
//判断位深
CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1);
CV_Assert(src.channels() == 1 || src.channels() == 2);
int rows = src.rows;
int cols = src.cols;
//为了进行快速的傅里叶变换,我们经行和列的扩充,找到最合适扩充值
Mat padded;
int rPadded = getOptimalDFTSize(rows);
int cPadded = getOptimalDFTSize(cols);
//进行边缘扩充,扩充值为零
copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));
//快速的傅里叶变换(双通