EMAN2
Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions
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

static ProcessorNEW ()

Static Public Attributes

static 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:
nsampe_rate

Definition at line 3774 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:
tothe smaller image that will store the shrunken values
fromthe larger image that will be used to calculate the shrunken values
shrinkfactorthe shrink amount

Definition at line 2144 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.

                                                                                                      {
        int nx = from->get_xsize();
        int ny = from->get_ysize();
        int nz = from->get_zsize();

        int new_nx = static_cast<int>( static_cast<float> (nx) / sample_rate);
        int new_ny = static_cast<int>( static_cast<float> (ny) / sample_rate);
        int new_nz = static_cast<int>( static_cast<float> (nz) / sample_rate);

        if (new_nx == 0) throw UnexpectedBehaviorException("The resample rate causes the pixel dimensions in the x direction to go to zero");
        if (new_ny == 0) new_ny = 1;
        if (new_nz == 0) new_nz = 1;

        int ndim = from->get_ndim();
        if ( ndim < 3 ) {
                new_nz = 1;
        }
        if ( ndim < 2 ) {
                new_ny = 1;
        }

        int fft_x_correction = 1;
        if (new_nx % 2 == 0) fft_x_correction = 2;

        int fft_y_correction = 0;
        if (ny != 1 && new_ny % 2 == 0 && ny % 2 == 1) fft_y_correction = 1;
        else if (ny != 1 && new_ny % 2 == 1 && ny % 2 == 0) fft_y_correction = -1;

        int fft_z_correction = 0;
        if (nz != 1 && new_nz % 2 == 0 && nz % 2 == 1) fft_z_correction = 1;
        else if (nz != 1 && new_nz % 2 == 1 && nz % 2 == 0) fft_z_correction = -1;

        if ( ! to->is_complex()) to->do_fft_inplace();

        if (ndim != 1) to->process_inplace("xform.fourierorigin.tocenter");

        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);
        to->clip_inplace(clip);

        if (fft_x_correction == 1) to->set_fftodd(true);
        else to->set_fftodd(false);

        if (ndim != 1) to->process_inplace("xform.fourierorigin.tocorner");

        to->do_ift_inplace();
        to->depad_corner();

}
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 3781 of file processor.h.

                        {
                                return "Robust resampling of an image by clipping its Fourier transform.";
                        }
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 3786 of file processor.h.

References NAME.

                        {
                                return NAME;
                        }
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 3795 of file processor.h.

References EMAN::EMObject::FLOAT, and EMAN::TypeDict::put().

                        {
                                TypeDict d;
                                d.put("n", EMObject::FLOAT, "The sample rate. Less than one enlarges the image, greater than one shrinks it.");
                                return d;
                        }
static Processor* EMAN::FFTResampleProcessor::NEW ( ) [inline, static]

Definition at line 3790 of file processor.h.

                        {
                                return new FFTResampleProcessor();
                        }
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:
imageThe 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 2109 of file processor.cpp.

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

{
        float sample_rate = params.set_default("n",0.0f);
        if (sample_rate <= 0.0F  )  {
                throw InvalidValueException(sample_rate,        "sample rate must be >0 ");
        }

        EMData* result;
        if (image->is_complex()) result = image->copy();
        else result = image->do_fft();
        fft_resample(result,image,sample_rate);
        // The image may have been padded - we should shift it so that the phase origin is where FFTW expects it
        result->update();
        result->scale_pixel(sample_rate);
        return result;
}
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:
imageThe image to be processed.

Implements EMAN::Processor.

Definition at line 2126 of file processor.cpp.

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

{
        if (image->is_complex()) throw ImageFormatException("Error, the fft resampling processor does not work on complex images");


        float sample_rate = params.set_default("n",0.0f);
        if (sample_rate <= 0.0F  )  {
                throw InvalidValueException(sample_rate,        "sample rate (n) must be >0 ");
        }

        fft_resample(image,image,sample_rate);

        image->scale_pixel(sample_rate);
        image->update();


}

Member Data Documentation

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

Definition at line 3802 of file processor.h.

Referenced by get_name().


The documentation for this class was generated from the following files: