以下是我学习傅里叶变换过程中参考的一些书籍、网站等,记录下来,方便以后查阅:
DFT:Discrete Fourier Transform 离散傅里叶变换
数字图像处理(第二版)-冈萨雷斯(有大量数学公式,严谨,但有点深奥难懂)
我参考(4. DFT实现算法)修改了(5. 官方文档)的代码,主要删除了5中“剪切和重分布幅度图象限”这一步。替换的方法是在进行傅里叶变换之前用(-1)^(x+y)乘以输入的图像函数,就可以将傅里叶变换的原点F(0,0)移到(M/2,N/2)上。效果与官方代码类似。
#include <iostream>
#include <math.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
//读入图像灰度图
Mat I = imread("Spectrum.tif", IMREAD_GRAYSCALE);
//判断图像是否加载成功
if (I.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
else
cout << "图像加载成功!" << endl << endl;
//(-1)^(x+y)乘以输入的图像函数,将傅里叶变换的原点F(0,0)移到(M/2,N/2)上。
Mat padded(I.rows,I.cols,CV_32F);
for (int i = 0;i < I.rows;i++)
{
for (int j = 0;j < I.cols;j++)
{
float temp= I.at<uchar>(i, j);
padded.at<float>(i, j) = temp*pow(-1, i + j);
}
}
//将planes融合合并成一个多通道数组complexI , 初始时实部就是图像
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(),CV_32F) };
Mat complexI;
merge(planes, 2, complexI);
//进行傅里叶变换
dft(complexI, complexI);
//计算幅值,planes[0] = Re(DFT(I),planes[1] = Im(DFT(I)) , 即planes[0]为实部,planes[1]为虚部
split(complexI, planes);
magnitude(planes[0], planes[1], planes[