#include <processor.h>
Inheritance diagram for EMAN::Rotate180Processor:
Public Member Functions | ||||
string | get_name () const | |||
Get the processor's name. | ||||
void | process_inplace (EMData *image) | |||
| ||||
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 = "math.rotate.180" |
Definition at line 1480 of file processor.h.
string EMAN::Rotate180Processor::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 1497 of file processor.h.
01498 { 01499 return "The 2D image is rotated by 180 degree by carefully swapping image pixel values. No explicit matrix multiplication is performed. If image dimensions are even will change pixels along x=0 and y=0. Works for all combinations of even and oddness."; 01500 }
string EMAN::Rotate180Processor::get_name | ( | ) | const [inline, virtual] |
Get the processor's name.
Each processor is identified by a unique name.
Implements EMAN::Processor.
Definition at line 1483 of file processor.h.
References NAME.
01484 { 01485 return NAME; 01486 }
static Processor* EMAN::Rotate180Processor::NEW | ( | ) | [inline, static] |
void Rotate180Processor::process_inplace | ( | EMData * | image | ) | [virtual] |
ImageDimensionException | if the image dimensions are not 2D |
Implements EMAN::Processor.
Definition at line 8826 of file processor.cpp.
References emdata_rotate_180(), ENTERFUNC, EXITFUNC, EMAN::EMData::get_data(), EMAN::EMData::get_ndim(), EMAN::EMData::get_value_at(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), ImageDimensionException, EMAN::EMData::set_value_at_fast(), t, EMAN::EMData::update(), and x.
08826 { 08827 ENTERFUNC; 08828 08829 08830 if (image->get_ndim() != 2) { 08831 throw ImageDimensionException("2D only"); 08832 } 08833 08834 #ifdef EMAN2_USING_CUDA 08835 if (EMData::usecuda == 1 && image->getcudarwdata()) { 08836 //cout << "CUDA rotate 180" << endl; 08837 emdata_rotate_180(image->getcudarwdata(), image->get_xsize(), image->get_ysize()); 08838 EXITFUNC; 08839 return; 08840 } 08841 #endif 08842 08843 float *d = image->get_data(); 08844 int nx = image->get_xsize(); 08845 int ny = image->get_ysize(); 08846 08847 // x and y offsets are used to handle even vs odd cases 08848 int x_offset = 0; 08849 if (nx % 2 == 1) x_offset=1; 08850 int y_offset = 0; 08851 if (ny % 2 == 1) y_offset=1; 08852 08853 bool stop = false; 08854 for (int x = 1; x <= (nx/2+x_offset); x++) { 08855 int y = 0; 08856 for (y = 1; y < (ny+y_offset); y++) { 08857 if (x == (nx / 2+x_offset) && y == (ny / 2+y_offset)) { 08858 stop = true; 08859 break; 08860 } 08861 int i = (x-x_offset) + (y-y_offset) * nx; 08862 int k = nx - x + (ny - y) * nx; 08863 08864 float t = d[i]; 08865 d[i] = d[k]; 08866 d[k] = t; 08867 } 08868 if (stop) break; 08869 } 08870 08871 /* Here we guard against irregularites that occur at the boundaries 08872 * of even dimensioned images. The basic policy is to replace the pixel 08873 * in row 0 and/or column 0 with those in row 1 and/or column 1, respectively. 08874 * The pixel at 0,0 is replaced with the pixel at 1,1 if both image dimensions 08875 * are even. FIXME - it may be better to use an average at the corner, in 08876 * this latter case, using pixels (1,1), (0,1) and (1,0). I am not sure. (dsawoolford) 08877 */ 08878 if (x_offset == 0) { 08879 for (int y = 0; y < ny; y++) { 08880 image->set_value_at_fast(0,y,image->get_value_at(1,y)); 08881 } 08882 } 08883 08884 if (y_offset == 0) { 08885 for (int x = 0; x < nx; x++) { 08886 image->set_value_at_fast(x,0,image->get_value_at(x,1)); 08887 } 08888 } 08889 08890 if (y_offset == 0 && x_offset == 0) { 08891 image->set_value_at_fast(0,0,image->get_value_at(1,1)); 08892 } 08893 08894 image->update(); 08895 EXITFUNC; 08896 }
const string Rotate180Processor::NAME = "math.rotate.180" [static] |