package fr.unistra.pelican.algorithms.arithmetic; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.BooleanImage; import fr.unistra.pelican.ByteImage; import fr.unistra.pelican.DoubleImage; import fr.unistra.pelican.Image; import fr.unistra.pelican.IntegerImage; /** * Are two image equals? Comparison is done at the minimum precision format of * the two images. * * @author ?, Bnejamin Perret */ public class Equal extends Algorithm { /** * Input image 1 */ public Image inputImage1; /** * Input image 2 */ public Image inputImage2; /** * Result of comparision */ public Boolean result; /** * Constructor * */ public Equal() { super(); super.inputs = "inputImage1,inputImage2"; super.outputs = "result"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() throws AlgorithmException { result = false; // Check format if (inputImage1.getXDim() != inputImage2.getXDim() || inputImage1.getYDim() != inputImage2.getYDim() || inputImage1.getZDim() != inputImage2.getZDim() || inputImage1.getTDim() != inputImage2.getTDim() || inputImage1.getBDim() != inputImage2.getBDim()) return; int size = inputImage1.size(); // Check values if (inputImage1 instanceof BooleanImage || inputImage2 instanceof BooleanImage) { for (int i = 0; i < size; ++i) if (inputImage1.getPixelBoolean(i) != inputImage2 .getPixelBoolean(i)) if ( !(!inputImage1.isPresent(i) && !inputImage2.isPresent(i)) ) return; } else if (inputImage1 instanceof ByteImage || inputImage2 instanceof ByteImage) { for (int i = 0; i < size; ++i) if (inputImage1.getPixelByte(i) != inputImage2.getPixelByte(i)) if ( !(!inputImage1.isPresent(i) && !inputImage2.isPresent(i)) ) return; } else if (inputImage1 instanceof IntegerImage || inputImage2 instanceof IntegerImage) { for (int i = 0; i < size; ++i) if (inputImage1.getPixelInt(i) != inputImage2.getPixelInt(i)) if ( !(!inputImage1.isPresent(i) && !inputImage2.isPresent(i)) ) return; } else if (inputImage1 instanceof DoubleImage || inputImage2 instanceof DoubleImage) { for (int i = 0; i < size; ++i) if (Math.abs(inputImage1.getPixelDouble(i) - inputImage2.getPixelDouble(i)) > 0.0000001) if ( !(!inputImage1.isPresent(i) && !inputImage2.isPresent(i)) ) return; } else throw new AlgorithmException("Strange image format?!"); result = true; } /** * Are two image equals? Comparison is done at the minimum precision format of * the two images. * * @param inputImage1 input image 1 * @param inputImage2 input image 2 * @return result of comparision of image 1 and 2 */ public static boolean exec(Image inputImage1, Image inputImage2) { return (Boolean) new Equal().process(inputImage1, inputImage2); } }