#include <processor_sparx.h>
Inheritance diagram for EMAN::MirrorProcessor:
Public Member Functions | |
void | process_inplace (EMData *image) |
To process an image in-place. | |
string | get_name () const |
Get the processor's name. | |
TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
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.mirror" |
axis | ''x', 'y', or 'z' axis, means mirror by changing the sign of the respective axis; |
Definition at line 48 of file processor_sparx.h.
string EMAN::MirrorProcessor::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 71 of file processor_sparx.h.
00072 { 00073 return "Mirrors an image along the specified axis. This will shift the image center for even box sizes. Use the 'xform.flip' processor to preserve center."; 00074 }
string EMAN::MirrorProcessor::get_name | ( | ) | const [inline, virtual] |
Get the processor's name.
Each processor is identified by a unique name.
Implements EMAN::Processor.
Definition at line 54 of file processor_sparx.h.
References NAME.
00055 { 00056 return NAME; 00057 }
TypeDict EMAN::MirrorProcessor::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 64 of file processor_sparx.h.
References EMAN::TypeDict::put(), and EMAN::EMObject::STRING.
00065 { 00066 TypeDict d; 00067 d.put("axis", EMObject::STRING, "'x', 'y', or 'z' axis"); 00068 return d; 00069 }
static Processor* EMAN::MirrorProcessor::NEW | ( | ) | [inline, static] |
void MirrorProcessor::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.
image | The image to be processed. |
Implements EMAN::Processor.
Definition at line 8174 of file processor.cpp.
References EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), LOGWARN, EMAN::Processor::params, and EMAN::EMData::update().
08175 { 08176 if (!image) { 08177 LOGWARN("NULL Image"); 08178 return; 08179 } 08180 08181 string axis = (const char*)params["axis"]; 08182 08183 float* data = image->EMData::get_data(); 08184 08185 int nx = image->get_xsize(); 08186 int ny = image->get_ysize(); 08187 int nz = image->get_zsize(); 08188 size_t nxy = nx*ny; 08189 08190 int x_start = 1-nx%2; 08191 int y_start = 1-ny%2; 08192 int z_start = 1-nz%2; 08193 08194 if (axis == "x" || axis == "X") { 08195 for (int iz = 0; iz < nz; iz++) 08196 for (int iy = 0; iy < ny; iy++) { 08197 int offset = nx*iy + nxy*iz; 08198 reverse(&data[offset+x_start],&data[offset+nx]); 08199 } 08200 } else if (axis == "y" || axis == "Y") { 08201 float *tmp = new float[nx]; 08202 int nhalf = ny/2; 08203 size_t beg = 0; 08204 for (int iz = 0; iz < nz; iz++) { 08205 beg = iz*nxy; 08206 for (int iy = y_start; iy < nhalf; iy++) { 08207 memcpy(tmp, &data[beg+iy*nx], nx*sizeof(float)); 08208 memcpy(&data[beg+iy*nx], &data[beg+(ny-iy-1+y_start)*nx], nx*sizeof(float)); 08209 memcpy(&data[beg+(ny-iy-1+y_start)*nx], tmp, nx*sizeof(float)); 08210 } 08211 } 08212 delete[] tmp; 08213 } else if (axis == "z" || axis == "Z") { 08214 if(1-z_start) { 08215 int nhalf = nz/2; 08216 float *tmp = new float[nxy]; 08217 for(int iz = 0;iz<nhalf;iz++){ 08218 memcpy(tmp,&data[iz*nxy],nxy*sizeof(float)); 08219 memcpy(&data[iz*nxy],&data[(nz-iz-1)*nxy],nxy*sizeof(float)); 08220 memcpy(&data[(nz-iz-1)*nxy],tmp,nxy*sizeof(float)); 08221 } 08222 delete[] tmp; 08223 } else { 08224 float *tmp = new float[nx]; 08225 int nhalf = nz/2; 08226 size_t beg = 0; 08227 for (int iy = 0; iy < ny; iy++) { 08228 beg = iy*nx; 08229 for (int iz = z_start; iz < nhalf; iz++) { 08230 memcpy(tmp, &data[beg+ iz*nxy], nx*sizeof(float)); 08231 memcpy(&data[beg+iz*nxy], &data[beg+(nz-iz-1+z_start)*nxy], nx*sizeof(float)); 08232 memcpy(&data[beg+(nz-iz-1+z_start)*nxy], tmp, nx*sizeof(float)); 08233 } 08234 } 08235 delete[] tmp; 08236 } 08237 } 08238 08239 image->update(); 08240 }
const string MirrorProcessor::NAME = "xform.mirror" [static] |