最大类间算法是求取一个阈值,将图像分为两部分后,这两部分的像素平均值的方差最大。计算过程如下:
设u1为第一部分的均值,u2第二部分的均值,w1为第一部分的像素所占的比例,w2为第一部分的像素所占的比例,即w1+w2=1;
则这两部分的方差为var=w1* w2* (u1-u2)*(u1-u2)
C++ 源代码如下

int GetOSTUthresd(Mat input)
{
	int rows = input.rows;
	int cols = input.cols;
	long size = rows*cols;
	float histogram[256] = {0};
	int threshold = 0;
	for (int i = 0; i < rows; ++i)
	{
		///获取i行首像素的指针
		const uchar *p = input.ptr<uchar>(i);
		///遍历i行像素
		for (int j = 0; j < cols; ++j)
		{
			//cout << int(*p++) << endl;
			histogram[int(*p++)]++;
		}
	}
	long sum0 = 0; ///0到i级的像素值总和
	long sum1 = 0;///i到255级的像素值总和
	long cnt0 = 0;///0到i级的像素总数
	long cnt1 = 0;///i到255的像素总数
	double w0 = 0;///0到i级的像素所占比例
	double w1 = 0;///i到255的像素所占比例
	double u0 = 0;///0到i级的灰度均值 
	double u1 = 0; ///i到255级的灰度均值 
	double u;///整幅图像的灰度均值
	double variance = 0;///方差
	double max_varience = 0;
	for (int i = 1; i < 256; i++)
	{
		sum0 = 0; sum1 = 0; cnt0 = 0; cnt1 = 0; w0 = 0; w1 = 0;
		for (int j = 0; j < i; j++)
		{
			cnt0 += histogram[j];
			sum0 += j*histogram[j];			
		}
		u0 = (double)sum0 / cnt0;
		w0 = (double)cnt0 / size;
		for (int j = i; j < 255; j++)
		{
			cnt1 += histogram[j];
			sum1 += j*histogram[j];

		}
		u1 = (double)sum1 / cnt1;
		w1 = (double)cnt1 / size;
		u = w0*u0 + w1*u1;
		variance = w0*w1*(u0 - u1)*(u0 - u1);		
		if (variance > max_varience)
		{
			max_varience = variance;
			threshold = i;
		}
	}
	return threshold;
}


 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