EMAN::ScaleTransformProcessor Class Reference

Scale the image with control over the output dimensions. More...

#include <processor.h>

Inheritance diagram for EMAN::ScaleTransformProcessor:

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

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual string get_name () const
 Get the processor's name.
virtual void process_inplace (EMData *image)
 
Exceptions:
ImageDimensionException if the image is not 2D or 3D
InvalidParameterException if the Transform parameter is not specified

virtual EMDataprocess (const EMData *const image)
 
Exceptions:
ImageDimensionException if the image is not 2D or 3D
InvalidParameterException if the Transform parameter is not specified

virtual TypeDict get_param_types () const
 Get processor parameter information in a dictionary.
virtual string get_desc () const
 Get the descrition of this specific processor.

Static Public Member Functions

static ProcessorNEW ()

Static Public Attributes

static const string NAME = "xform.scale"

Detailed Description

Scale the image with control over the output dimensions.

Author:
David Woolford
Date:
June 2009
Parameters:
scale The amount by which to scale
cip The length of each output dimension. Non sophisticated, output dimensions can't be different

Definition at line 1620 of file processor.h.


Member Function Documentation

virtual string EMAN::ScaleTransformProcessor::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 1654 of file processor.h.

01655                                 {
01656                                         return "The image is scaled with the clip variable in mind, being sure to preserve as much pixel information as possible.";
01657                                 }

virtual string EMAN::ScaleTransformProcessor::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 1623 of file processor.h.

References NAME.

01624                                 {
01625                                         return NAME;
01626                                 }

virtual TypeDict EMAN::ScaleTransformProcessor::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 1644 of file processor.h.

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

01645                                 {
01646                                         TypeDict d;
01647                                         d.put("scale", EMObject::FLOAT, "The amount by which to scale" );
01648                                         d.put("clip", EMObject::INT, "The length of each output dimension. Non sophisticated, output dimensions can't be different" );
01651                                         return d;
01652                                 }

static Processor* EMAN::ScaleTransformProcessor::NEW (  )  [inline, static]

Definition at line 1627 of file processor.h.

01628                                 {
01629                                         return new ScaleTransformProcessor();
01630                                 }

EMData * ScaleTransformProcessor::process ( const EMData *const   image  )  [virtual]

Exceptions:
ImageDimensionException if the image is not 2D or 3D
InvalidParameterException if the Transform parameter is not specified

Reimplemented from EMAN::Processor.

Definition at line 8603 of file processor.cpp.

