fftw如何使用fftw和opencv将图像分解为其幅度和相位

时间:2014-09-10 11:42:10

标签: c++ c matlab opencv fftw

目前我使用opencv加载了一个图像,并尝试使用fftw_plan_dft_2d将其分解为其幅度和相位分量。这是我的代码,但我无法获得正确的结果。 编辑(从评论中添加):我已经在matlab中完成了代码,我只是尝试将matlab代码转换为c / c ++,但我不确定它是否以这种方式被分解为幅度和阶段

int main(){

    cv::Mat img1=cv::imread("Lena.bmp",0);
    cv::Mat img2;

    fftw_complex    *in;
    fftw_complex    *fft;        
    fftw_plan       p;
    int nx=img1.rows;
    int ny=img1.cols;

    int i,j;

    img2=img1.clone();

    in =  ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * nx * ny );
    fft = ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * nx * ny );

    int **x=new int*[nx];
    for(i=0;i<nx;i++)
        x[i]=new int[ny];

    int **y=new int*[nx];
    for(i=0;i<nx;i++)
        y[i]=new int[ny];

    for(i=0;i<nx;i++)
        for(j=0;j<ny;j++)
        {
            x[i][j]=j+1;
            y[i][j]=i+1;
        }
    for( i = 0; i < nx ; i++ ) {
        for( j = 0 ; j < ny ; j++ ) {
            in[i*ny+j][0] =( ( double )img1.data[i * ny + j]*pow(-1,x[i][j]+y[i][j]));
            in[i*ny+j][1] = 0.0;
        }
    }

    p = fftw_plan_dft_2d( nx , ny, in, fft,  FFTW_FORWARD,  FFTW_ESTIMATE );
         // perform FFT
      fftw_execute( p );


    cv::Mat mag(img1.size(),img1.type());
    cv::Mat pha(img1.size(),img1.type());

    double **magf=new double*[nx];
    for(i=0;i<nx;i++)
        magf[i]=new double[ny];

    double **phaf=new double*[nx];
    for(i=0;i<nx;i++)
        phaf[i]=new double[ny];

    fftw_complex *e = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nx*ny);

    float pi=3.14156;
    for(i=0;i<nx;i++)
        for(j=0;j<ny;j++)
        {
            /*fft[i*ny+j][0]/=(double)nx*ny;
            fft[i*ny+j][1]/=(double)nx*ny;*/
            magf[i][j]=(double)sqrt(pow(fft[i*ny+j][0],2.0)+pow(fft[i*ny+j][1],2.0));
            phaf[i][j]=atan2(fft[i*ny+j][0],fft[i*ny+j][1]);
            e[i*ny+j][0]=cos(phaf[i][j]);
            e[i*ny+j][1]=sin(phaf[i][j]);
        }

    for(i=0;i<nx;i++)
        for(j=0;j<ny;j++)
        {
            mag.data[i*ny+j]=magf[i][j];
        }

    cv::namedWindow("magnitude",1);
    cv::imshow("magnitude",mag);

    fftw_complex* G= (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nx*ny);
    fftw_complex* H= (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nx*ny);
    for(i=0;i<nx;i++)
        for(j=0;j<ny;j++)
        {
            G[i*ny+j][0]=magf[i][j]*e[i*ny+j][0];
            G[i*ny+j][1]=magf[i][j]*e[i*ny+j][1];
        }

    p = fftw_plan_dft_2d(nx,ny, G, H, FFTW_BACKWARD, FFTW_ESTIMATE);
    //// normalize IFFT result
      for( i = 0 ; i < ( nx * ny ) ; i++ ) {
          H[i][0] /= ( double )( nx * ny );
      }

    //  // copy IFFT result to img2's data
    for( i = 0 ; i < nx ; i++ ) {
        for( j = 0 ; j < ny ; j++ ) {
            img2.data[i * ny + j] = ( uchar )(H[i * ny + j][0]*pow(-1,x[i][j]+y[i][j]));
        }
    }


    cv::namedWindow("recover",1);
    cv::imshow("recover",img2);

    /*cv::namedWindow( "original_image", CV_WINDOW_AUTOSIZE );
    cv::namedWindow( "IFFT", CV_WINDOW_AUTOSIZE );
    cv::imshow( "original_image", img1 );
    cv::imshow( "IFFT", img2 );

    cv::waitKey(0);*/
    cv::waitKey(0);
    fftw_destroy_plan( p );
    //fftw_destroy_plan( plan_b );
    fftw_free( in );
    fftw_free( fft );
    //fftw_free( ifft );


    return 0;
}

0 个答案:

没有答案