64 addUsageLine(
"Display statistics of 2D/3Dimages. A mask can be applied. Average Images may be computed");
67 addParamsLine(
"[-o <metadata>] : Save the statistics in this metadata file.");
68 addParamsLine(
"[--short_format] : Do not show labels for statistics.");
69 addParamsLine(
"[--show_angles] : Also show angles in the image header.");
70 addParamsLine(
"[--save_mask <maskFileName>] : Save 2D and 3D masks.");
71 addParamsLine(
"[--save_image_stats <stats_root=\"\">]: Save average and standard deviation images");
74 addUsageLine (
"NOTE: Geometry will NOT be applied to volumes even if apply_geo flag is on");
84 maskFileName =
getParam(
"--save_mask");
86 if ((save_image_stats =
checkParam(
"--save_image_stats")))
87 statsRoot =
getParam(
"--save_image_stats");
100 std::cout <<
" Statistics of " <<
fn_in << std::endl;
110 mean_min_val = 0, mean_max_val = 0, mean_avg = 0, mean_stddev = 0;
116 std::cout <<
"Format: Name ZxYxX min max avg stddev ";
118 std::cout <<
" <rot tilt psi>";
119 std::cout << '>
' << std::endl; 123 // get xdim, ydim,zdim 124 //getImageSize(mdIn, xDim, yDim, zDim, nDim, image_label); 125 averageArray.resize(ndimOut, zdimOut, ydimOut, xdimOut); 126 stdArray.resize(ndimOut,zdimOut,ydimOut,xdimOut); 127 averageArray.setXmippOrigin(); 128 stdArray.setXmippOrigin(); 130 // Generate mask if necessary 132 mask.generate_mask(zdimOut, ydimOut, xdimOut); 136 void processImage(const FileName &fnImg, const FileName &fnImgOut, const MDRow &rowIn, MDRow &rowOut) 139 image.readApplyGeo(fnImg, rowIn); 141 image.read(fnImg, DATA, ALL_IMAGES, true); 143 image().setXmippOrigin(); 145 double rot = 0, tilt = 0, psi = 0; 147 image.getEulerAngles(rot,tilt,psi); 151 computeStats_within_binary_mask(mask.get_binary_mask(), image(), min_val, max_val, 155 image().computeStats(avg, stddev, min_val, max_val); 159 //copy image from imageGeneric 160 image().getImage( dummyArray ); 161 averageArray += dummyArray; 162 stdArray += dummyArray * dummyArray; 168 std::cout << stringToString(fnImg, max_length + 1); 170 formatString("%4dx%4dx%4d ", zdimOut, ydimOut, xdimOut); 172 formatString("%4dx%4d", ydimOut, xdimOut); 176 std::cout << formatString("min=%10f max=%10f avg=%10f stddev=%10f", 177 min_val, max_val, avg, stddev); 180 std::cout << formatString("rot=%10f tilt=%10f psi=%10f", rot, tilt, psi); 183 std::cout << formatString("%10f %10f %10f %10f", min_val, max_val, avg, stddev); 186 id = DF_stats.addObject(); 187 DF_stats.setRow(rowIn,id); 188 DF_stats.setValue(MDL_MIN,min_val,id); 189 DF_stats.setValue(MDL_MAX,max_val,id); 190 DF_stats.setValue(MDL_AVG,avg,id); 191 DF_stats.setValue(MDL_STDDEV,stddev,id); 194 mean_min_val += min_val; 195 mean_max_val += max_val; 197 mean_stddev += stddev; 199 // Finish information ................................................. 201 std::cout << std::endl; 209 mean_min_val /= mdInSize; 210 mean_max_val /= mdInSize; 211 mean_avg /= mdInSize; 212 mean_stddev /= mdInSize; 216 // Show total statistics ------------------------------------------------ 217 std::cout << "==================================================\n"; 218 std::cout << "Total number of images/volumes: " << mdInSize << std::endl; 219 std::cout << stringToString(" ", max_length + 13); 221 std::cout << formatString("min=%10f max=%10f avg=%10f stddev=%10f", 222 mean_min_val, mean_max_val, mean_avg, mean_stddev); 224 std::cout << formatString("%10f %10f %10f %10f", mean_min_val, mean_max_val, mean_avg, mean_stddev); 225 std::cout << std::endl; 228 if (save_image_stats) 230 averageArray /= mdInSize; 233 stdArray= stdArray / mdInSize - averageArray * averageArray; 234 stdArray *= mdInSize / (mdInSize - 1); 235 //Do this as an image since it is not define for arrays 236 FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(stdArray) 237 DIRECT_MULTIDIM_ELEM(stdArray,n) = sqrt(fabs(DIRECT_MULTIDIM_ELEM(stdArray,n))); 240 stdArray.initZeros(); 244 // Save masks ----------------------------------------------------------- 246 mask.write_mask(maskFileName); 247 // Save statistics ------------------------------------------------------ 249 DF_stats.write(fn_out,MD_APPEND); 251 //save average and std images 254 Image<double> dummyImage; 255 dummyImage() = averageArray; 256 dummyImage.write(statsRoot + "average.xmp"); 257 dummyImage() = stdArray; 258 dummyImage.write(statsRoot + "stddev.xmp"); 261 };// end of class ProgStatistics
static void defineParams(XmippProgram *program, int allowed_data_types=ALL_KINDS, const char *prefix=nullptr, const char *comment=nullptr, bool moreOptions=false)
void addKeywords(const char *keywords)
MultidimArray< double > dummyArray
MultidimArray< double > averageArray
const char * getParam(const char *param, int arg=0)
void readParams(XmippProgram *program)
int verbose
Verbosity level.
MultidimArray< double > stdArray
bool checkParam(const char *param)
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)