2010-06-28 7 views
1

Je suis en train de jouer avec OpenCV, et j'essaie de faire les mêmes choses que moi dans MatLab. Je cherche à masquer certaines fréquences, j'ai donc construit une matrice qui va le faire. Le problème est qu'il semble y avoir quelques étapes supplémentaires dans OpenCV que dans Matlab pour accomplir ceci.
Dans Matlab, il est assez simple:Fréquences de masquage dans une transformée de Fourier

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

Mais je vais avoir du mal à faire la même chose dans OpenCV. La DFT me laisse avec une image à 2 canaux, donc j'ai divisé l'image, multiplié par le masque, fusionné, puis effectuer la DFT inverse. Cependant, j'ai obtenu un résultat bizarre dans mon image finale. Je suis sûr que je me manque quelque chose ...

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

pourriez-vous également afficher les lignes où vous appelez cela, et les transformations de Fourier environnantes? –

Répondre

1

une raison quelconque vous fusionnez les composants réels et imaginaires dans l'ordre inverse?

+0

Non, désolé, c'est une faute de frappe – Simonw

Questions connexes