#include <processor.h>
Inheritance diagram for EMAN::CCDNormProcessor:
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 string | get_desc () const |
Get the descrition of this specific processor. | |
virtual TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
Static Public Member Functions | |
Processor * | NEW () |
Static Public Attributes | |
const string | NAME = "filter.ccdnorm" |
width | number of pixels on either side of the seam to sample |
Definition at line 6386 of file processor.h.
|
Get the descrition of this specific processor. This function must be overwritten by a subclass.
Implements EMAN::Processor. Definition at line 6401 of file processor.h. 06402 { 06403 return "normalize the 4 quadrants of a CCD image"; 06404 }
|
|
Get the processor's name. Each processor is identified by a unique name.
Implements EMAN::Processor. Definition at line 6391 of file processor.h. 06392 {
06393 return NAME;
06394 }
|
|
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 6406 of file processor.h. References EMAN::TypeDict::put(). 06407 { 06408 TypeDict d; 06409 d.put("width", EMObject::INT, "number of pixels on either side of the seam to sample"); 06410 return d; 06411 }
|
|
Definition at line 6396 of file processor.h. 06397 { 06398 return new CCDNormProcessor(); 06399 }
|
|
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.
Implements EMAN::Processor. Definition at line 7829 of file processor.cpp. References EMAN::Log::error(), EMAN::EMData::get_col(), EMAN::EMData::get_data(), EMAN::EMData::get_row(), EMAN::EMData::get_value_at(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::Log::logger(), EMAN::Log::set_level(), EMAN::EMData::set_value_at_fast(), x, and y. 07830 { 07831 if (!image) { 07832 Log::logger()->set_level(Log::ERROR_LOG); 07833 Log::logger()->error("Null image during call to CCDNorm\n"); 07834 return; 07835 } 07836 if (image->get_zsize() > 1) { 07837 Log::logger()->set_level(Log::ERROR_LOG); 07838 Log::logger()->error("CCDNorm does not support 3d images\n"); 07839 return; 07840 } 07841 07842 int xs = image->get_xsize(); 07843 int ys = image->get_ysize(); 07844 07845 // width of sample area on either side of the seams 07846 int width = params["width"]; 07847 07848 width%=(xs > ys ? xs/2 : ys/2); // make sure width is a valid value 07849 if (width==0) { 07850 width=1; 07851 } 07852 07853 // get the 4 "seams" of the image 07854 float *left, *right, *top, *bottom; 07855 07856 double *temp; 07857 temp= (double*)malloc((xs > ys ? xs*width : ys*width)*sizeof(double)); 07858 if (temp==NULL) { 07859 Log::logger()->set_level(Log::ERROR_LOG); 07860 Log::logger()->error("Could not allocate enough memory during call to CCDNorm\n"); 07861 return; 07862 } 07863 07864 int x, y, z; 07865 07866 // the mean values of each seam and the average 07867 double mL,mR,mT,mB; 07868 07869 // how much to shift each seam 07870 double nl,nr,nt,nb; 07871 07872 // quad. shifting amount 07873 double q1,q2,q3,q4; 07874 07875 // calc. the mean for each quadrant 07876 for (z=0; z<width; z++) { 07877 left = image->get_col(xs/2 -1-z)->get_data(); 07878 for (y=0; y<ys; y++) 07879 temp[z*ys+y]=left[y]; 07880 } 07881 mL=gsl_stats_mean(temp,1,ys*width); 07882 07883 for (z=0; z<width; z++) { 07884 right = image->get_col(xs/2 +z)->get_data(); 07885 for (y=0; y<ys; y++) 07886 temp[z*ys+y]=right[y]; 07887 } 07888 mR=gsl_stats_mean(temp,1,ys*width); 07889 07890 for (z=0; z<width; z++) { 07891 top = image->get_row(ys/2 -1-z)->get_data(); 07892 for (x=0; x<xs; x++) 07893 temp[z*xs+x]=top[x]; 07894 } 07895 mT=gsl_stats_mean(temp,1,xs*width); 07896 07897 for (z=0; z<width; z++) { 07898 bottom = image->get_row(ys/2 +z)->get_data(); 07899 for (x=0; x<xs; x++) 07900 temp[z*xs+x]=bottom[x]; 07901 } 07902 mB=gsl_stats_mean(temp,1,xs*width); 07903 07904 free(temp); 07905 07906 nl=(mL+mR)/2-mL; 07907 nr=(mL+mR)/2-mR; 07908 nt=(mT+mB)/2-mT; 07909 nb=(mT+mB)/2-mB; 07910 07911 q1=nl+nt; 07912 q2=nr+nt; 07913 q3=nr+nb; 07914 q4=nl+nb; 07915 07916 // change the pixel values 07917 for (x = 0; x < xs / 2; x++) 07918 for (y = 0; y < ys / 2; y++) { 07919 image->set_value_at_fast(x, y, image->get_value_at(x, y) + static_cast<float>(q1)); 07920 } 07921 for (x = xs / 2; x < xs; x++) 07922 for (y = 0; y < ys / 2; y++) { 07923 image->set_value_at_fast(x, y, image->get_value_at(x, y) + static_cast<float>(q2)); 07924 } 07925 for (x = xs / 2; x < xs; x++) 07926 for (y = ys / 2; y < ys; y++) { 07927 image->set_value_at_fast(x, y, image->get_value_at(x, y) + static_cast<float>(q3)); 07928 } 07929 for (x = 0; x < xs / 2; x++) 07930 for (y = ys / 2; y < ys; y++) { 07931 image->set_value_at_fast(x, y, image->get_value_at(x, y) + static_cast<float>(q4)); 07932 } 07933 07934 }
|
|
Definition at line 205 of file processor.cpp. |