package ij.plugin.filter; import ij.*; import ij.process.*; import ij.gui.*; import ij.measure.*; import ij.plugin.filter.Analyzer; import ij.util.Tools; import java.awt.Rectangle; /** Implements the Image/Stack/Plot Z-axis Profile command. */ public class ZAxisProfiler implements PlugInFilter, Measurements { ImagePlus imp; public int setup(String arg, ImagePlus imp) { this.imp = imp; return DOES_ALL+NO_CHANGES; } public void run(ImageProcessor ip) { if (imp.getStackSize()<2) { IJ.error("ZAxisProfiler", "This command requires a stack."); return; } Roi roi = imp.getRoi(); if (roi!=null && roi.isLine()) { IJ.error("ZAxisProfiler", "This command does not work with line selections."); return; } double minThreshold = ip.getMinThreshold(); double maxThreshold = ip.getMaxThreshold(); float[] y = getZAxisProfile(roi, minThreshold, maxThreshold); if (y!=null) { float[] x = new float[y.length]; for (int i=0; i<x.length; i++) x[i] = i+1; String title; if (roi!=null) { Rectangle r = imp.getRoi().getBounds(); title = imp.getTitle()+"-"+r.x+"-"+r.y; } else title = imp.getTitle()+"-0-0"; Plot plot = new Plot(title, "Slice", "Mean", x, y); double ymin = ProfilePlot.getFixedMin(); double ymax= ProfilePlot.getFixedMax(); if (!(ymin==0.0 && ymax==0.0)) { double[] a = Tools.getMinMax(x); double xmin=a[0]; double xmax=a[1]; plot.setLimits(xmin, xmax, ymin, ymax); } plot.show(); } } float[] getZAxisProfile(Roi roi, double minThreshold, double maxThreshold) { ImageStack stack = imp.getStack(); int size = stack.getSize(); float[] values = new float[size]; Calibration cal = imp.getCalibration(); Analyzer analyzer = new Analyzer(imp); int measurements = analyzer.getMeasurements(); boolean showResults = measurements!=0 && measurements!=LIMIT; boolean showingLabels = (measurements&LABELS)!=0 || (measurements&SLICE)!=0; measurements |= MEAN; if (showResults) { if (!analyzer.resetCounter()) return null; } int current = imp.getCurrentSlice(); for (int i=1; i<=size; i++) { if (showingLabels) imp.setSlice(i); ImageProcessor ip = stack.getProcessor(i); if (minThreshold!=ImageProcessor.NO_THRESHOLD) ip.setThreshold(minThreshold,maxThreshold,ImageProcessor.NO_LUT_UPDATE); ip.setRoi(roi); ImageStatistics stats = ImageStatistics.getStatistics(ip, measurements, cal); analyzer.saveResults(stats, roi); if (showResults) analyzer.displayResults(); values[i-1] = (float)stats.mean; } if (showingLabels) imp.setSlice(current); return values; } }