1、OTSU算法是设阈值将图像分割成俩组,一组灰度对应目标,另一组灰度对应背景,则这俩组灰度值的类内方差最小,俩组的类间方差最大。相关公式:
g = w0 *(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u) = w0 * w1 *(u0 - u1)*(u0 - u1)
我们将遍历最小灰度值到最大灰度值T作为图像的阈值,如果目标点的灰度值小于阈值则归为背景,大于阈值则归为前景。w0为使用前景T作为阈值是时像素点数比例,u1为使用T作为阈值是前景时平均灰度;w1为使用T作为阈值时背景像素点数比例,u1为使用T作为阈值是背景的平均灰度。而u则可由下式得到:
u = w0 * u0 + w1 * u1
g = w0 *(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u) = w0 * w1 *(u0 - u1)*(u0 - u1)
我们将遍历最小灰度值到最大灰度值T作为图像的阈值,如果目标点的灰度值小于阈值则归为背景,大于阈值则归为前景。w0为使用前景T作为阈值是时像素点数比例,u1为使用T作为阈值是前景时平均灰度;w1为使用T作为阈值时背景像素点数比例,u1为使用T作为阈值是背景的平均灰度。而u则可由下式得到:
u = w0 * u0 + w1 * u1
void Otsu(const IplImage *srcImg,IplImage *dstImg)
{
int m = 256;
int *color = new int[m];
memset(color, 0, m* sizeof(int));
for(int h = 0; h < srcImg->height; h++)
{
uchar *p = (uchar*)(srcImg->imageData + srcImg->widthStep * h);
for(int w = 0; w < srcImg->width; w++)
{
color[p[w]]++;
}
}