※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

/**
* @brief test of fftw r2c transform
* @author maeda
* @date 2008/09/24
*/
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include "fftw3.h"
 
#include "powerspectol.h"
 
#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.lib" )
#pragma comment( lib, "fftw3.lib" )
 
int main( void )
{
	IplImage *img     = NULL;
	IplImage *imgman  = NULL;
	IplImage *show    = NULL;
	IplImage *spectol = NULL;
	CvSize size;
	fftw_complex *out = NULL;
	fftw_plan plan    = NULL;
	int width,height;
	int i,j;
 
	// (1) load image (unsigned char)
	img = cvLoadImage( "lena.bmp", CV_LOAD_IMAGE_GRAYSCALE );
	if( !img ){
		printf("no image.\n");
		return false;
	}
 
	width  = img->width;
	height = img->height;
	size = cvSize( width/2+1, height );
 
	out     = (fftw_complex*)fftw_malloc( sizeof(fftw_complex) * (width/2 + 1) * height );
	spectol = cvCreateImage( size, IPL_DEPTH_64F, 1 );
	show    = cvCreateImage( size, IPL_DEPTH_8U, 1 );
	imgman  = cvCreateImage( cvSize( width, height ), IPL_DEPTH_64F, 1 );
 
	if( !imgman || !out || !spectol || !show ){
		printf("failed to allocate memory.\n");
		return false;
	}
 
	// (2) convert image (unsigned char->double)
	cvScale( img, imgman );
 
	plan = fftw_plan_dft_r2c_2d( height, width, (double*)imgman->imageData, out, FFTW_ESTIMATE );
	if( !plan ){
		printf("failed to create plan\n");
		return false;
	}
 
	// (3) fft (double->fftw_complex)
	fftw_execute(plan);
 
	// (4) get powerspectol (fftw_complex->double)
	maGetPowerSpectol2D( out, (double*)spectol->imageData, width/2+1, height );
 
	// (5) convert image (double->unsigned char)
	cvScale( spectol, show, 255 );
 
	// (6) show result
	cvNamedWindow( "window" );
	cvShowImage( "window", show );
	cvWaitKey(0);
	cvDestroyWindow( "window" );
 
	if( out     ) fftw_free( out );
	if( img     ) cvReleaseImage( &img );
	if( imgman  ) cvReleaseImage( &imgman );
	if( show    ) cvReleaseImage( &show );
	if( spectol ) cvReleaseImage( &spectol );
	if( plan    ) fftw_destroy_plan( plan );
 
	return true;
 
}