傅里叶变换中的掩蔽频率

发布于 2024-09-07 13:14:40 字数 1584 浏览 0 评论 0原文

我正在摆弄 OpenCV,并尝试做一些与我在 MatLab 中做过的相同的信号处理工作。我想要屏蔽一些频率,所以我构建了一个矩阵来做到这一点。问题是 OpenCV 中似乎比 Matlab 中多了一些步骤来完成此任务。
在 Matlab 中,这很简单:

F = fft2(image);
smoothF = F .* mask;        // multiply FT by mask
smooth = ifft2(smoothF);    // do inverse FT

但我在 OpenCV 中做同样的事情时遇到困难。 DFT 留下了一个 2 通道图像,因此我分割了图像,乘以掩模,将其合并回来,然后执行逆 DFT。然而,我的最终图像得到了一个奇怪的结果。我很确定我错过了一些东西......

CvMat* maskImage(CvMat* im, int maskWidth, int maskHeight)
{
    CvMat* mask = cvCreateMat(im->rows, im->cols, CV_64FC1);
    cvZero(mask);

    int cx, cy;
    cx = mask->cols/2;
    cy = mask->rows/2;

    int left_x = cx - maskWidth;
    int right_x = cx + maskWidth;

    int top_y = cy + maskHeight;
    int bottom_y = cy - maskHeight;

    //create mask
    for(int i = bottom_y; i < top_y; i++)
    {   
        for(int j = left_x; j < right_x; j++)
        {
            cvmSet(mask,i,j,1.0f); // Set M(i,j)
        }
    }

    cvShiftDFT(mask, mask);
    IplImage* maskImage, stub;
    maskImage = cvGetImage(mask, &stub);
    cvNamedWindow("mask", 0);
    cvShowImage("mask", maskImage);

    CvMat* real = cvCreateMat(im->rows, im->cols, CV_64FC1);
    CvMat* imag = cvCreateMat(im->rows, im->cols, CV_64FC1);

    cvSplit(im, imag, real, NULL, NULL);
    cvMul(real, mask, real);
    cvMul(imag, mask, imag);
    cvMerge(real, imag, NULL, NULL, im);

    IplImage* maskedImage;
    maskedImage = cvGetImage(imag, &stub);
    cvNamedWindow("masked", 0);
    cvShowImage("masked", maskedImage);


    return im;
}

I'm messing around with OpenCV, and am trying to do some of the same stuff signal processing stuff I've done in MatLab. I'm looking to mask out some frequencies, so I have constructed a matrix which will do this. The problem is that there seem to be a few more steps in OpenCV than in Matlab to accomplish this.
In Matlab, it's simple enough:

F = fft2(image);
smoothF = F .* mask;        // multiply FT by mask
smooth = ifft2(smoothF);    // do inverse FT

But I'm having trouble doing the same in OpenCV. The DFT leaves me with a 2 channel image, so I've split the image, multiplied by the mask, merged it back, and then perform the inverse DFT. However, I got a weird result in my final image. I'm pretty sure I'm missing something...

CvMat* maskImage(CvMat* im, int maskWidth, int maskHeight)
{
    CvMat* mask = cvCreateMat(im->rows, im->cols, CV_64FC1);
    cvZero(mask);

    int cx, cy;
    cx = mask->cols/2;
    cy = mask->rows/2;

    int left_x = cx - maskWidth;
    int right_x = cx + maskWidth;

    int top_y = cy + maskHeight;
    int bottom_y = cy - maskHeight;

    //create mask
    for(int i = bottom_y; i < top_y; i++)
    {   
        for(int j = left_x; j < right_x; j++)
        {
            cvmSet(mask,i,j,1.0f); // Set M(i,j)
        }
    }

    cvShiftDFT(mask, mask);
    IplImage* maskImage, stub;
    maskImage = cvGetImage(mask, &stub);
    cvNamedWindow("mask", 0);
    cvShowImage("mask", maskImage);

    CvMat* real = cvCreateMat(im->rows, im->cols, CV_64FC1);
    CvMat* imag = cvCreateMat(im->rows, im->cols, CV_64FC1);

    cvSplit(im, imag, real, NULL, NULL);
    cvMul(real, mask, real);
    cvMul(imag, mask, imag);
    cvMerge(real, imag, NULL, NULL, im);

    IplImage* maskedImage;
    maskedImage = cvGetImage(imag, &stub);
    cvNamedWindow("masked", 0);
    cvShowImage("masked", maskedImage);


    return im;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

动听の歌 2024-09-14 13:14:40

您有什么理由以相反的顺序合并实部和虚部吗?

Any reason you are merging the real and imaginary components in the reverse order?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文