%% OTSU automatic thresholding method sumB = 0; wB = 0; minimum = 99999999999999; threshold1 = 0.0; threshold2 = 0.0; sum1 = sum((1:levels).*histogramCounts.'); % the above code is replace with this single line for ii=1:levels wB = wB + histogramCounts(ii); if (wB == 0) continue; end wF = total - wB; if (wF == 0) break; end %---debug --- Bx=histogramCounts(1:ii);Fx=histogramCounts(ii+1:levels); weightB=sum(Bx)/sum(histogramCounts); weightF=sum(Fx)/sum(histogramCounts); meanB=(sum(Bx.*[0:ii-1]'))/sum(Bx); meanF=sum(Fx.*[ii:levels-1]')/sum(Fx); VarB=sum((([0:ii-1]'-meanB).^2).*Bx)/sum(Bx); VarF=sum((([ii:levels-1]'-meanF).^2).*Fx)/sum(Fx); Within=((weightB*VarB)+(weightF*VarF)); if ( Within < minimum ) threshold1 = ii; minimum =Within; end message(ii,:)=[ii meanB VarB weightB meanF VarF weightF Within]; level =threshold1;% (threshold1 + threshold2 )/(2); disp([num2str(ii) ' : ' num2str(VarB) ' ' num2str(VarF) ' ' num2str(Within) ' > ' num2str(VarB+VarF)]); subplot(1,4,1);imshow(im,[0 levels]); subplot(1,4,2);bar(histogramCounts);hold on;plot(ii,200,'x','color','r');plot(level,max(histogramCounts),'x','color','g');hold off; set(gca,'XTickLabel',{0:levels-1}); subplot(1,4,3);imshow((im>ii)); subplot(1,4,4);imshow((im>level)); end