gpt4 book ai didi

c++ - OpenCV 中的逆傅里叶变换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:42 27 4
gpt4 key购买 nike

我是 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];
}

最佳答案

实际上,您不必交换不同的象限,只有当您是人类并且想要 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);

关于c++ - OpenCV 中的逆傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269456/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com