二维离散傅里叶变换手算实例(加OpenCV实现)
二维傅里叶原理及公式不做赘述,直接看图片理解吧
如图
想起来我还写了个计算二维离散傅里叶变换的代码
要用opencv
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include<iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int argc, const char ** argv)
{
Mat img = Mat::zeros(4, 4, CV_32F);
img.at<float>(0, 0) = 0;
img.at<float>(0, 1) = 1;
img.at<float>(0, 2) = 0;
img.at<float>(0, 3) = 2;
img.at<float>(1, 0) = 0;
img.at<float>(1, 1) = 3;
img.at<float>(1, 2) = 0;
img.at<float>(1, 3) = 4;
img.at<float>(2, 0) = 0;
img.at<float>(2, 1) = 5;
img.at<float>(2, 2) = 0;
img.at<float>(2, 3) = 6;
img.at<float>(3, 0) = 0;
img.at<float>(3, 1) = 7;
img.at<float>(3, 2) = 0;
img.at<float>(3, 3) = 8;
Mat planes[] = { Mat_<float>(img), Mat::zeros(img.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg, DFT_COMPLEX_OUTPUT);
std::cout << img << endl << endl;
std::cout << complexImg << endl << endl;
system("pause");
}
给个结果图
上面是原二维矩阵
下面第一列是实部,第二列是虚部
结语
无话可说
算了还是写点吧
根据二维离散傅里叶变换的可分离性,先对y做傅里叶变换(一共4次,因为矩阵是4×4的),之后再对x做傅里叶变换(一共4次),然后就完了。