OpenCV实现OTSU算法(大津法)

int GetThresholdOTSU(Mat imgInput)
{
	int hist[256] = { 0 };
	double pro_hist[256] = { 0.0 };
	int row = imgInput.rows;
	int col = imgInput.cols;
	for (int i = 0; i < row; ++i) //统计每个灰度的数量
	{
		for (int j = 0; j < col; ++j)
		{
			int temp = imgInput.at<uchar>(i, j);
			hist[temp]++;
		}
	}
	for (int i = 0; i < 256; ++i)//计算每个灰度级占图像的概率
		pro_hist[i] = (double)hist[i] / (double)(row * col);
	double mG = 0.0;//平均灰度值
	for (int i = 0; i < 256; ++i)
		mG += i * pro_hist[i];
	double dbMaxVariance = 0.0;
	int nMaxthread = 0;
	for (int i = 0; i < 256; ++i)//统计前景和背景的平均灰度值,并计算类间方差
	{
		double m1 = 0.0; double m2 = 0.0; double mk = 0.0; double p1 = 0.0; double p2 = 0.0;
		for (int j = 0; j < i; ++j)
		{
			p1 += pro_hist[j];
			mk += j * pro_hist[j];
		}
		m1 = mk / p1;			//背景平均灰度
		p2 = 1 - p1;			//p1+p2=1;mG=p1*m1+p2*m2;
		m2 = (mG - mk) / p2;	//前景平均灰度
		double dbCurrVariance = p1 * p2 * (m1 - m2) * (m1 - m2);//计算类间方差,g=ω0(μ0-μ)^2+ω1(μ1-μ)^2
		if (dbCurrVariance > dbMaxVariance)
		{
			dbMaxVariance = dbCurrVariance;
			nMaxthread = i;
		}
	}
	return nMaxthread;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值