/**
*
*/
package fr.unistra.pelican.algorithms.frequential;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.DoubleImage;
import fr.unistra.pelican.Image;
/**
* Compute magnitude image from real and imaginary part;
*
* By default, result is put in inputImageRe, you can change this behavior with option "inPplace"
*
* @author Benjamin Perret
*
*/
public class Magnitude extends Algorithm {
/**
* Input image real part
*/
public DoubleImage inputImageRe;
/**
* Input image im part
*/
public DoubleImage inputImageIm;
/**
* Input image im part
*/
public DoubleImage outputImage;
/**
* if option is true, result is put in inputImageRe. If false new space is alocated for result
*/
public boolean inPlace=true;
/**
*
*/
public Magnitude() {
super.inputs="inputImageRe,inputImageIm";
super.options="inPlace";
super.outputs="outputImage";
}
/* (non-Javadoc)
* @see fr.unistra.pelican.Algorithm#launch()
*/
@Override
public void launch() throws AlgorithmException {
if(!Image.haveSameDimensions(inputImageIm, inputImageRe))
throw new AlgorithmException("Images must have same dimensions!");
if(inPlace)
outputImage=inputImageRe;
else outputImage=(DoubleImage)inputImageRe.copyImage(false);
for(int i=0;i<inputImageIm.size();i++)
{
double a= inputImageIm.getPixelDouble(i);
double b= inputImageRe.getPixelDouble(i);
outputImage.setPixelDouble(i, Math.sqrt(a*a+b*b));
}
}
/**
* Compute magnitude image from real and im part
* result is put in real input image
* @param inputImageRe real image
* @param inputImageIm imaginary image
* @return magnitude
*/
public static DoubleImage exec(DoubleImage inputImageRe, DoubleImage inputImageIm)
{
return (DoubleImage)(new Magnitude()).process(inputImageRe,inputImageIm);
}
/**
* Compute magnitude image from real and im part
* result is put in real input image
* @param inputImageRe real image
* @param inputImageIm imaginary image
* @param inPlace, set inPlace parameter
* @return magnitude
*/
public static DoubleImage exec(DoubleImage inputImageRe, DoubleImage inputImageIm, boolean inPlace)
{
return (DoubleImage)(new Magnitude()).process(inputImageRe,inputImageIm, inPlace);
}
/**
* Compute magnitude image from real and im part
* result is put in real input image
* @param inputImages first element is real part, second is imaginary part
* @return magnitude
*/
public static DoubleImage exec(DoubleImage [] inputImages)
{
return (DoubleImage)(new Magnitude()).process(inputImages[0],inputImages[1]);
}
/**
* Compute magnitude image from real and im part
* result is put in real input image
* @param inputImages first element is real part, second is imaginary part
* @param inPlace, set inPlace parameter
* @return magnitude
*/
public static DoubleImage exec(DoubleImage [] inputImages,boolean inPlace)
{
return (DoubleImage)(new Magnitude()).process(inputImages[0],inputImages[1],inPlace);
}
}