All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ij.plugin.ImageCalculator Maven / Gradle / Ivy

Go to download

ImageJ is an open source Java image processing program inspired by NIH Image for the Macintosh.

There is a newer version: 1.54m
Show newest version
package ij.plugin;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.plugin.filter.*;
import ij.measure.Calibration;
import ij.plugin.frame.Recorder;
import ij.macro.Interpreter;

/** This plugin implements the Process/Image Calculator command.
   // test script
   imp1 = IJ.openImage("http://imagej.nih.gov/ij/images/boats.gif")
   imp2 = IJ.openImage("http://imagej.nih.gov/ij/images/bridge.gif")
   imp3 = ImageCalculator.run(imp1, imp2, "add create 32-bit");
   imp3.show();
*/ public class ImageCalculator implements PlugIn { private static String[] operators = {"Add","Subtract","Multiply","Divide", "AND", "OR", "XOR", "Min", "Max", "Average", "Difference", "Copy", "Transparent-zero"}; private static String[] lcOperators = {"add","sub","mul","div", "and", "or", "xor", "min", "max", "ave", "diff", "copy", "zero"}; private static int operator; private static String title1 = ""; private static String title2 = ""; private static boolean createWindow = true; private static boolean floatResult; private boolean processStack; private boolean macroCall; public void run(String arg) { int[] wList = WindowManager.getIDList(); if (wList==null) { IJ.noImage(); return; } IJ.register(ImageCalculator.class); String[] titles = new String[wList.length]; for (int i=0; i imp3 = ImageCalculator.run(imp1, imp2, "divide create 32-bit");
divides 'imp1' by 'imp2' and returns the result as a new 32-bit image. */ public static ImagePlus run(ImagePlus img1, ImagePlus img2, String operation) { ImageCalculator ic = new ImageCalculator(); return ic.run(operation, img1, img2); } public ImagePlus run(String operation, ImagePlus img1, ImagePlus img2) { if (img1==null || img2==null || operation==null) return null; operator = getOperator(operation); if (operator==-1) throw new IllegalArgumentException("No valid operator"); createWindow = operation.indexOf("create")!=-1; floatResult= operation.indexOf("32")!=-1 || operation.indexOf("float")!=-1; processStack = operation.indexOf("stack")!=-1; return calculate(img1, img2, true); } /** * @deprecated * replaced by run(String,ImagePlus,ImagePlus) */ public void calculate(String operation, ImagePlus img1, ImagePlus img2) { if (img1==null || img2==null || operation==null) return; operator = getOperator(operation); if (operator==-1) {IJ.error("Image Calculator", "No valid operator"); return;} createWindow = operation.indexOf("create")!=-1; floatResult = operation.indexOf("32")!=-1 || operation.indexOf("float")!=-1; processStack = operation.indexOf("stack")!=-1; macroCall = true; ImagePlus img3 = calculate(img1, img2, true); if (img3!=null) img3.show(); } int getOperator(String options) { options = options.toLowerCase(); int op= -1; if (options.indexOf("xor")!=-1) op = 6; if (op==-1) { for (int i=0; i1||size2>1)) img3 = doStackOperation(img1, img2); else img3 = doOperation(img1, img2); if (img3==null && !macroCall && (img1.getWindow()==null)) img3 = img1; return img3; } boolean stackOp = false; if (size1>1) { int result = IJ.setupDialog(img1, PlugInFilter.NO_CHANGES); if (result==PlugInFilter.DONE) return null; processStack = (result&PlugInFilter.DOES_STACKS)!=0; if (processStack) { if (img1.getStack().isVirtual()) createWindow = true; img3 = doStackOperation(img1, img2); stackOp = true; } else img3 = doOperation(img1, img2); } else img3 = doOperation(img1, img2); if (Recorder.record) { String options = operators[operator]; if (createWindow) options += " create"; if (floatResult) options += " 32-bit"; if (stackOp) options += " stack"; if (Recorder.scriptMode()) { Recorder.recordCall("ImagePlus", "imp1 = WindowManager.getImage(\""+img1.getTitle()+"\");"); Recorder.recordCall("ImagePlus", "imp2 = WindowManager.getImage(\""+img2.getTitle()+"\");"); Recorder.recordCall("ImagePlus", "imp3 = ImageCalculator.run(imp1, imp2, \""+options+"\");"); Recorder.recordCall("imp3.show();"); } else Recorder.record("imageCalculator", options, img1.getTitle(), img2.getTitle()); Recorder.setCommand(null); // don't record run(...) } return img3; } /** img1 = img2 op img2 (e.g. img1 = img2/img1) */ ImagePlus doStackOperation(ImagePlus img1, ImagePlus img2) { ImagePlus img3 = null; int size1 = img1.getStackSize(); int size2 = img2.getStackSize(); if (size1>1 && size2>1 && size1!=size2) { IJ.error("Image Calculator", "'Image1' and 'image2' must be stacks with the same\nnumber of slices, or 'image2' must be a single image."); return null; } if (createWindow) { img1 = duplicateStack(img1); if (img1==null) { IJ.error("Calculator", "Out of memory"); return null; } img3 = img1; } int mode = getBlitterMode(); ImageWindow win = img1.getWindow(); if (win!=null) WindowManager.setCurrentWindow(win); else if (Interpreter.isBatchMode() && !createWindow && WindowManager.getImage(img1.getID())!=null) IJ.selectWindow(img1.getID()); Undo.reset(); ImageStack stack1 = img1.getStack(); StackProcessor sp = new StackProcessor(stack1, img1.getProcessor()); try { if (size2==1) sp.copyBits(img2.getProcessor(), 0, 0, mode); else sp.copyBits(img2.getStack(), 0, 0, mode); } catch (IllegalArgumentException e) { IJ.error("\""+img1.getTitle()+"\": "+e.getMessage()); return null; } img1.setStack(null, stack1); if (img1.getType()!=ImagePlus.GRAY8) { img1.getProcessor().resetMinAndMax(); } if (img3==null) img1.updateAndDraw(); return img3; } ImagePlus doOperation(ImagePlus img1, ImagePlus img2) { ImagePlus img3 = null; int mode = getBlitterMode(); ImageProcessor ip1 = img1.getProcessor(); ImageProcessor ip2 = img2.getProcessor(); Calibration cal1 = img1.getCalibration(); Calibration cal2 = img2.getCalibration(); if (createWindow) ip1 = createNewImage(ip1, ip2); else { ImageWindow win = img1.getWindow(); if (win!=null) WindowManager.setCurrentWindow(win); else if (Interpreter.isBatchMode() && !createWindow && WindowManager.getImage(img1.getID())!=null) IJ.selectWindow(img1.getID()); ip1.snapshot(); Undo.setup(Undo.FILTER, img1); } boolean rgb = ip2 instanceof ColorProcessor; if (floatResult && !rgb) ip2 = ip2.convertToFloat(); try { ip1.copyBits(ip2, 0, 0, mode); } catch (IllegalArgumentException e) { IJ.error("\""+img1.getTitle()+"\": "+e.getMessage()); return null; } if (floatResult && rgb) ip1 = ip1.convertToFloat(); if (!(ip1 instanceof ByteProcessor)) ip1.resetMinAndMax(); if (createWindow) { img3 = new ImagePlus("Result of "+img1.getTitle(), ip1); img3.setCalibration(cal1); } else img1.updateAndDraw(); return img3; } ImageProcessor createNewImage(ImageProcessor ip1, ImageProcessor ip2) { int width = Math.min(ip1.getWidth(), ip2.getWidth()); int height = Math.min(ip1.getHeight(), ip2.getHeight()); ImageProcessor ip3 = ip1.createProcessor(width, height); if (floatResult && !(ip1 instanceof ColorProcessor)) { ip1 = ip1.convertToFloat(); ip3 = ip3.convertToFloat(); } ip3.insert(ip1, 0, 0); return ip3; } private int getBlitterMode() { int mode=0; switch (operator) { case 0: mode = Blitter.ADD; break; case 1: mode = Blitter.SUBTRACT; break; case 2: mode = Blitter.MULTIPLY; break; case 3: mode = Blitter.DIVIDE; break; case 4: mode = Blitter.AND; break; case 5: mode = Blitter.OR; break; case 6: mode = Blitter.XOR; break; case 7: mode = Blitter.MIN; break; case 8: mode = Blitter.MAX; break; case 9: mode = Blitter.AVERAGE; break; case 10: mode = Blitter.DIFFERENCE; break; case 11: mode = Blitter.COPY; break; case 12: mode = Blitter.COPY_ZERO_TRANSPARENT; break; } return mode; } ImagePlus duplicateStack(ImagePlus img1) { Calibration cal = img1.getCalibration(); ImageStack stack1 = img1.getStack(); int width = stack1.getWidth(); int height = stack1.getHeight(); int n = stack1.getSize(); ImageStack stack2 = img1.createEmptyStack(); try { for (int i=1; i<=n; i++) { ImageProcessor ip1 = stack1.getProcessor(i); ip1.resetRoi(); ImageProcessor ip2 = ip1.crop(); if (floatResult) { ip2.setCalibrationTable(cal.getCTable()); ip2 = ip2.convertToFloat(); } stack2.addSlice(stack1.getSliceLabel(i), ip2); } } catch(OutOfMemoryError e) { stack2.trim(); stack2 = null; return null; } ImagePlus img3 = new ImagePlus("Result of "+img1.getTitle(), stack2); img3.setCalibration(cal); if (img3.getStackSize()==n) { int[] dim = img1.getDimensions(); img3.setDimensions(dim[2], dim[3], dim[4]); if (img1.isComposite()) { img3 = new CompositeImage(img3, 0); ((CompositeImage)img3).copyLuts(img1); } if (img1.isHyperStack()) img3.setOpenAsHyperStack(true); } return img3; } }



© 2015 - 2024 Weber Informatics LLC | Privacy Policy