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.InvalidParameterException;
import fr.unistra.pelican.util.mask.MaskStack;
/**
* Compute the absolute difference between two images
* (inputImage1 - inputImage2) in the HSY space.
* The outputImage format is the same as inputImage1.
*
* Mask management (by witz) :
* - computation occurs as usual.
* - the the output image mask is inputImage1 mask ANDed with inputImage2 mask
*
* @author ?, Benjamin Perret
*/
public class AbsoluteDifferenceHSY extends Algorithm {
/**
* First input image in HSY space.
*/
public Image inputImage1;
/**
* Second input image in HSY space.
*/
public Image inputImage2;
/**
* Algorithm result: absolute difference between input image one and two.
*/
public Image outputImage;
/**
* Constructor
*
*/
public AbsoluteDifferenceHSY() {
super();
super.inputs = "inputImage1,inputImage2";
super.outputs = "outputImage";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
if(!Image.haveSameDimensions(inputImage1, inputImage2))
throw(new InvalidParameterException("The two images must have the same dimensions"));
outputImage = inputImage1.copyImage(false);
MaskStack mask = new MaskStack( MaskStack.AND );
mask.push( inputImage1.getMask() );
mask.push( inputImage2.getMask() );
outputImage.setMask( mask );
for (int b = 0; b < inputImage1.getBDim(); b++) {
for (int t = 0; t < inputImage1.getTDim(); t++) {
for (int z = 0; z < inputImage1.getZDim(); z++) {
for (int x = 0; x < inputImage1.getXDim(); x++) {
for (int y = 0; y < inputImage1.getYDim(); y++) {
if (b > 0)
outputImage.setPixelXYZTBDouble(x, y, z, t, b,
Math.abs(inputImage1
.getPixelXYZTBDouble(x, y, z,
t, b)
- inputImage2
.getPixelXYZTBDouble(x,
y, z, t, b)));
else {
double abs = Math.abs(inputImage1
.getPixelXYZTBDouble(x, y, z, t, b)
- inputImage2.getPixelXYZTBDouble(x, y,
z, t, b));
if (abs > 0.5)
abs = 1.0 - abs;
abs *= 2.0; // get into [0,1]
outputImage.setPixelXYZTBDouble(x, y, z, t, b,
abs);
}
}
}
}
}
}
}
/**
* Compute the absolute difference between two images
* (inputImage1 and inputImage2) in the HSY space.
*
* @param inputImage1
* First of the two subtracted images.
* @param inputImage2
* Second of the two subtracted images.
* @return outputImage which is the absolute difference between two images
* in the HSY space.
*/
public static Image exec(Image inputImage1, int inputImage2) {
return (Image) new AbsoluteDifferenceHSY().process(inputImage1,
inputImage2);
}
}