算法介绍
最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小[1]。
记T为前景与背景的分割阈值,前景点数占图像比例为 w0 ,平均灰度为 u0 ;背景点数占图像比例为 w1 ,平均灰度为 u1 ,图像的总平均灰度为 u ,前景和背景图象的方差,则有:
或
int histogram_calculate(Mat src)
{
int number;
int histsize=256;
float range[]={0,255};
const float *ranges={range};
Mat dst;
calcHist(&src,1,0,Mat(),dst,1,&histsize,&ranges);
float minvalue=0;
float totalvalue=0;
float c=0;
float maxvariance=0;
for (int i=0;i<256;i++)
{
float b=dst.at<float>(i,0);
totalvalue=b*(i)+totalvalue;
}
int meanvalue=totalvalue/(src.rows*src.cols);
for (int j=0;j<256;j++)
{
float b=dst.at<float>(j,0);
c=b+c;
float d=c/(src.rows*src.cols);
minvalue=b*(j)+minvalue;
float t=minvalue/c-meanvalue;
float variance = t * t * d /(1 - d);
if (variance>maxvariance)
{
maxvariance=variance;
number=j;
}
}
return number;
}