Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

EMAN::FFTResampleProcessor Class Reference

FFTResampleProcessor resamples an image by clipping the Fourier Transform This is the same as multipyling the FT by a box window, in real space this is a convolution that will induce rippling. More...

#include <processor.h>

Inheritance diagram for EMAN::FFTResampleProcessor:

Inheritance graph
[legend]
Collaboration diagram for EMAN::FFTResampleProcessor:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual EMDataprocess (const EMData *const image)
 To proccess an image out-of-place.
virtual void process_inplace (EMData *image)
 To process an image in-place.
string get_desc () const
 Get the descrition of this specific processor.
string get_name () const
 Get the processor's name.
TypeDict get_param_types () const
 Get processor parameter information in a dictionary.

Static Public Member Functions

ProcessorNEW ()

Static Public Attributes

const string NAME = "math.fft.resample"

Private Member Functions

void fft_resample (EMData *to, const EMData *const from, const float &sample_rate)
 An internal function that encapsulates a routine common to both process and process inplace.

Detailed Description

FFTResampleProcessor resamples an image by clipping the Fourier Transform This is the same as multipyling the FT by a box window, in real space this is a convolution that will induce rippling.

Hence it should probably be combined with a damping function near the edge Works for even/odd, 1D, 2D and 3D images (completely robust, tested)

Author:
David Woolford
Date:
June 2009
Parameters:
n sampe_rate

Definition at line 3365 of file processor.h.


Member Function Documentation

void FFTResampleProcessor::fft_resample EMData to,
const EMData *const   from,
const float &  sample_rate
[private]
 

An internal function that encapsulates a routine common to both process and process inplace.

Parameters:
to the smaller image that will store the shrunken values
from the larger image that will be used to calculate the shrunken values
shrinkfactor the shrink amount

Definition at line 1997 of file processor.cpp.

References EMAN::EMData::clip_inplace(), EMAN::EMData::depad_corner(), EMAN::EMData::do_fft_inplace(), EMAN::EMData::do_ift_inplace(), EMAN::EMData::get_ndim(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::EMData::is_complex(), nx, ny, EMAN::EMData::process_inplace(), EMAN::EMData::set_fftodd(), and UnexpectedBehaviorException.

Referenced by process(), and process_inplace().

01997                                                                                                       {
01998         int nx = from->get_xsize();
01999         int ny = from->get_ysize();
02000         int nz = from->get_zsize();
02001 
02002         int new_nx = static_cast<int>( static_cast<float> (nx) / sample_rate);
02003         int new_ny = static_cast<int>( static_cast<float> (ny) / sample_rate);
02004         int new_nz = static_cast<int>( static_cast<float> (nz) / sample_rate);
02005 
02006         if (new_nx == 0) throw UnexpectedBehaviorException("The resample rate causes the pixel dimensions in the x direction to go to zero");
02007         if (new_ny == 0) new_ny = 1;
02008         if (new_nz == 0) new_nz = 1;
02009 
02010         int ndim = from->get_ndim();
02011         if ( ndim < 3 ) {
02012                 new_nz = 1;
02013         }
02014         if ( ndim < 2 ) {
02015                 new_ny = 1;
02016         }
02017 
02018         int fft_x_correction = 1;
02019         if (new_nx % 2 == 0) fft_x_correction = 2;
02020 
02021         int fft_y_correction = 0;
02022         if (ny != 1 && new_ny % 2 == 0 && ny % 2 == 1) fft_y_correction = 1;
02023         else if (ny != 1 && new_ny % 2 == 1 && ny % 2 == 0) fft_y_correction = -1;
02024 
02025         int fft_z_correction = 0;
02026         if (nz != 1 && new_nz % 2 == 0 && nz % 2 == 1) fft_z_correction = 1;
02027         else if (nz != 1 && new_nz % 2 == 1 && nz % 2 == 0) fft_z_correction = -1;
02028 
02029         if ( ! to->is_complex()) to->do_fft_inplace();
02030 
02031         if (ndim != 1) to->process_inplace("xform.fourierorigin.tocenter");
02032 
02033         Region clip(0,(ny-new_ny)/2-fft_y_correction,(nz-new_nz)/2-fft_z_correction,new_nx+fft_x_correction,new_ny,new_nz);
02034         to->clip_inplace(clip);
02035 
02036         if (fft_x_correction == 1) to->set_fftodd(true);
02037         else to->set_fftodd(false);
02038 
02039         if (ndim != 1) to->process_inplace("xform.fourierorigin.tocorner");
02040 
02041         to->do_ift_inplace();
02042         to->depad_corner();
02043 
02044 }

string EMAN::FFTResampleProcessor::get_desc  )  const [inline, virtual]
 

