它是1979年由日本大津提出的,在最小二乘法原理基础上推导出来的。适用于双峰的直方图,它的基本原理是:
/*************************************************************************************************************/
/*作者:jumay blog:ljm426.blog.163.com */
/*Ostu算法 opencv */
/*************************************************************************************************************/
/************************************************************************/
/* otsu 根据输入的直方图,自适应的返回分割阈值 */
/* Histogram:单通道图像的直方图 */
/*HistogramBins:划分为Hist的个数 */
/* 返回值:阈值 */
/************************************************************************/
int ostu(CvHistogram *Histogram,int HistogramBins)
{
double sum,csum,fmax,sb,m1,m2;
int n,n1,n2,k,threshold_value=160;
n=n1=0;
sum=csum=0.0;
fmax=-1.0;
for (k=0;k<HistogramBins;k++)
{
sum+=k*cvGetReal1D(Histogram->bins,k);
n+=cvRound(cvGetReal1D(Histogram->bins,k));
}
if (!n)
{
return threshold_value;
}
for (k=1;k<HistogramBins;k++)
{
double val=cvGetReal1D(Histogram->bins,k);
n1+=cvRound(val);
if (!n1)
{
continue;
}
n2=n-n1;
if (!n2)
{
break;
}
csum+=k*val;
m1=csum/n1;
m2=(sum-csum)/n2;
sb=n1*n2*(m1-m2)*(m1-m2);
if (sb>fmax)
{
fmax=sb;
threshold_value=k;
}
}
return threshold_value;
}