package fr.unistra.pelican.algorithms.arithmetic;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.ByteImage;
import fr.unistra.pelican.DoubleImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.IntegerImage;
/**
* Compute the euclidian norm on a multiband image. for a pixel, the new image
* of one band b is : b = sqrt(b1*b1 + b2*b2 + ...)
*
* @author ?, Benjamin Perret
*/
public class EuclideanNorm extends Algorithm {
/**
* Input image 1
*/
public Image inputImage;
/**
* Output image
*/
public Image outputImage;
/**
* Flag to determine if integer computation is used (i.e. sum of absolute
* values)
*/
public Boolean integer = false;
/**
* Constructor
*
*/
public EuclideanNorm() {
super.inputs = "inputImage";
super.outputs = "outputImage";
super.options = "integer";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
if (inputImage instanceof ByteImage)
outputImage = new ByteImage(inputImage.getXDim(), inputImage
.getYDim(), inputImage.getZDim(), inputImage.getTDim(), 1);
else if (inputImage instanceof IntegerImage)
outputImage = new IntegerImage(inputImage.getXDim(), inputImage
.getYDim(), inputImage.getZDim(), inputImage.getTDim(), 1);
else
outputImage = new DoubleImage(inputImage.getXDim(), inputImage
.getYDim(), inputImage.getZDim(), inputImage.getTDim(), 1);
outputImage.setMask( inputImage.getMask() );
// Do it for all bands
int xDim = inputImage.getXDim();
int yDim = inputImage.getYDim();
int zDim = inputImage.getZDim();
int tDim = inputImage.getTDim();
int bDim = inputImage.getBDim();
// Standard case
if (!integer)
for (int x = 0; x < xDim; x++)
for (int y = 0; y < yDim; y++)
for (int z = 0; z < zDim; z++)
for (int t = 0; t < tDim; t++) {
double dist = 0.0;
for (int b = 0; b < bDim; b++) {
double pixel = inputImage.getPixelXYZTBDouble( x, y, z, t, b );
dist += pixel * pixel;
}
outputImage.setPixelXYZTDouble(x, y, z, t, Math.sqrt(dist));
}
else {
for (int x = 0; x < xDim; x++)
for (int y = 0; y < yDim; y++)
for (int z = 0; z < zDim; z++)
for (int t = 0; t < tDim; t++) {
double dist = 0.0;
for (int b = 0; b < bDim; b++) {
double pixel = inputImage.getPixelXYZTBDouble(
x, y, z, t, b);
dist += Math.abs(pixel);
}
outputImage.setPixelXYZTDouble(x, y, z, t, dist);
}
}
}
/**
* Compute the euclidian norm on a multiband image. for a pixel, the new
* image of one band b is : b = sqrt(b1*b1 + b2*b2 + ...)
*
* @param inputImage
* input multi band image
* @return euclidian norm of input image
*/
public static Image exec(Image inputImage) {
return (Image) new EuclideanNorm().process(inputImage);
}
public static Image exec(Image inputImage, Boolean integer) {
return (Image) new EuclideanNorm().process(inputImage, integer);
}
}