package fr.unistra.pelican.algorithms.histogram; import java.util.Arrays; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.IntegerImage; /** * Computes the region size histogram (regular or normalized) of a monoband label image * * @author Jonathan Weber * */ public class RegionSizeHistogram extends Algorithm { /** * Input parameter. */ public IntegerImage inputSegmentation; /** * Normalized parameter * true if normalized * default is normalized */ public boolean normalized=true; /** * Output histogram */ public Double[] regionSizeHistogram; public RegionSizeHistogram() { super.inputs="inputSegmentation"; super.options="normalized"; super.outputs="regionSizeHistogram"; } @Override public void launch() throws AlgorithmException { int numberOfRegions=inputSegmentation.maximumInt()+1; int size = inputSegmentation.size(); int[] regionSize=new int[numberOfRegions]; Arrays.fill(regionSize,0); if(inputSegmentation.getMask()==null||inputSegmentation.getMask().isEmpty()) { for(int i=0;i<size;i++) { regionSize[inputSegmentation.getPixelInt(i)]++; } } else { for(int i=0;i<size;i++) { if(inputSegmentation.isPresent(i)) regionSize[inputSegmentation.getPixelInt(i)]++; } } int sizeMax=0; for(int i=0;i<numberOfRegions;i++) { if(regionSize[i]>sizeMax) sizeMax=regionSize[i]; } regionSizeHistogram=new Double[sizeMax+1]; Arrays.fill(regionSizeHistogram, 0.); for(int i=0;i<numberOfRegions;i++) { regionSizeHistogram[regionSize[i]]++; } regionSizeHistogram[0]=0.; if(normalized) { numberOfRegions--; for(int i=1;i<=sizeMax;i++) { regionSizeHistogram[i]/=numberOfRegions; } } } public static Double[] exec(IntegerImage input) { return (Double[]) new RegionSizeHistogram().process(input); } public static Double[] exec(IntegerImage input, boolean normalized) { return (Double[]) new RegionSizeHistogram().process(input,normalized); } }