/**
*
*/
package fr.unistra.pelican.algorithms.histogram;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.util.colour.GammaCompressionModel;
import fr.unistra.pelican.util.colour.GammaCompressionModel.Band;
/**
* Performs gamma compression to prepare an image with linear dynamic range for display.
*
* Assumes image is either grayscale or RGB.
*
* @author Benjamin Perret
*
* @TODO
*
*/
public class GammaCompression extends Algorithm {
/**
* Input image
*/
public Image image;
/**
* Gamma compressed result
*/
public Image result;
/**
* Compression model to use
*/
public GammaCompressionModel model;
/**
*
*/
private GammaCompression() {
super();
super.inputs="image,model";
super.outputs="result";
}
/* (non-Javadoc)
* @see fr.unistra.pelican.Algorithm#launch()
*/
@Override
public void launch() throws AlgorithmException {
result=image.copyImage(false);
if(image.bdim==3)
{
for(int i=0;i<image.size();)
{
result.setPixelDouble(i, model.compress(image.getPixelDouble(i++), Band.R));
result.setPixelDouble(i, model.compress(image.getPixelDouble(i++), Band.G));
result.setPixelDouble(i, model.compress(image.getPixelDouble(i++), Band.B));
}
}else{
for(int i=0;i<image.size();i++)
result.setPixelDouble(i, model.compress(image.getPixelDouble(i), Band.UNKNOWN));
}
}
@SuppressWarnings("unchecked")
public static <T extends Image> T exec(T image, GammaCompressionModel model)
{
return (T)new GammaCompression().process(image,model);
}
}