求整幅图像均值的时候,起初想着全部累加然后除以像素点个数(因为加法比较快),但是后来发现图像会越界,导致精度不够,求出的阈值误差很大。
//最大类间方差查找阈值
int OTSU(Mat& src)
{
if(src.channels() != 1)
return -1;
float histogram[256] = {0};
int size = src.cols*src.rows;
float averageGray = 0;
uchar* data = src.data;
for(int i = 0; i < src.rows; i ++)
{
for(int j = 0; j < src.cols; j++)
{
//averageGray += *data;
histogram[*data++] ++;
}
}
for(int i = 0; i < 256; i++)
{
histogram[i] = histogram[i] /size;
averageGray += i * histogram[i];
}
int threshold = 0;//分割阈值
float maxVariance = 0;//最大类间方差
float frontAverageGray = 0;//前景灰度均值
float frontRatio = 0;//前景所占比例
float currentVariance = 0; //当前类间方差
for(int i = 0; i < 256; i++)
{
frontRatio += histogram[i];
frontAverageGray += i * histogram[i];
//frontAverageGray / frontRatio为前景图像的灰度均值
float t = frontAverageGray / frontRatio- averageGray;
currentVariance = t * t * frontRatio / (1 - frontRatio);
if(currentVariance > maxVariance)
{
maxVariance = currentVariance;
threshold = i;
}
}
return threshold;
}
参考博客:http://blog.csdn.net/u011285477/article/details/52004513