References EMAN::EMData::clip_inplace(), EMAN::EMData::copy(), EMAN::EMData::get_clip(), EMAN::EMData::get_ndim(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::Dict::has_key(), ImageDimensionException, InvalidParameterException, EMAN::Processor::params, EMAN::EMData::process(), EMAN::EMData::process_inplace(), EMAN::Dict::set_default(), t, and UnexpectedBehaviorException.

08603                                                                   {
08604         int ndim = image->get_ndim();
08605         if (ndim != 2 && ndim != 3) throw UnexpectedBehaviorException("The Scale Transform processors only works for 2D and 3D images");
08606 
08607         if ( image->get_xsize() != image->get_ysize()) {
08608                 throw ImageDimensionException("x size and y size of image do not match. This processor only works for uniformly sized data");
08609         }
08610         if ( ndim == 3 ) {
08611                 if ( image->get_xsize() != image->get_zsize()) {
08612                 throw ImageDimensionException("x size and z size of image do not match. This processor only works for uniformly sized data");
08613                 }
08614         }
08615 
08616         float scale = params.set_default("scale",0.0f);
08617         if (scale <= 0.0f) throw InvalidParameterException("The scale parameter must be greater than 0");
08618 
08619         int clip = 0;
08620 
08621         if(params.has_key("clip"))
08622         {
08623                 clip = params["clip"];
08624                 if (clip < 0) throw InvalidParameterException("The clip parameter must be greater than 0"); // If it's zero it's not used
08625         }
08626         else
08627         {
08628                 clip = (int)(scale*image->get_xsize());
08629         }
08630 
08631         Region r;
08632         if (ndim == 3) {
08633                  r = Region( (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2,clip, clip,clip);
08634         } else { // ndim == 2 guaranteed by check at beginning of function
08635                  r = Region( (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2, clip, clip);
08636         }
08637 
08638         EMData* ret = 0;
08639         if (scale > 1) {
08640                 if ( clip != 0) {
08641                         ret = image->get_clip(r);
08642                 }
08643                 Transform t;
08644                 t.set_scale(scale);
08645                 if (ret != 0) {
08646                         ret->process_inplace("xform",Dict("transform",&t));
08647                 } else {
08648                         ret = image->process("xform",Dict("transform",&t));
08649                 }
08650         } else if (scale < 1) {
08651                 Transform t;
08652                 t.set_scale(scale);
08653                 ret = image->process("xform",Dict("transform",&t));
08654                 if ( clip != 0) {
08655                         ret->clip_inplace(r);
08656                 }
08657         } else {
08658                 if ( clip != 0) {
08659                         ret = image->get_clip(r);
08660                 } else {
08661                         ret = image->copy();
08662                 }
08663         }
08664         return ret;
08665 
08666 }

void ScaleTransformProcessor::process_inplace ( EMData image  )  [virtual]

Exceptions:
ImageDimensionException if the image is not 2D or 3D
InvalidParameterException if the Transform parameter is not specified

Implements EMAN::Processor.

Definition at line 8547 of file processor.cpp.

References EMAN::EMData::clip_inplace(), EMAN::EMData::get_ndim(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::Dict::has_key(), ImageDimensionException, InvalidParameterException, EMAN::Processor::params, EMAN::EMData::process_inplace(), EMAN::Dict::set_default(), t, and UnexpectedBehaviorException.

08547                                                            {
08548         int ndim = image->get_ndim();
08549         if (ndim != 2 && ndim != 3) throw UnexpectedBehaviorException("The Scale Transform processors only works for 2D and 3D images");
08550 
08551         if ( image->get_xsize() != image->get_ysize()) {
08552                 throw ImageDimensionException("x size and y size of image do not match. This processor only works for uniformly sized data");
08553         }
08554         if ( ndim == 3 ) {
08555                 if ( image->get_xsize() != image->get_zsize()) {
08556                 throw ImageDimensionException("x size and z size of image do not match. This processor only works for uniformly sized data");
08557                 }
08558         }
08559 
08560         float scale = params.set_default("scale",0.0f);
08561         if (scale <= 0.0f) throw InvalidParameterException("The scale parameter must be greater than 0");
08562 
08563         int clip = 0;
08564 
08565         if(params.has_key("clip"))
08566         {
08567                 clip = params["clip"];
08568                 if (clip < 0) throw InvalidParameterException("The clip parameter must be greater than 0"); // If it's zero it's not used
08569         }
08570         else
08571         {
08572                 clip = (int)(scale*image->get_xsize());
08573         }
08574 
08575         Region r;
08576         if (ndim == 3) {
08577                  r = Region( (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2,clip, clip,clip);
08578         } else { // ndim == 2 guaranteed by check at beginning of function
08579                  r = Region( (image->get_xsize()-clip)/2, (image->get_xsize()-clip)/2, clip, clip);
08580         }
08581 
08582         if (scale > 1) {
08583                 if ( clip != 0) {
08584                         image->clip_inplace(r);
08585                 }
08586                 Transform t;
08587                 t.set_scale(scale);
08588                 image->process_inplace("xform",Dict("transform",&t));
08589         } else if (scale < 1) {
08590                 Transform t;
08591                 t.set_scale(scale);
08592                 image->process_inplace("xform",Dict("transform",&t));
08593                 if ( clip != 0) {
08594                         image->clip_inplace(r);
08595                 }
08596         } else {
08597                 if ( clip != 0) {
08598                         image->clip_inplace(r);
08599                 }
08600         }
08601 }


Member Data Documentation

const string ScaleTransformProcessor::NAME = "xform.scale" [static]

Definition at line 1659 of file processor.h.

Referenced by get_name().


The documentation for this class was generated from the following files:
Generated on Tue Jul 12 13:48:47 2011 for EMAN2 by  doxygen 1.4.7