使用opencv DFT(FW和后退)的结果不准确

时间:2015-01-14 13:21:51

标签: c++ opencv fft dft

我想使用opencv的DFT执行一些去噪操作,方法是执行前向傅里叶执行某些操作并执行反傅立叶。但我开始注意到,在某些情况下,噪音无处不在。所以我测试了向前向后没有任何操作,我没有正确恢复原始信号,有谁知道为什么?我的所有零都应保持为零或至少非常低的值,这里我的结果是-5 -6的幂,这不是那么好。即使我使用CV_64F,结果也不是更好。在MATLAB中,这个相同的操作给了我正确的结果。

这是我的输入图像的特写 enter image description here

这是输出的特写 enter image description here

这是我使用的代码:

void func(cv::Mat &I,cv::Mat &G){
    const int n1=G.rows;
    const int m1=G.cols;

    const int nl = static_cast<int>(n1/2);
    const int ml = static_cast<int>(m1/2);

    const int n = I.rows + 2*nl;
    const int m = I.cols + 2*ml; // on the border add zero values

    cv::Mat paddedI;
    cv::Mat planesI[] = {cv::Mat_<float>(paddedI), cv::Mat::zeros(paddedI.size(), CV_32F)};
    merge(planesI, 2, paddedI);         // Add to the expanded another plane with zeros
    cv::dft(paddedI, paddedI, cv::DFT_COMPLEX_OUTPUT);
    cv::dft(paddedI, paddedI, cv::DFT_INVERSE | cv::DFT_SCALE);//I could just output the real part
    split(paddedI, planesI);

    planesI[0].rowRange(nl,nl+I.rows+1).colRange(ml,ml+I.cols+1).copyTo(I);
}

0 个答案:

没有答案