目前我使用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;
}