EMAN2
Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes
EMAN::TomoTiltEdgeMaskProcessor Class Reference

A processor designed specifically for tomographic tilt series data. More...

#include <processor.h>

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

List of all members.

Classes

class  GaussianFunctoid

Public Member Functions

virtual void process_inplace (EMData *image)
 To process an image in-place.
virtual string get_name () const
 Get the processor's name.
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 = "tomo.tiltedgemask"

Detailed Description

A processor designed specifically for tomographic tilt series data.

This processors masks out 'mass' in tilted images that is not present in the zero-tilt (0 degrees) image. It does this based on the tilt angle. The tilt angle can be extracted from the image metadata (stored as the euler_alt attribute), or it may be specified explicitly (specifying the angle is the default behavior). The masked out regions at both sides of the image are set to 0 by default, but can also be set to the mean of the nearest non-masked data edge (in the y direction), or similarly the mean of both non-masked data edges on either side of the image. A gaussian fall-off is optional (but off by default).

Author:
David Woolford <woolford@bcm.edu>
Date:
01/10/2008
Parameters:
biedgemeanMutually exclusive of edgemean. Experimental. Causes the pixels in the masked out areas to take the average value of both the left and right edge pixel strips
edgemeanMutually exclusive of biedgemean. Masked pixels values assume the mean edge pixel value, independently, for both sides of the image
angleThe angle that the image is, with respect to the zero tilt image
angle_fimRead fim as 'from image metadata' - this causes the altitude angle stored in by the image object (i.e. as extracted from the header, as currently stored in memory) to be used as the angle. This overrides the angle argument
gauss_falloffCauses the edge masking to have a smooth Gaussian fall-off - this parameter specifies how many pixels the fall-off will proceed over. Default is 0
gauss_sigmaThe sigma of the Gaussian function used to smooth the edge fall-off (functional form is exp(-(pixel distance)^2/sigma^2)

Definition at line 7138 of file processor.h.


Member Function Documentation

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

                {
                        return "Masks the part of the image which is not present in the 0-tilt image. Masked areas can be 0 or set to the edgemean (of the nearest or both edges). Masked areas can also have a Gaussian fall-off to make the appearance smooth.";
                }
virtual string EMAN::TomoTiltEdgeMaskProcessor::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 7143 of file processor.h.

References NAME.

                {
                        return NAME;
                }
virtual TypeDict EMAN::TomoTiltEdgeMaskProcessor::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 7153 of file processor.h.

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

                {
                        TypeDict d;
                        d.put("biedgemean", EMObject::BOOL, "Mutually  exclusive of edgemean. Experimental. Causes the pixels in the masked out areas to take the average value of both the left and right edge pixel strips");
                        d.put("edgemean", EMObject::BOOL, "Mutually  exclusive of biedgemean. Masked pixels values assume the mean edge pixel value, independently, for both sides of the image.");
                        d.put("angle", EMObject::INT, "The angle that the image is, with respect to the zero tilt image");
                        d.put("gauss_falloff",EMObject::INT, "Causes the edge masking to have a smooth Gaussian fall-off - this parameter specifies how many pixels the fall-off will proceed over. Default is 0.");
                        d.put("gauss_sigma",EMObject::FLOAT,"The sigma of the Gaussian function used to smooth the edge fall-off (functional form is exp(-(pixel distance)^2/sigma^2)");
                        d.put("angle_fim",EMObject::BOOL,"Read fim as 'from image metadata' - this causes the altitude angle stored in by the image object (i.e. as extracted from the header, as currently stored in memory) to be used as the angle. This overrides the angle argument");
                        return d;
                }
static Processor* EMAN::TomoTiltEdgeMaskProcessor::NEW ( ) [inline, static]

Definition at line 7148 of file processor.h.

                {
                        return new TomoTiltEdgeMaskProcessor();
                }
void TomoTiltEdgeMaskProcessor::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 10179 of file processor.cpp.

References EMAN::EMData::get_attr(), EMAN::Transform::get_params(), EMAN::EMData::get_value_at(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), InvalidParameterException, ny, EMAN::Processor::params, EMAN::EMData::process_inplace(), EMAN::Dict::set_default(), EMAN::EMData::set_value_at(), t, and EMAN::EMData::update().

{
        bool biedgemean = params.set_default("biedgemean", false);
        bool edgemean = params.set_default("edgemean", false);
        // You can only do one of these - so if someone specifies them both the code complains loudly
        if (biedgemean && edgemean) throw InvalidParameterException("The edgemean and biedgemean options are mutually exclusive");

        bool fim = params.set_default("angle_fim", false);
        float alt;
        if ( fim ) {
                Transform* t = (Transform*)image->get_attr("xform.projection");
                Dict d = t->get_params("eman");
                alt = (float) d["alt"];
                if(t) {delete t; t=0;}
        }
        else alt = params.set_default("angle", 0.0f);


        float cosine = cos(alt*M_PI/180.0f);

        // Zero the edges
        int nx = image->get_xsize();
        int ny = image->get_ysize();
        int x_clip = static_cast<int>( (float) nx * ( 1.0 - cosine ) / 2.0);

        float x1_edge_mean = 0.0;
        float x2_edge_mean = 0.0;

        if ( biedgemean )
        {
                float edge_mean = 0.0;

                // Accrue the pixel densities on the side strips
                for ( int i = 0; i < ny; ++i ) {
                        edge_mean += image->get_value_at(x_clip, i );
                        edge_mean += image->get_value_at(nx - x_clip-1, i );
                }
                // Now make it so the mean is stored
                edge_mean /= 2*ny;

                // Now shift pixel values accordingly
                for ( int i = 0; i < ny; ++i ) {
                        for ( int j = nx-1; j >= nx - x_clip; --j) {
                                image->set_value_at(j,i,edge_mean);
                        }
                        for ( int j = 0; j < x_clip; ++j) {
                                image->set_value_at(j,i,edge_mean);
                        }
                }
                x1_edge_mean = edge_mean;
                x2_edge_mean = edge_mean;
        }
        else if (edgemean)
        {
                for ( int i = 0; i < ny; ++i ) {
                        x1_edge_mean += image->get_value_at(x_clip, i );
                        x2_edge_mean += image->get_value_at(nx - x_clip-1, i );
                }
                x1_edge_mean /= ny;
                x2_edge_mean /= ny;

                for ( int i = 0; i < ny; ++i ) {
                        for ( int j = 0; j < x_clip; ++j) {
                                image->set_value_at(j,i,x1_edge_mean);
                        }
                        for ( int j = nx-1; j >= nx - x_clip; --j) {
                                image->set_value_at(j,i,x2_edge_mean);
                        }
                }
        }
        else
        {
                // The edges are just zeroed -
                Dict zero_dict;
                zero_dict["x0"] = x_clip;
                zero_dict["x1"] = x_clip;
                zero_dict["y0"] = 0;
                zero_dict["y1"] = 0;
                image->process_inplace( "mask.zeroedge2d", zero_dict );
        }

        int gauss_rad = params.set_default("gauss_falloff", 0);
        if ( gauss_rad != 0)
        {
                // If the gaussian falloff distance is greater than x_clip, it will technically
                // go beyond the image boundaries. Thus we clamp gauss_rad so this cannot happen.
                // Therefore, there is potential here for (benevolent) unexpected behavior.
                if ( gauss_rad > x_clip ) gauss_rad = x_clip;

                float gauss_sigma = params.set_default("gauss_sigma", 3.0f);
                if ( gauss_sigma < 0 ) throw InvalidParameterException("Error - you must specify a positive, non-zero gauss_sigma");
                float sigma = (float) gauss_rad/gauss_sigma;

                GaussianFunctoid gf(sigma);

                for ( int i = 0; i < ny; ++i ) {

                        float left_value = image->get_value_at(x_clip, i );
                        float scale1 = left_value-x1_edge_mean;

                        float right_value = image->get_value_at(nx - x_clip - 1, i );
                        float scale2 = right_value-x2_edge_mean;

                        for ( int j = 1; j < gauss_rad; ++j )
                        {
                                image->set_value_at(x_clip-j, i, scale1*gf((float)j)+x1_edge_mean );
                                image->set_value_at(nx - x_clip + j-1, i, scale2*gf((float)j)+x2_edge_mean);
                        }
                }
        }

        image->update();
}

Member Data Documentation

const string TomoTiltEdgeMaskProcessor::NAME = "tomo.tiltedgemask" [static]

Definition at line 7170 of file processor.h.

Referenced by get_name().


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