2010-06-28 82 views
1

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

你是否也可以發表你稱之爲的線,以及周圍的fourier變換? – 2010-07-18 00:02:24

回答

1

任何你想合併相反順序的實部和虛部的原因?

+0

不,對不起,這是一個錯字 – Simonw 2010-07-17 14:38:08