package ij.plugin;
import ij.*;
import ij.process.*;
import ij.plugin.filter.Analyzer;
import ij.measure.*;
import ij.gui.Roi;
import java.awt.Rectangle;
public class Stack_Statistics implements PlugIn {
public void run(String arg) {
ImagePlus imp = IJ.getImage();
double histMax = imp.getBitDepth()==8||imp.getBitDepth()==24?256.0:0.0;
int measurements = Analyzer.getMeasurements();
Analyzer.setMeasurements(measurements | Measurements.LIMIT);
ImageStatistics stats = new StackStatistics(imp, 256, 0.0, histMax);
Analyzer.setMeasurements(measurements);
ResultsTable rt = Analyzer.getResultsTable();
rt.incrementCounter();
Roi roi = imp.getRoi();
if (roi!=null && !roi.isArea()) {
imp.deleteRoi();
roi = null;
}
double stackVoxels = 0.0;
double images = imp.getStackSize();
if (roi==null)
stackVoxels = imp.getWidth()*imp.getHeight()*images;
else if (roi.getType()==Roi.RECTANGLE) {
Rectangle r = roi.getBounds();
stackVoxels = r.width*r.height*images;
} else {
Analyzer.setMeasurements(measurements & ~Measurements.LIMIT);
ImageStatistics stats2 = new StackStatistics(imp, 256, 0.0, histMax);
Analyzer.setMeasurements(measurements);
stackVoxels = stats2.longPixelCount;
}
Calibration cal = imp.getCalibration();
String units = cal.getUnits();
double scale = cal.pixelWidth*cal.pixelHeight*cal.pixelDepth;
rt.addValue("Voxels", stats.longPixelCount);
if (scale!=1.0)
rt.addValue("Volume("+units+"^3)", stats.longPixelCount*scale);
rt.addValue("%Volume", stats.longPixelCount*100.0/stackVoxels);
rt.addValue("Mean", stats.mean);
rt.addValue("StdDev", stats.stdDev);
rt.addValue("Min", stats.min);
rt.addValue("Max", stats.max);
rt.addValue("Mode", stats.dmode);
rt.show("Results");
}
}