rwr*_*rx_ 4 c++ opencv fft inverse dft
我是OpenCV和图像处理算法的新手.我需要在C++中的OpenCV中进行逆离散傅里叶变换,但我不知道如何.我在互联网上搜索,但没有找到答案.我正在使用此页面中的代码在我的程序中进行傅里叶变换:http://opencv.itseez.com/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html.我试图对该代码做反向,但我不知道我在哪里做错了.我的代码在这里(我认为整个代码都是错误的):
void doFourierInverse(const Mat &src, Mat &dst) {
normalize(src, dst, 0, -1, CV_MINMAX);
int cx = dst.cols/2;
int cy = dst.rows/2;
Mat q0(dst, Rect(0, 0, cx, cy));
Mat q1(dst, Rect(cx, 0, cx, cy));
Mat q2(dst, Rect(0, cy, cx, cy));
Mat q3(dst, Rect(cx, cy, cx, cy));
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
dst = dst(Rect(0, 0, dst.cols & -2, dst.rows & -2));
exp(dst, dst);
dst -= Scalar::all(1);
Mat planes[2];
polarToCart(dst, Mat::zeros(dst.rows, dst.cols, dst.type()), planes[0], planes[1]);
merge(planes, 2, dst);
idft(dst, dst, DFT_INVERSE | DFT_SCALE);
split(dst, planes);
dst = planes[0];
}
Run Code Online (Sandbox Code Playgroud)
san*_*iso 16
实际上,你不必交换不同的象限,只有当你是一个人并想要一个更自然的FFT结果可视化时才需要它(即中间的0频率,左/下的负频率和正的频率上/右).
要反转FFT,您需要将"按原样"(或在您想要的频率滤波之后)的正向变换结果传递给相同的dft()函数,只需添加标志DFT_INVERSE.如果你还记得关于FFT的数学运算,那么正向和反向变换在公式中都有很严重的扭结......
---编辑---
究竟什么不起作用?下面的代码确实执行了前向后向FFT,一切都正常工作.
// Load an image
cv::Mat inputImage = cv::imread(argv[argc-1], 0);
// Go float
cv::Mat fImage;
inputImage.convertTo(fImage, CV_32F);
// FFT
std::cout << "Direct transform...\n";
cv::Mat fourierTransform;
cv::dft(fImage, fourierTransform, cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT);
// Some processing
doSomethingWithTheSpectrum();
// IFFT
std::cout << "Inverse transform...\n";
cv::Mat inverseTransform;
cv::dft(fourierTransform, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
// Back to 8-bits
cv::Mat finalImage;
inverseTransform.convertTo(finalImage, CV_8U);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20154 次 |
| 最近记录: |