#include <processor.h>
Inheritance diagram for EMAN::ScaleTransformProcessor:
Public Member Functions | |||||||
virtual string | get_name () const | ||||||
Get the processor's name. | |||||||
virtual void | process_inplace (EMData *image) | ||||||
| |||||||
virtual EMData * | process (const EMData *const image) | ||||||
| |||||||
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 Processor * | NEW () | ||||||
Static Public Attributes | |||||||
static const string | NAME = "xform.scale" |
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.
virtual string EMAN::ScaleTransformProcessor::get_desc | ( | ) | const [inline, virtual] |
Get the descrition of this specific processor.
This function must be overwritten by a subclass.
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.
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.
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 }
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] |
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 }
const string ScaleTransformProcessor::NAME = "xform.scale" [static] |