源程序和说明文档下载地址:
http://www.5941ts.com/EasyAnalysis/demo/角点检测.rar
一组角点检测的模板
说明:
通过EasyAnalysis库中的CBmp读出包含多个矩形和组合矩形的图像数据,CBmp所读出的图像矩阵与行的排列顺序与屏幕显示顺序相反,即图像在屏幕上显示的第一行为使用CBmp读出的图像矩阵的最后一行。
像素值255代表最大亮度,即白色,值0代表最小亮度,即黑色。
一.角点的定义:
1. 外角:
形如下面形式像素点的集合:
I.
255,255
255, 0
II.
255,255
0,255
III.
0,255
255,255
IV.
255,0
255,255
2. 内角
形如下面形式像素点的集合:
I.
0, 0
0,255
II.
0, 0
255, 0
III.
255, 0
0, 0
IV.
0,255
0, 0
3. 角点
内角和外角统称角点
二.原理:
利用角点间像素的梯度信息建立模板实现角点的识别。对外角(I)扩充一行一列,得到
255,255,255
255, 0, 0
255, 0, 0
可以看出该角点即属于矩形孔的上边界点,又属于孔的左边界点,由此可以首先确定角点检测模板中用于检查垂直左边界和水平上边界的值,即:
0,1, 0
1,0,-1
0,-1,0
通过对图像应用该模板可以检测出图像中孔的左边界和上边界,由于使用CBmp读出的图像像素矩阵上下行反序,因此该检测模板变为
0,-1, 0
1, 0,-1
0, 1, 0
上面提过,角点既属于垂直边界又属于水平边界,同时还有一个重要的信息,就是在该点45,135,225,315度角的方向应存在较大梯度。以315度,即外角点(I)为例,为了利用该梯度信息,我们对模板作如下修改
1,1, 0
1,0,-1
0,-1,-1
在(0,0)和(2,2)位置添加的1和-1可以捕捉到从左上向右下方向上的梯度信息,将该模板上下反转得到程序中应用的模板
0,-1, -1
1, 0, -1
1, 1, 0
对于外角(I)利用该模板对原始图像进行卷积,由于垂直边界上不是角点的像素最多存在水平梯度和315度角的梯度,水平边界不是角点的像素最多存在垂直和315度角的梯度,而角点位置则三个方向梯度值都存在,因此如果模板中心元素为角点,那么卷积后改位置的值应该显著大于不是角点的元素的卷积值。为了避免卷积后模板中心元素的值大于255,又能够保留区分角点和其他点的信息,将模板乘以系数1/3(因为该模板对只包含矩形和组合矩形的二值图像最大值<=255*3=765),得到检测135度方向上角点的模板如下:
1/3, 1/3,0
1/3, 0,-1/3
0,-1/3,-1/3
程序中用到的模板
0,-1/3, -1/3
1/3, 0, -1/3
1/3,1/3, 0
如果使用上面模板卷积得到的结果显著大于其它结果,则认为该点为角点。程序运行结果(为了直观将角点处周围6*6共36个像素标为红色)
将上面得到的模板逆时针翻转270度得到45度方向上的角点检测模板:
1/3, 1/3,0
1/3, 0,-1/3
0,-1/3,-1/3
逆时针旋转180度得到135度方向上角点检测模板
0,-1/3,-1/3
1/3, 0,-1/3
1/3,1/3, 0
逆时针旋转90度得到225度方向上角点检测模板
-1/3,-1/3,0
-1/3, 0,1/3
0, 1/3,1/3
根据上面模板对角点进行检测,得到如下结果(外角点用6*6蓝色像素矩阵标注,内角点用6*6红色矩阵标注)
三. 内角和外角的识别
观察外角点(I)(II)(III)(IV)和内角点(I)(II)(III)(IV)可以看出,检测外角的模板同样对该方向上的内角有效,唯一区别内角与外角的标志在于模板中心像素是白色还是黑色,显然如果是黑色则该点位外角点(I),否则为内角点(I)。因此,可以通过这一特点区分内角与外角。根据该思路设计程序,检测结果如下(红色矩形标注内角,天蓝色矩形标注外角)
统计上述图像中外角总数为46,内角总数为18个, 利用(外角数-内角数)/4 可以计算出图形中孔的数量为7个。