You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IDFT输出出现双重镜像图像的原因排查求助

傅里叶变换滤波后图像出现垂直翻转叠加的问题求助

我是OpenCV和C++新手,写了个用于学习的小程序,现在搞不懂输出结果的问题,希望有经验的人提些引导性问题帮我自己理解并修复。

程序要实现的功能:

  • 加载图像
  • 对图像执行DFT(离散傅里叶变换)
  • 对频谱应用圆形二进制掩码,按按键逐步增大圆形半径(实现简易滤波)
  • 显示掩码处理后频谱的逆变换结果

目前基础功能已经实现:能加载图像、执行DFT、查看输出,还能逐步增大掩码半径并查看IDFT结果。但现在的问题是,输出图像会出现输入图像的垂直翻转副本叠加的情况(比如用Lena.png测试时),这并非预期结果。不应用掩码直接显示IDFT结果时,图像正常无双重叠加,只有使用掩码后才会出现该问题。

我不需要直接的解决方案,希望能得到一些引导性问题,帮助我自行排查原因并修复。

我的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;

void expand_img_to_optimal(Mat &padded, Mat &img);
void fourier_transform(Mat &img);

int main(int argc, char **argv)
{
    Mat input_img;
    input_img = imread("Lena.png" , IMREAD_GRAYSCALE);

    if (input_img.empty())
    {
        fprintf(stderr, "Could not Open image\n\n");
        return -1;
    }

    fourier_transform(input_img);
    return 0;
}

void fourier_transform(Mat &img)
{
    Mat padded;
    expand_img_to_optimal(padded, img);

    Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
    Mat complexI;
    merge(planes, 2, complexI);

    dft(complexI, complexI, DFT_COMPLEX_OUTPUT);
    
    // 逐步增大掩码圆形半径的循环
    for (int i=0; i<400; i+=10) {
        Mat mask = Mat::ones(complexI.size(), complexI.type());
        mask.convertTo(mask, CV_8U);

        Mat dest = Mat::ones(complexI.size(), complexI.type());

        circle(mask, Point(mask.cols/2, mask.rows/2), i, 0, -1, 8, 0);

        complexI.copyTo(dest, mask);    

        Mat inverseTransform;
        idft(dest, inverseTransform, DFT_INVERSE|DFT_REAL_OUTPUT);
        normalize(inverseTransform, inverseTransform, 0, 1, NORM_MINMAX);
        imshow("Reconstructed", inverseTransform);
        waitKey(0);
    }
}

void expand_img_to_optimal(Mat &padded, Mat &img) {
    int row = getOptimalDFTSize(img.rows);
    int col = getOptimalDFTSize(img.cols);
    copyMakeBorder(img, padded, 0, row - img.rows, 0, col - img.cols, BORDER_CONSTANT, Scalar::all(0));
}

内容的提问来源于stack exchange,提问作者avi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:50:45