import ij.*; import ij.process.*; import ij.measure.Calibration; import ij.gui.*; import java.awt.*; import ij.plugin.*; public class Averaging_Reducer implements PlugIn { static int xshrink=2, yshrink=2; double product; int[] pixel = new int[3]; int[] sum = new int[3]; int samples; public void run(String arg) { ImagePlus imp = IJ.getImage(); if (showDialog()) { ImagePlus imp2 = shrink(imp); imp2.show(); imp2.setSlice(imp2.getStackSize()/2); imp2.getProcessor().resetMinAndMax(); } } public ImagePlus shrink(ImagePlus imp) { ImageStack stack1 = imp.getStack(); ImageStack stack2 = new ImageStack(imp.getWidth()/xshrink,imp.getHeight()/yshrink); int n = stack1.getSize(); for (int i=1; i<=n; i++) { IJ.showStatus(i+"/"+n); IJ.showProgress(i, n); ImageProcessor ip2 = shrink(stack1.getProcessor(i)); stack2.addSlice(null, ip2); } ImagePlus imp2 = new ImagePlus("Reduced "+imp.getShortTitle(), stack2); imp2.setCalibration(imp.getCalibration()); Calibration cal2 = imp2.getCalibration(); if (cal2.scaled()) { cal2.pixelWidth *= xshrink; cal2.pixelHeight *= yshrink; } return imp2; } public ImageProcessor shrink(ImageProcessor ip) { if (ip instanceof FloatProcessor) return shrinkFloat(ip); samples = ip instanceof ColorProcessor?3:1; int w = ip.getWidth()/xshrink; int h = ip.getHeight()/yshrink; ImageProcessor ip2 = ip.createProcessor(w, h); for (int y=0; y