Get the descrition of this specific processor.

This function must be overwritten by a subclass.

Returns:
The description of this processor.

Implements EMAN::Processor.

Definition at line 3372 of file processor.h.

03373                         {
03374                                 return "Robust resampling of an image by clipping its Fourier transform.";
03375                         }

string EMAN::FFTResampleProcessor::get_name  )  const [inline, virtual]
 

Get the processor's name.

Each processor is identified by a unique name.

Returns:
The processor's name.

Implements EMAN::Processor.

Definition at line 3377 of file processor.h.

03378                         {
03379                                 return NAME;
03380                         }

TypeDict EMAN::FFTResampleProcessor::get_param_types  )  const [inline, virtual]
 

Get processor parameter information in a dictionary.

Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.

Returns:
A dictionary containing the parameter info.

Reimplemented from EMAN::Processor.

Definition at line 3386 of file processor.h.

References EMAN::TypeDict::put().

03387                         {
03388                                 TypeDict d;
03389                                 d.put("n", EMObject::FLOAT, "The sample rate. Less than one enlarges the image, greater than one shrinks it.");
03390                                 return d;
03391                         }

Processor* EMAN::FFTResampleProcessor::NEW  )  [inline, static]
 

Definition at line 3381 of file processor.h.

03382                         {
03383                                 return new FFTResampleProcessor();
03384                         }

EMData * FFTResampleProcessor::process const EMData *const   image  )  [virtual]
 

To proccess an image out-of-place.

For those processors which can only be processed out-of-place, override this function to give the right behavior.

Parameters:
image The image will be copied, actual process happen on copy of image.
Returns:
the image processing result, may or may not be the same size of the input image

Reimplemented from EMAN::Processor.

Definition at line 1962 of file processor.cpp.

References EMAN::EMData::copy(), EMAN::EMData::do_fft(), fft_resample(), InvalidValueException, EMAN::EMData::is_complex(), EMAN::EMData::scale_pixel(), EMAN::Dict::set_default(), and EMAN::EMData::update().

01963 {
01964         float sample_rate = params.set_default("n",0.0f);
01965         if (sample_rate <= 0.0F  )  {
01966                 throw InvalidValueException(sample_rate,        "sample rate must be >0 ");
01967         }
01968 
01969         EMData* result;
01970         if (image->is_complex()) result = image->copy();
01971         else result = image->do_fft();
01972         fft_resample(result,image,sample_rate);
01973         // The image may have been padded - we should shift it so that the phase origin is where FFTW expects it
01974         result->update();
01975         result->scale_pixel(sample_rate);
01976         return result;
01977 }

void FFTResampleProcessor::process_inplace EMData image  )  [virtual]
 

To process an image in-place.

For those processors which can only be processed out-of-place, override this function to just print out some error message to remind user call the out-of-place version.

Parameters:
image The image to be processed.

Implements EMAN::Processor.

Definition at line 1979 of file processor.cpp.

References fft_resample(), ImageFormatException, InvalidValueException, EMAN::EMData::is_complex(), EMAN::EMData::scale_pixel(), EMAN::Dict::set_default(), and EMAN::EMData::update().

01980 {
01981         if (image->is_complex()) throw ImageFormatException("Error, the fft resampling processor does not work on complex images");
01982 
01983 
01984         float sample_rate = params.set_default("n",0.0f);
01985         if (sample_rate <= 0.0F  )  {
01986                 throw InvalidValueException(sample_rate,        "sample rate (n) must be >0 ");
01987         }
01988 
01989         fft_resample(image,image,sample_rate);
01990 
01991         image->scale_pixel(sample_rate);
01992         image->update();
01993 
01994 
01995 }


Member Data Documentation

const string FFTResampleProcessor::NAME = "math.fft.resample" [static]
 

Definition at line 122 of file processor.cpp.


The documentation for this class was generated from the following files:
Generated on Thu Dec 9 13:47:59 2010 for EMAN2 by  doxygen 1.3.9.1