package fr.unistra.pelican.algorithms.conversion; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.ByteImage; import fr.unistra.pelican.PelicanException; import fr.unistra.pelican.util.largeImages.LargeImageInterface; import fr.unistra.pelican.util.lut.ThreeBandByteConversionLUT; /** * Made an optimized (in terms of efficiency) ByteImage conversion according to * a specified Look-Up Table * @author Jonathan Weber * */ public class OptimizedByteImageConversionBasedOnLUT extends Algorithm{ /** * Input parameter */ public ByteImage input; /** * LUT for conversion */ public ThreeBandByteConversionLUT lut; /** * Output parameter */ public ByteImage output; public OptimizedByteImageConversionBasedOnLUT() { super.inputs = "input,lut"; super.outputs = "output"; } @Override public void launch() throws AlgorithmException { output = input.copyImage(false); byte[][][] lut0=lut.lut0; byte[][][] lut1=lut.lut1; byte[][][] lut2=lut.lut2; if(input instanceof LargeImageInterface) { throw new PelicanException("LargeImage are not managed yet !"); } else { byte[] origin = input.getPixels(); byte[] newValues = output.getPixels(); int origin0,origin1,origin2; for(int i=0;i<origin.length;i=i+3) { origin0 = origin[i]+128; origin1 = origin[i+1]+128; origin2 = origin[i+2]+128; newValues[i]=lut0[origin0][origin1][origin2]; newValues[i+1]=lut1[origin0][origin1][origin2]; newValues[i+2]=lut2[origin0][origin1][origin2]; } output.setPixelsUnsafe(newValues); } } /** * Made an optimized (in terms of efficiency) ByteImage conversion according to * a specified Look-Up Table * @param input * @param lut * @return */ public static ByteImage exec(ByteImage input, ThreeBandByteConversionLUT lut) { return (ByteImage) new OptimizedByteImageConversionBasedOnLUT().process(input,lut); } }