看标题就知道跟我的上一篇博客差不多了,本来没打算写这篇的,因为之前在网上搜过,有现成的OpenCV实现fft2和ifft2代码,而且我也试过fft2确实和Matlab计算的结果一致。但是项目后来又用到了ifft2,这次发现计算结果跟Matlab怎么都对不上,实在没办法,我只能自己摸索,后面也对网上的fft2代码进行了完善,现在一起发出来。
要用OpenCV实现傅里叶变换,首先要知道复数在OpenCV中是如何表示的,然后才能理解fft2和ifft2的实现。
一、复数在OpenCV中的表示方式
OpenCV的mat类没有专门的复数数据类型,可以将两个二维的Mat,一个存储实部,一个存储虚部,merge在一起,形成存储虚数的Mat。或者直接定义类似CV_64FC2格式的Mat,如下所示:
// 第一种方式,定义实部和虚部
Mat real = Mat::zeros(3, 3, CV_64F);
Mat imag = Mat::zeros(3, 3, CV_64F);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
real.at<double>(i, j) = i * 3 + j;
imag.at<double>(i, j) = i * 3 + j;
}
}