Маскирование частот в преобразовании Фурье - PullRequest
1 голос
/ 29 июня 2010

Я возиться с 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;
}

1 Ответ

1 голос
/ 17 июля 2010

По какой причине вы объединяете реальные и мнимые компоненты в обратном порядке?

...