| 阈值分割及形心计算 |
|
| 作者:左力 文章来源:本站原创 点击数: 更新时间:2006-11-22 |
|
|
图像处理技术 阈值分割、形心计算、圆的测量 左力 2002.7.16. 如果被检测物体具有较均匀的灰度值,其背景也有较均匀的灰度值,而且物体与背景有较大的反差,那么,其图像的灰度直方图将有明显的双峰。图1为一幅256级灰度图像,其灰度直方图如图2所示。 最简单、有效的方法就是取双峰间谷底的灰度值为阈值,根据该阈值对图像进行分割,将物体与背景分离开来,然后再进行其它处理。下面将我做的阈值分割、形心计算和圆的测量作一简单介绍。

图 1 一圆形物体的图像

图2 图1的灰度直方图(线性坐标)
1.对数直方图 图2的灰度直方图为线性坐标,因为峰值太大,而我们最关心的谷底数值又较小,这使我们看不清谷底曲线的情况。为此,我将直方图的纵坐标改为对数坐标,对数直方图如图3所示。它有两个优点,一是谷底曲线清楚,二是曲线较线性坐标的连续、平滑。

图3 对数坐标直方图,平滑前

Fig.4 对数坐标直方图,两次平滑后 阈值 = 104
2.低通滤波平滑 在实际情况下,图像常受到噪声等因素的影响,为了便于判定谷底位置,必须对直方图进行平滑。我采用低通滤波算法对直方图进行两次平滑, 第一次,从左到右滤波: 2 图像处理技术 ---- 阈值分割、形心计算、圆的测量 H i = a * H i-1 + b * h i 其中:h为滤波前的值, H为滤波后的值, a ,b 为滤波系数,且有a + b = 1,取a = 0.7, b = 0.3 i = 1 ~255; 第二次,从右到左滤波: H i = a * H i+1 + b * h i 其中:i = 254~0。 这样两个方向各滤波一次,可以保证峰值位置误差较小。图4为滤波后的结果。 3.搜索谷底 因为我们知道,阈值即为两个峰值之间的谷底,所以,关键在于找到左右两个峰值,然后在两个峰值之间找极小值就很容易了。搜索极值的方法很简单,这里就不讲了。图4中,给出了搜索结果,阈值为104。 4.阈值分割 我采用的阈值分割方法是根据阈值将图像二值化,将物体和背景置为黑白两色。对图像扫描一遍,灰度大于阈值的点置为255,即白色;小于等于阈值的点置为0,即为黑色。图5是根据图4的阈值对图1进行阈值分割的结果。

图5 物体的二值化图像
5.填充白点 当物体是深色时,由于其上有高光,所以二值化后,在黑色物体上会有小白点,如图5所示。为了使形心计算的结果准确,我们必须将这些小白点填充为黑色。因为这些白点距边缘有一定距离,且其宽度或长度都较小,所以可以采用这样一种算法进行填充: 如果距某白点n个像素的上方和下方都为黑;或者,距该白点n个像素的左方和右方都为黑,则该白点在物体内,将其置为黑色。 其中n的大小由高光的大小而定。我取 n = 5。填充结果见图6。

6.形心计算 为了能理解计算形心的公式,先看一个简单的力平衡的问题。如图7所示,一个质量忽略不记的刚性杆下有一支点,在支点两边分别在杆上放有6个质量均匀、尺寸相同,边长为L的正方体。设正方体的重量为W,当杆平衡时,X = ?

力矩平衡方程为: 6 × W × X = W × 0.5 L + 2 × W × 1.5 L + 3 × W × 2.5 L W × 0.5 L + 2 × W × 1.5 L + 3 × W × 2.5 L X = ------------------------------------------------------------- = 1.83 L (1) 6 × W
显然,右边6个正方体的重心在水平方向距支点距离为X的位置上。若想计算重心在垂直方向的位置,将6个正方体转90度再计算一次即可。如果将正方体看成正方形,即无厚度,则重心位置和形心位置重合。
计算平面图形的形心公式如下: AxdAxA∫= , AydAyA∫= 式中:A为平面图形的面积。其它符号含义见图8。 对照前面的式(1),形心公式是很好理解的。将它应用到图像处理中进行形心计算也很容易。我们将一个像素看成一个dA,且为1个单位,则图像的面积即为像素点的个数;分子上的积分则变为像素坐标的和。 图6、图9给出了计算结果,形心位置用十字符号标出。

图9 测量结果 2
7.半径及误差计算 如果已知被测物体是圆形的,那么根据面积就能很容易求出半径R,π/AR=。图9是在物体上用白点根据形心和半径画了一个圆,该圆和物体吻合,半径R = 188.7个像素。 在图6所示的二值化图像上进行误差检查,每隔3度计算一次实际半径和测量出的半径两者间的误差,如图所示,正、负误差为0.4和1.5个像素,分别在352、231度处,已用黑白小点标出。 半径的最大误差 < 0.8 %,其中包括物体的不圆度和测量误差。这个结果说明用以上方法进行阈值分割、形心计算的效果不错。
|