package uk.co.mmscomputing.image.operators;
public class Histogram{
int[] histogram;
int N=0;
Histogram(int slots){
histogram=new int[slots];
}
void write(int colour){
histogram[colour]++;
N++;
}
/*
[1] Shunji Mori; Optical Character Recognition (1999); John Wiley & Sons
4.2 Thresholding selection based on global discriminant analysis; pp.112
[2] Ioannis Pavlidis, Vassilios Morellas, Pete Roeber; Programming Cameras and Pan-Tilts with DirectX and Java
Morgan-Kaufmann Publishers; ISBN 1-55860-756-0
pp.69
Original Paper:
[3] Otsu,N.A Threshold Selection Method from Gray-Level Histograms.
IEEE Transactions on Systems,Man, and Cybernetics,1979,vol.9,pp.62-66
*/
int getThreshold(){
double[] p=new double[histogram.length];
for(int i=0;i<histogram.length;i++){ // probabilities
p[i]=((double)histogram[i])/((double)N);
}
double mu=0.0; // total mean value
for(int i=0;i<p.length;i++){mu+=(i+1)*p[i];}
int threshold=0;
double w1=0.0;
double mu1=0.0;
double sigmaBSqr;
double sigmaBSqrMax=0.0;
for(int i=0;i<p.length;i++){
w1 += p[i];
mu1 +=(i+1)*p[i];
if((0<w1)&&(w1<1)){
sigmaBSqr=mu*w1-mu1;
sigmaBSqr=(sigmaBSqr*sigmaBSqr)/(w1*(1.0-w1));
if(sigmaBSqr>sigmaBSqrMax){
sigmaBSqrMax=sigmaBSqr;
threshold=i;
}
}
}
return threshold;
}
}