package fr.unistra.pelican.algorithms.logical; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.BooleanImage; import fr.unistra.pelican.ByteImage; import fr.unistra.pelican.Image; import fr.unistra.pelican.IntegerImage; import fr.unistra.pelican.util.mask.MaskStack; /** * Computes the logical OR of two images. The outputImage is of the lowest * argument precision * * Mask management (by witz) : - computation with an unmasked pixel p and a * masked pixel p' results in value p. - computation with two masked pixels * results in value false. - the the output image mask is inputImage1 mask ORed * with inputImage2 mask * * @author Lefevre */ public class OR extends Algorithm { /** * First input image */ public Image inputImage1; /** * Second input image */ public Image inputImage2; /** * Output image */ public Image outputImage; /** * Constructor * */ public OR() { super(); super.inputs = "inputImage1,inputImage2"; super.outputs = "outputImage"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() throws AlgorithmException { int size = inputImage1.size(); boolean isHere1, isHere2; if (inputImage1 instanceof BooleanImage || inputImage2 instanceof BooleanImage) { outputImage = new BooleanImage(inputImage1, false); for (int i = 0; i < size; ++i) { boolean tmp = false; isHere1 = inputImage1.isPresent(i); isHere2 = inputImage2.isPresent(i); if (isHere1 && !isHere2) tmp = inputImage1.getPixelBoolean(i); else if (!isHere1 && isHere2) tmp = inputImage2.getPixelBoolean(i); else if (isHere1 && isHere2) tmp = inputImage1.getPixelBoolean(i) || inputImage2.getPixelBoolean(i); outputImage.setPixelBoolean(i, tmp); } } else if (inputImage1 instanceof ByteImage || inputImage2 instanceof ByteImage) { outputImage = new ByteImage(inputImage1, false); for (int i = 0; i < size; ++i) { int tmp = 0; isHere1 = inputImage1.isPresent(i); isHere2 = inputImage2.isPresent(i); if (isHere1 && !isHere2) tmp = inputImage1.getPixelByte(i); else if (!isHere1 && isHere2) tmp = inputImage2.getPixelByte(i); else if (isHere1 && isHere2) tmp = inputImage1.getPixelByte(i) | inputImage2.getPixelByte(i); outputImage.setPixelByte(i, tmp); } } else if (inputImage1 instanceof IntegerImage || inputImage2 instanceof IntegerImage) { outputImage = new IntegerImage(inputImage1, false); for (int i = 0; i < size; ++i) { int tmp = 0; isHere1 = inputImage1.isPresent(i); isHere2 = inputImage2.isPresent(i); if (isHere1 && !isHere2) tmp = inputImage1.getPixelInt(i); else if (!isHere1 && isHere2) tmp = inputImage2.getPixelInt(i); else if (isHere1 && isHere2) tmp = inputImage1.getPixelInt(i) | inputImage2.getPixelInt(i); outputImage.setPixelInt(i, tmp); } } else throw new AlgorithmException( "OR cannot be applied to floating point data"); MaskStack mask = new MaskStack(MaskStack.OR); mask.push(inputImage1.getMask()); mask.push(inputImage2.getMask()); outputImage.setMask(mask); } /** * Computes the logical OR of two images. The outputImage is of the lowest * argument precision * * @param inputImage1 * First input image * @param inputImage2 * Second input image * @return Output image */ public static Image exec(Image inputImage1, Image inputImage2) { return (Image) new OR().process(inputImage1, inputImage2); } }