【问题标题】:Masking frequencies in a Fourier Transform傅里叶变换中的掩蔽频率
【发布时间】:2010-07-23 06:18:50
【问题描述】:

我在搞乱 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;
}

【问题讨论】:

  • 你能把你称之为这个的行和周围的傅立叶变换贴出来吗?

标签: opencv fft


【解决方案1】:

您以相反的顺序合并实部和虚部的任何原因?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2021-05-12
    相关资源
    最近更新 更多