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.Image;
/**
* Computes a comparison beetwen two binary images
*
* Mask management (by witz) :
* - pixels masked in inputImage2 are ignored for computation :
* masked pixel value is the same in input and in output.
* - inputImage1 mask becomes the outputImage mask
*
* @author Lefevre
*/
public class CompareImage extends Algorithm {
/**
* First input image
*/
public Image inputImage1;
/**
* Second input image
*/
public Image inputImage2;
/**
* The operator of comparison
*/
public int compOperator;
/**
* if a > b
*/
public final static int SUP = 0;
/**
* if a >= b
*/
public final static int GEQ = 1;
/**
* if a == b
*/
public final static int EQ = 2;
/**
* if a != b
*/
public final static int NEQ = 3;
/**
* if a <= b
*/
public final static int LEQ = 4;
/**
* if a < b
*/
public final static int INF = 5;
/**
* Ouput image
*/
public Image outputImage;
/**
* Constructor
*
*/
public CompareImage() {
super();
super.inputs = "inputImage1,inputImage2,compOperator";
super.outputs = "outputImage";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
outputImage = new BooleanImage(inputImage1, false);
outputImage.setMask( inputImage1.getMask() );
boolean tmp = false;
int size = inputImage1.size();
for (int i = 0; i < size; ++i) {
switch (compOperator) {
case SUP:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) > inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
case GEQ:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) >= inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
case EQ:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) == inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
case NEQ:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) != inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
case LEQ:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) <= inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
case INF:
if ( inputImage2.isPresent(i) )
tmp = (inputImage1.getPixelDouble(i) < inputImage2.getPixelDouble(i));
else tmp = inputImage1.getPixelBoolean(i);
break;
}
outputImage.setPixelBoolean( i,tmp );
}
}
/**
* Computes a comparison beetwen two binary images
* @param inputImage1 First input image
* @param inputImage2 Second input image
* @param compOperator The operator of comparison
* @return Output image
*/
public static Image exec(Image inputImage1, Image inputImage2, int compOperator) {
return (Image) new CompareImage().process(inputImage1,inputImage2,compOperator);
}
}