Getting two images with cv::DFT function in OpenCV
===

Here is my code for Weiner Filtering of an image:


    const char* filename = "1.jpg";

    cv::Mat I = cv::imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
    if( I.empty())
        return -1;
    
    cv::Mat padded;
    int m = cv::getOptimalDFTSize( I.rows );
    int n = cv::getOptimalDFTSize( I.cols );
    copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));

    cv::Mat planes[] = {cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F)};
    cv::Mat complexI;
    cv::merge(planes, 2, complexI);

    cv::dft(complexI, complexI);
	cv::split(complexI, planes);
    cv::magnitude(planes[0], planes[1], planes[0]); 
    cv::Mat magI = planes[0];
    
    magI += cv::Scalar::all(1);
    cv::log(magI, magI);

    cv::normalize(magI, magI, 0, 1, CV_MINMAX);
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//Calculate h(x,y)
	double fun_s = 25.1;
	double h_xy_const = fun_s / (2 * PI);
	double exp_term;
	double h_xy_sum = 0.0;

	double **h_xy = new double* [I.rows];
	for(int k = 0; k < I.rows; k++)
	{
		h_xy[k] = new double[I.rows];
	}

	for(int i=0; i < I.rows; i++)             
	{
		for(int j=0; j < I.rows; j++)         
		{
			exp_term = pow(i, 2.0) + pow(j, 2.0);
			exp_term = pow(exp_term, 0.5);
			h_xy[i][j] = (double)(h_xy_const * exp(-fun_s * exp_term));
			h_xy_sum += h_xy[i][j];
		}
	}
	//Normalize h(x,y)
	for(int i=0; i < I.rows; i++)             
	{
		for(int j=0; j < I.rows; j++)         
		{
			h_xy[i][j] /= h_xy_sum;
		}
	}
	//Create H(u,v)
	cv::Mat H_uv(I.rows, I.cols, CV_32F);
	for(int i=0; i < I.rows; i++)             
	{
		for(int j=0; j < I.rows; j++)         
		{
			H_uv.at<float>(i,j) = h_xy[i][j];
		}
	}
	

	cv::Mat H_padded;
    copyMakeBorder(H_uv, H_padded, 0, m - I.rows, 0, n - I.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));

    cv::Mat H_planes[] = {cv::Mat_<float>(H_padded), cv::Mat::zeros(H_padded.size(), CV_32F)};
    cv::Mat H_complexI;
    cv::merge(H_planes, 2, H_complexI); 
	
    cv::dft(H_complexI, H_complexI); 


	
	cv::split(H_complexI, H_planes); 
    cv::magnitude(H_planes[0], H_planes[1], H_planes[0]); 
    cv::Mat H_magI = H_planes[0];
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//Create G(u,v)
	cv::Mat G_uv;
	cv::multiply(H_complexI, complexI, G_uv);

	cv::Mat IG_uv;
	cv::dft(G_uv, IG_uv, CV_DXT_INVERSE);

	cv::split(IG_uv, planes);
    cv::magnitude(planes[0], planes[1], planes[0]); 
    cv::Mat G_uvmagI = planes[0];
    
    G_uvmagI += cv::Scalar::all(1);
    cv::log(G_uvmagI, G_uvmagI);

    cv::normalize(G_uvmagI, G_uvmagI, 0, 1, CV_MINMAX);
	cv::imshow("Degraded magnitude", G_uvmagI);
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//Create F'(u,v)
	double snr = 0.000000000001;
	float temp_val;
	cv::Mat FF_uv(I.rows, I.cols, CV_32F);
	for(int i=0; i < I.rows; i++)             
	{
		for(int j=0; j < I.rows; j++)         
		{
			temp_val = pow(H_magI.at<float>(i,j), 2) / (pow(H_magI.at<float>(i,j), 2) + snr);
			FF_uv.at<float>(i,j) = (temp_val * G_uv.at<float>(i,j)) / H_magI.at<float>(i,j);
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
	//Apply Final Inverse
	cv::dft(FF_uv, FF_uv, CV_DXT_INVERSE);
	cv::normalize(FF_uv, FF_uv, 0, 1, CV_MINMAX);
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    cv::imshow("Input Image", I);
	cv::imshow("Final magnitude", FF_uv);

But, when I display FF_uv, I am getting two images: one is original and one inverted images. I don't know where I made mistake........please help me......