#include <aligner.h>


Public Member Functions | |
| virtual EMData * | align (EMData *this_img, EMData *to_img, const string &cmp_name="dot", const Dict &cmp_params=Dict()) const |
| To align 'this_img' with another image passed in through its parameters. | |
| virtual EMData * | align (EMData *this_img, EMData *to_img) const |
| virtual string | get_name () const |
| Get the Aligner's name. | |
| virtual string | get_desc () const |
| virtual TypeDict | get_param_types () const |
Static Public Member Functions | |
| static Aligner * | NEW () |
It calculates the shift for a translational alignment, then do the translation.
| intonly | Integer pixel translations only | |
| maxshift | Maximum translation in pixels | |
| nozero | Zero translation not permitted (useful for CCD images) |
Definition at line 173 of file aligner.h.
| EMData * TranslationalAligner::align | ( | EMData * | this_img, | |
| EMData * | to_img, | |||
| const string & | cmp_name = "dot", |
|||
| const Dict & | cmp_params = Dict() | |||
| ) | const [virtual] |
To align 'this_img' with another image passed in through its parameters.
The alignment uses a user-given comparison method to compare the two images. If none is given, a default one is used.
| this_img | The image to be compared. | |
| to_img | 'this_img" is aligned with 'to_img'. | |
| cmp_name | The comparison method to compare the two images. | |
| cmp_params | The parameter dictionary for comparison method. |
Implements EMAN::Aligner.
Definition at line 72 of file aligner.cpp.
References EMAN::EMData::calc_ccf(), EMAN::EMData::calc_max_location_wrap(), calc_max_location_wrap_cuda(), EMAN::EMData::get_data(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), ImageDimensionException, EMAN::EMUtil::is_same_size(), nx, ny, EMAN::Aligner::params, EMAN::EMData::process(), EMAN::EMData::process_inplace(), EMAN::EMData::set_attr(), EMAN::Dict::set_default(), EMAN::Transform::set_trans(), t, EMAN::EMData::update(), and EMAN::EMData::zero_corner_circulant().
Referenced by align().
00074 { 00075 if (!this_img) { 00076 return 0; 00077 } 00078 00079 if (to && !EMUtil::is_same_size(this_img, to)) 00080 throw ImageDimensionException("Images must be the same size to perform translational alignment"); 00081 00082 EMData *cf = 0; 00083 int nx = this_img->get_xsize(); 00084 int ny = this_img->get_ysize(); 00085 int nz = this_img->get_zsize(); 00086 00087 int masked = params.set_default("masked",0); 00088 bool use_cpu = true; 00089 #ifdef EMAN2_USING_CUDA 00090 if (this_img->gpu_operation_preferred() ) { 00091 // cout << "Translate on GPU" << endl; 00092 use_cpu = false; 00093 cf = this_img->calc_ccf_cuda(to,false,false); 00094 } 00095 #endif // EMAN2_USING_CUDA 00096 if (use_cpu) cf = this_img->calc_ccf(to); 00097 00098 // This is too expensive 00099 if (masked) { 00100 EMData *msk=this_img->process("threshold.notzero"); 00101 EMData *sqr=to->process("math.squared"); 00102 EMData *cfn=msk->calc_ccf(sqr); 00103 cfn->process_inplace("math.sqrt"); 00104 float *d1=cf->get_data(); 00105 float *d2=cfn->get_data(); 00106 for (int i=0; i<nx*ny*nz; i++) { 00107 if (d2[i]!=0) d1[i]/=d2[i]; 00108 } 00109 cf->update(); 00110 delete msk; 00111 delete sqr; 00112 delete cfn; 00113 } 00114 00115 // 00116 00117 int maxshiftx = params.set_default("maxshift",-1); 00118 int maxshifty = params["maxshift"]; 00119 int maxshiftz = params["maxshift"]; 00120 int nozero = params["nozero"]; 00121 00122 if (maxshiftx <= 0) { 00123 maxshiftx = nx / 4; 00124 maxshifty = ny / 4; 00125 maxshiftz = nz / 4; 00126 } 00127 00128 if (maxshiftx > nx / 2 - 1) maxshiftx = nx / 2 - 1; 00129 if (maxshifty > ny / 2 - 1) maxshifty = ny / 2 - 1; 00130 if (maxshiftz > nz / 2 - 1) maxshiftz = nz / 2 - 1; 00131 00132 if (nx == 1) maxshiftx = 0; // This is justhere for completeness really... plus it saves errors 00133 if (ny == 1) maxshifty = 0; 00134 if (nz == 1) maxshiftz = 0; 00135 00136 // If nozero the portion of the image in the center (and its 8-connected neighborhood) is zeroed 00137 if (nozero) { 00138 cf->zero_corner_circulant(1); 00139 } 00140 00141 IntPoint peak; 00142 #ifdef EMAN2_USING_CUDA 00143 if (!use_cpu) { 00144 EMDataForCuda tmp = cf->get_data_struct_for_cuda(); 00145 int* p = calc_max_location_wrap_cuda(&tmp,maxshiftx, maxshifty, maxshiftz); 00146 peak = IntPoint(p[0],p[1],p[2]); 00147 free(p); 00148 } 00149 #endif // EMAN2_USING_CUDA 00150 if (use_cpu) { 00151 peak = cf->calc_max_location_wrap(maxshiftx, maxshifty, maxshiftz); 00152 } 00153 Vec3f cur_trans = Vec3f ( (float)-peak[0], (float)-peak[1], (float)-peak[2]); 00154 00155 if (!to) { 00156 cur_trans /= 2.0f; // If aligning theimage to itself then only go half way - 00157 int intonly = params.set_default("intonly",false); 00158 if (intonly) { 00159 cur_trans[0] = floor(cur_trans[0] + 0.5f); 00160 cur_trans[1] = floor(cur_trans[1] + 0.5f); 00161 cur_trans[2] = floor(cur_trans[2] + 0.5f); 00162 } 00163 } 00164 00165 if( cf ){ 00166 delete cf; 00167 cf = 0; 00168 } 00169 Dict params("trans",static_cast< vector<int> >(cur_trans)); 00170 cf=this_img->process("math.translate.int",params); 00171 Transform t; 00172 t.set_trans(cur_trans); 00173 if ( nz != 1 ) { 00174 // Transform* t = get_set_align_attr("xform.align3d",cf,this_img); 00175 // t->set_trans(cur_trans); 00176 cf->set_attr("xform.align3d",&t); 00177 } else if ( ny != 1 ) { 00178 //Transform* t = get_set_align_attr("xform.align2d",cf,this_img); 00179 cur_trans[2] = 0; // just make sure of it 00180 t.set_trans(cur_trans); 00181 cf->set_attr("xform.align2d",&t); 00182 } 00183 00184 return cf; 00185 }
| virtual EMData* EMAN::TranslationalAligner::align | ( | EMData * | this_img, | |
| EMData * | to_img | |||
| ) | const [inline, virtual] |
Implements EMAN::Aligner.
Definition at line 179 of file aligner.h.
References align().
00180 { 00181 return align(this_img, to_img, "", Dict()); 00182 }
| virtual string EMAN::TranslationalAligner::get_name | ( | ) | const [inline, virtual] |
Get the Aligner's name.
Each Aligner is identified by a unique name.
Implements EMAN::Aligner.
Definition at line 184 of file aligner.h.
| virtual string EMAN::TranslationalAligner::get_desc | ( | ) | const [inline, virtual] |
| static Aligner* EMAN::TranslationalAligner::NEW | ( | ) | [inline, static] |
| virtual TypeDict EMAN::TranslationalAligner::get_param_types | ( | ) | const [inline, virtual] |
Implements EMAN::Aligner.
Definition at line 199 of file aligner.h.
References EMAN::EMObject::INT, and EMAN::TypeDict::put().
00200 { 00201 TypeDict d; 00202 d.put("intonly", EMObject::INT,"Integer pixel translations only"); 00203 d.put("maxshift", EMObject::INT,"Maximum translation in pixels"); 00204 d.put("masked", EMObject::INT,"Treat zero pixels in 'this' as a mask for normalization (default false)"); 00205 d.put("nozero", EMObject::INT,"Zero translation not permitted (useful for CCD images)"); 00206 return d; 00207 }
1.5.6