机器视觉_图像算法(三)——最大类间法Otsu阈值

方差是表征数据分布不均衡性的统计量,所有方差越大则数据越不均衡,故此利用该思想进行图像类分割。

公式:  记 M = 256 单通道灰度分级, Sum = 像素总数 = Image.cols * Image.rows 。

  1. 统计每一级像素分布概率p[i]——即,直方图统计p[i],i=[0:M)
  2. 初始th值,图像分C1和C2类:(一般编程使用th=0开始自加)
  3. if(i=[0:th])对p[i]累加,得到C1的像素占比 w_{1} ;【背景像素占比 】——专业名称:像素分布概率
  4. else(i=(th:M))对p[i]累加,得到C2的像素占比 w_{2} ;【前景像素占比】——专业名称:像素分布概率
  5. 第3步基础上计算C1的均值 u_{1}  ;【背景的平均灰度值】
  6. 第4步基础上计算C1的均值 u_{2}  ;【前景的平均灰度值】
  7. 类间方差 g=w_{1}*w_{2}*(u_{1}-u_{2})^2 ;【简化版的g】
  8. if(g > max)max=g;【更新max】。

www.overleaf.com

机器视觉_图像算法(三)——最大类间法Otsu阈值_第1张图片

int myOtsu(Mat& src)
{
	int th;
	const int GrayScale = 256;	//单通道图像总灰度256级
	int pixCount[GrayScale] = { 0 };//每个灰度值所占像素个数
	int pixSum = src.cols * src.rows;//图像总像素点
	float pixPro[GrayScale] = { 0 };//每个灰度值所占总像素比例
	float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0;
	
	/* 直方图统计:以灰度级为自变量,统计自变量对应的像素个数 pixCount[i] */
	for (int i = 0; i < src.cols; i++)
	{
		for (int j = 0; j < src.rows; j++)
		{
			pixCount[src.at(j, i)]++;
		}
	}
	/* 像素分布概率:每个像素级的像素数目和整张图总像素的占比 pixPro[i] */
	for (int i = 0; i < GrayScale; i++)
	{
		pixPro[i] = pixCount[i] * 1.0 / pixSum;//计算每个灰度级的像素数目占整幅图像的比例  
	}

	/* 遍历灰度级,寻找最佳阈值 */
	for (int i = 0; i < GrayScale; i++)//遍历所有从0到255灰度级的阈值分割条件,测试哪一个的类间方差最大
	{

		w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0;
		/* 以第一个i为最佳阈值开始检索
			计算每一类的均值 u1和u2	*/
		for (int j = 0; j < GrayScale; j++)
		{
			/* C1类 */
			if (j <= i)//背景
			{
				w0 += pixPro[j];
				u0tmp += j * pixPro[j];
			}
			/* C2类 */
			else//前景
			{
				w1 += pixPro[j];
				u1tmp += j * pixPro[j];
			}
		}
		u0 = u0tmp / w0;
		u1 = u1tmp / w1;

		/* 计算g,更新g */
		deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)); //类间方差公式 g = w1 * w2 * (u1 - u2) ^ 2
		if (deltaTmp > deltaMax)
		{
			deltaMax = deltaTmp;
			th = i;
		}
	}
	return th;
}

别人家的算法过程:

机器视觉_图像算法(三)——最大类间法Otsu阈值_第2张图片

 

你可能感兴趣的:(#,机器视觉_图像算法,机器视觉)