package fr.unistra.pelican.algorithms.arithmetic;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.util.mask.MaskStack;
/**
* Compute the difference beetwen two image, inputImage1 - inputImage2. The
* outputImage format is the same as inputImage1.
*
* By Default: A check is done to keep pixels values in image type natural
* bounds.
*
* If x and y are images of type t and t takes value in [a,b], result z at pixel
* p is then z(p) = min ( b , max ( a , x(p) - y(p) ) )
*
* If option safe is set false no check is done and result is: z(p) = x(p) -
* y(p)
*
* Mask management (by witz) :
* - computation occurs as if masked pixels were at 0.
* - the the output image mask is inputImage1 mask ANDed with inputImage2 mask
*
* @author ?, Benjamin Perret
*
*/
public class Difference extends Algorithm {
/**
* First input image.
*/
public Image inputImage1;
/**
* Second input image.
*/
public Image inputImage2;
/**
* Option parametre
*/
public Boolean safe = true;
/**
* Result
*/
public Image outputImage;
/**
* Constructor
*
*/
public Difference() {
super.inputs = "inputImage1,inputImage2";
super.options = "safe";
super.outputs = "outputImage";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
outputImage = inputImage1.copyImage(false);
MaskStack mask = new MaskStack( MaskStack.AND );
mask.push( inputImage1.getMask() );
mask.push( inputImage2.getMask() );
outputImage.setMask( mask );
int size = inputImage1.size();
boolean isHere1, isHere2;
double val1, val2;
for (int i = 0; i < size; ++i) {
isHere1 = inputImage1.isPresent(i);
isHere2 = inputImage2.isPresent(i);
if ( isHere1 ) val1 = inputImage1.getPixelDouble(i);
else val1 = 0.0;
if ( isHere2 ) val2 = inputImage2.getPixelDouble(i);
else val2 = 0.0;
double val = val1 - val2;
if (Math.abs(val) < 0.0000001) val = 0;
outputImage.setPixelDouble( i, safe ? Math.min( 1.0, Math.max(0.0,val))
: val );
}
}
/**
* Compute the difference beetwen two image, inputImage1 - inputImage2. The
* outputImage format is the same as inputImage1.
*
* Is safe is set to true: A check is done to keep pixels values in image
* type natural bounds.
*
* If x and y are images of type t and t takes value in [a,b], result z at
* pixel p is then z(p) = min ( b , max ( a , x(p) - y(p) ) )
*
* If option safe is set false: no check is done and result is: z(p) = x(p) -
* y(p)
*
* @author ?, Benjamin Perret
*
* @param image
* Input Image 1.
* @param image2
* Input Image 2.
* @param safe
* Do we check result?
* @return Difference between image 1 and 2.
*/
@SuppressWarnings("unchecked")
public static <T extends Image> T exec(T inputImage1, Image inputImage2, boolean safe) {
return (T) new Difference().process(inputImage1, inputImage2, safe);
}
/**
* Compute the difference beetwen two image, inputImage1 - inputImage2. The
* outputImage format is the same as inputImage1.
*
* A check is done to keep pixels values in image type natural bounds.
*
* If x and y are images of type t and t takes value in [a,b], result z at
* pixel p is then z(p) = min ( b , max ( a , x(p) - y(p) ) )
*
* @param inputImage1
* Input Image 1.
*
* @param inputImage2
* Input Image 2.
*
* @return Difference between image 1 and 2.
*/
@SuppressWarnings("unchecked")
public static <T extends Image> T exec(T inputImage1, Image inputImage2) {
return (T) new Difference().process(inputImage1, inputImage2);
}
}