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 mean size per frame histogram (regular or normalized) of a monoband label image * * @author Jonathan Weber * */ public class RegionMeanSizePerFrameHistogram extends Algorithm { /** * Input parameter. */ public IntegerImage inputSegmentation; /** * Normalized parameter * true if normalized * default is normalized */ public boolean normalized=true; /** * Output histogram */ public Double[] regionMeanSizePerFrameHistogram; public RegionMeanSizePerFrameHistogram() { super.inputs="inputSegmentation"; super.options="normalized"; super.outputs="regionMeanSizePerFrameHistogram"; } @Override public void launch() throws AlgorithmException { int xDim = inputSegmentation.getXDim(); int yDim = inputSegmentation.getYDim(); int tDim = inputSegmentation.getTDim(); int zDim = inputSegmentation.getZDim(); int numberOfRegions=inputSegmentation.maximumInt()+1; int size = inputSegmentation.size(); int[] regionSize=new int[numberOfRegions]; int[] frameMin = new int[numberOfRegions]; int[] frameMax = new int[numberOfRegions]; Arrays.fill(regionSize,0); Arrays.fill(frameMin,Integer.MAX_VALUE); Arrays.fill(frameMax,Integer.MIN_VALUE); if(inputSegmentation.getMask()==null||inputSegmentation.getMask().isEmpty()) { for(int t=0;t<tDim;t++) for(int z=0;z<zDim;z++) for(int y=0;y<yDim;y++) for(int x=0;x<xDim;x++) { int label = inputSegmentation.getPixelXYZTInt(x, y, z, t); regionSize[label]++; if(frameMin[label]>t) frameMin[label]=t; frameMax[label]=t; } } else { for(int t=0;t<tDim;t++) for(int z=0;z<zDim;z++) for(int y=0;y<yDim;y++) for(int x=0;x<xDim;x++) { if(inputSegmentation.isPresentXYZT(x, y, z, t)) { int label = inputSegmentation.getPixelXYZTInt(x, y, z, t); regionSize[label]++; if(frameMin[label]>t) frameMin[label]=t; frameMax[label]=t; } } } int sizeMax=0; for(int i=0;i<numberOfRegions;i++) { regionSize[i]/=(frameMax[i]-frameMin[i]+1); if(regionSize[i]>sizeMax) sizeMax=regionSize[i]; } regionMeanSizePerFrameHistogram=new Double[sizeMax+1]; Arrays.fill(regionMeanSizePerFrameHistogram, 0.); for(int i=0;i<numberOfRegions;i++) { regionMeanSizePerFrameHistogram[regionSize[i]]++; } regionMeanSizePerFrameHistogram[0]=0.; if(normalized) { int meanAreaSum=0; for(int i=1;i<=sizeMax;i++) meanAreaSum+=regionMeanSizePerFrameHistogram[i]; for(int i=1;i<=sizeMax;i++) { regionMeanSizePerFrameHistogram[i]/=meanAreaSum; } } } public static Double[] exec(IntegerImage input) { return (Double[]) new RegionMeanSizePerFrameHistogram().process(input); } public static Double[] exec(IntegerImage input, boolean normalized) { return (Double[]) new RegionMeanSizePerFrameHistogram().process(input,normalized); } }