27 #ifndef SCRIBO_BINARIZATION_OTSU_THRESHOLD_HH
28 # define SCRIBO_BINARIZATION_OTSU_THRESHOLD_HH
30 # include <mln/core/concept/image.hh>
31 # include <mln/util/array.hh>
32 # include <mln/geom/nsites.hh>
33 # include <mln/geom/ncols.hh>
34 # include <mln/geom/nrows.hh>
35 # include <mln/histo/compute.hh>
61 # ifndef MLN_INCLUDE_ONLY
68 mln_trace(
"scribo::binarization::otsu_threshold");
70 const I& input =
exact(input_);
71 mln_precondition(input.is_valid());
72 mlc_is_a(mln_value(I), value::Scalar)::check();
75 mln_value(I) maxval = mln_max(mln_value(I));
83 mln::util::array<
double> pdf(hist.nvalues());
84 for(
unsigned i = 0; i< maxval; ++i)
85 pdf[i] = (
double)hist[i] /
nsites;
88 mln::util::array<
double> cdf(hist.nvalues());
89 mln::util::array<
double> myu(hist.nvalues());
95 for(
unsigned i = 1; i < maxval; ++i)
97 cdf[i] = cdf[i-1] + pdf[i];
98 myu[i] = myu[i-1] + i*pdf[i];
105 double max_sigma = 0.0;
106 mln::util::array<
double> sigma(hist.nvalues());
108 for(
int i = 0; i < (maxval - 1); ++i)
110 if(cdf[i] != 0.0 && cdf[i] != 1.0)
112 double p1p2 = cdf[i] * (1.0 - cdf[i]);
113 double mu1mu2diff = myu[maxval - 1] * cdf[i] - myu[i];
114 sigma[i] = mu1mu2diff * mu1mu2diff / p1p2;
118 if(sigma[i] > max_sigma)
120 max_sigma = sigma[i];
128 # endif // ! MLN_INCLUDE_ONLY
134 #endif // ! SCRIBO_BINARIZATION_OTSU_THRESHOLD_HH