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;
}
你是否也可以發表你稱之爲的線,以及周圍的fourier變換? – 2010-07-18 00:02:24