package fr.unistra.pelican.algorithms.statistics; import java.util.Arrays; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.Image; import fr.unistra.pelican.PelicanException; /** * This class calculate Shannon entropy for grey-level byte image and color byte image. * * @author weber * */ public class ShannonEntropy extends Algorithm { public Image input; public Double entropy; public ShannonEntropy() { super.inputs="input"; super.outputs="entropy"; } public void launch() throws AlgorithmException { double[] pk; entropy=0.; if(input.getBDim()==1) { pk = new double[256]; Arrays.fill(pk,0); for(int i=0;i<input.size();i++) pk[input.getPixelByte(i)]++; for(int i=0;i<256;i++) pk[i]=pk[i]/input.size(); } else if(input.getBDim()==3) { pk = new double[256*256*256]; Arrays.fill(pk,0); for(int i=0;i<input.size();i+=3) { pk[input.getPixelByte(i)+(input.getPixelByte(i+1)*256)+(input.getPixelByte(i+2)*256*256)]++; } int nbPix=input.size()/3; for(int i=0;i<pk.length;i++) pk[i]=pk[i]/nbPix; } else { throw new PelicanException("This type of image is not managed yet"); } for(int i=0;i<pk.length;i++) if(pk[i]>0) entropy+=-pk[i]*(Math.log(pk[i])/Math.log(2)); } public static Double exec(Image input) { return (Double) new ShannonEntropy().process(input); } }