灰度重心法

概念

对于亮度不均匀的目标(如光斑,光条纹),灰度重心法可按目标光强分布求出光强权重质心坐标作为跟踪点,也叫密度质心算法

将灰度值分布中的质心记作光条纹的中心

表

对于M * N大小的图像f,像素的灰度值凡是超过阈值T的均参与重心处理,于是重心坐标为:

x y fij

灰度重心法公式

型心法

只可用于二值图像

型心法

灰度重心法version 1

灰度重心法v1

灰度重心法version 2

灰度重心法v2

使用Visual Studio 2019测试

根据灰度重心法version 1找光斑中心

代码:

#define T 20 //根据实际情况设定固定阈值
Point grayCenter(Mat& img)
{
	Mat img_gray; 
	cvtColor(img, img_gray, COLOR_BGR2GRAY, 0);
	Point Center; //中心点
	int i, j;
	double sumval = 0; 
	MatIterator_<uchar> it, end;
	//获取图像各点灰度值总和
	for (it = img_gray.begin<uchar>(), end = img_gray.end<uchar>(); it != end; it++)
	{
		((*it) > T) ? sumval += (*it) : NULL; //小于阈值,取0
	}
	Center.x = Center.y = 0;
	double x = 0, y = 0;
	for (int i = 0; i < img_gray.cols; i++)
	{
		for (int j = 0; j < img_gray.rows; j++)
		{
			double s = img_gray.at<uchar>(j, i); //取当前点灰度值
			if (s < T) 
				s = 0; 
			x += i * s / sumval;
			y += j * s / sumval;
		}
	}
	Center.x = cvRound(x);
	Center.y = cvRound(y);
	cout << "rows=" << img_gray.rows << "  cols=" << img_gray.cols << endl; 
	cout << "x=" << x << "  y=" << y << endl; 
	return Center;
}

运行结果:

成功找到光斑中心(绿点)

在树莓派上测试

同样,在树莓派上

cmake .
make

执行! 成功!

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus