Mercurial > hg > octave-image
changeset 854:34045e6b58cc
graythresh: vectorize moments method
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Fri, 03 Jan 2014 06:10:00 +0000 |
parents | 54f6b32e0f9c |
children | f903e3963f9f |
files | inst/graythresh.m |
diffstat | 1 files changed, 14 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/inst/graythresh.m +++ b/inst/graythresh.m @@ -125,7 +125,7 @@ ## MaxEntropy MaxLikelihood intermeans ## moments minerror concavity ## * Carnë Draug implemented and vectorized the Otsu's method -## * Carnë Draug vectorized percentile +## * Carnë Draug vectorized percentile and moments. ## * missing methods from ImageJ ## Yen triangle RenyiEntropy ## Shanbhag Li Huang @@ -243,20 +243,21 @@ function level = moments (y) n = numel (y) - 1; - % The threshold is chosen such that partial_sumA(y,t)/partial_sumA(y,n) is closest to x0. - Avec = zeros (1, n+1); - - for t = 0:n - Avec(t+1) = partial_sumA (y, t) / partial_sumA (y, n); - end + ## The threshold is chosen such that partial_sumA(y,t)/partial_sumA(y,n) + ## is closest to x0. + sumY = sum (y); + Avec = cumsum (y) / sumY; - % The following finds x0. - x2 = (partial_sumB(y,n)*partial_sumC(y,n) - partial_sumA(y,n)*partial_sumD(y,n)) / (partial_sumA(y,n)*partial_sumC(y,n) - partial_sumB(y,n)^2); - x1 = (partial_sumB(y,n)*partial_sumD(y,n) - partial_sumC(y,n)^2) / (partial_sumA (y,n)*partial_sumC(y,n) - partial_sumB(y,n)^2); - x0 = .5 - (partial_sumB(y,n)/partial_sumA(y,n) + x2/2) / sqrt (x2^2 - 4*x1); + sumB = partial_sumB (y,n); + sumC = partial_sumC (y,n); + sumD = partial_sumD (y,n); + ## The following finds x0. + x2 = (sumB*sumC - sumY*sumD) / (sumY*sumC - sumB^2); + x1 = (sumB*sumD - sumC^2) / (sumY*sumC - sumB^2); + x0 = .5 - (sumB/sumY + x2/2) / sqrt (x2^2 - 4*x1); - % And finally the threshold. - [minimum, ind] = min (abs (Avec-x0)); + ## And finally the threshold + [~, ind] = min (abs (Avec-x0)); level{1} = ind-1; endfunction