#include <cmp.h>
Inheritance diagram for EMAN::QuadMinDotCmp:
Public Member Functions | |
float | cmp (EMData *image, EMData *with) const |
To compare 'image' with another image passed in through its parameters. | |
string | get_name () const |
Get the Cmp's name. | |
string | get_desc () const |
TypeDict | get_param_types () const |
Get Cmp parameter information in a dictionary. | |
Static Public Member Functions | |
Cmp * | NEW () |
Static Public Attributes | |
const string | NAME = "quadmindot" |
negative | Returns -1 * dot product, default true | |
normalize | Returns normalized dot product -1.0 - 1.0 |
Definition at line 356 of file cmp.h.
|
To compare 'image' with another image passed in through its parameters. An optional transformation may be used to transform the 2 images.
Implements EMAN::Cmp. Definition at line 621 of file cmp.cpp. References EMAN::EMData::get_array_offsets(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), InvalidValueException, nx, ny, EMAN::EMData::set_array_offsets(), EMAN::Dict::set_default(), sqrt(), EMAN::Cmp::validate_input_args(), x, and y. 00622 { 00623 ENTERFUNC; 00624 validate_input_args(image, with); 00625 00626 if (image->get_zsize()!=1) throw InvalidValueException(0, "QuadMinDotCmp supports 2D only"); 00627 00628 int nx=image->get_xsize(); 00629 int ny=image->get_ysize(); 00630 00631 int normalize = params.set_default("normalize", 0); 00632 float negative = (float)params.set_default("negative", 1); 00633 00634 if (negative) negative=-1.0; else negative=1.0; 00635 00636 double result[4] = { 0,0,0,0 }, sq1[4] = { 0,0,0,0 }, sq2[4] = { 0,0,0,0 } ; 00637 00638 vector<int> image_saved_offsets = image->get_array_offsets(); 00639 vector<int> with_saved_offsets = with->get_array_offsets(); 00640 image->set_array_offsets(-nx/2,-ny/2); 00641 with->set_array_offsets(-nx/2,-ny/2); 00642 int i,x,y; 00643 for (y=-ny/2; y<ny/2; y++) { 00644 for (x=-nx/2; x<nx/2; x++) { 00645 int quad=(x<0?0:1) + (y<0?0:2); 00646 result[quad]+=(*image)(x,y)*(*with)(x,y); 00647 if (normalize) { 00648 sq1[quad]+=(*image)(x,y)*(*image)(x,y); 00649 sq2[quad]+=(*with)(x,y)*(*with)(x,y); 00650 } 00651 } 00652 } 00653 image->set_array_offsets(image_saved_offsets); 00654 with->set_array_offsets(with_saved_offsets); 00655 00656 if (normalize) { 00657 for (i=0; i<4; i++) result[i]/=sqrt(sq1[i]*sq2[i]); 00658 } else { 00659 for (i=0; i<4; i++) result[i]/=nx*ny/4; 00660 } 00661 00662 float worst=static_cast<float>(result[0]); 00663 for (i=1; i<4; i++) if (static_cast<float>(result[i])<worst) worst=static_cast<float>(result[i]); 00664 00665 EXITFUNC; 00666 return (float) (negative*worst); 00667 }
|
|
Implements EMAN::Cmp. Definition at line 366 of file cmp.h. 00367 { 00368 return "Caclultes dot product for each quadrant and returns worst value (default -1 * dot product)"; 00369 }
|
|
Get the Cmp's name. Each Cmp is identified by a unique name.
Implements EMAN::Cmp. Definition at line 361 of file cmp.h. 00362 {
00363 return NAME;
00364 }
|
|
Get Cmp parameter information in a dictionary. Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.
Implements EMAN::Cmp. Definition at line 376 of file cmp.h. References EMAN::TypeDict::put(). 00377 { 00378 TypeDict d; 00379 d.put("negative", EMObject::INT, "If set, returns -1 * dot product. Default = true (smaller is better)"); 00380 d.put("normalize", EMObject::INT, "If set, returns normalized dot product -1.0 - 1.0."); 00381 return d; 00382 }
|
|
Definition at line 371 of file cmp.h. 00372 { 00373 return new QuadMinDotCmp(); 00374 }
|
|
|