` 在图像处理中,特征检测是一个比较有趣和实用的部分,利用它我们可以做一些很有实际应用价值的应用,这次来分享一下特征检测中的一个重要的部分——斑块检测。 斑块是图像中由相似像素点构成的一块区域,它可以是相对于背景比较亮的一块区域,也可以是比较暗的一块区域,也可以是一块与其它部分有不同色度的区域,总之,只要检测部分有相对于其它物体或背景不同的色彩特征,就能加以区分检测。斑块检测在机器视觉中国非常有用,这是因为很多东西都可以被描述成相对于背景的一块具有特殊颜色或形状的区域。 (1) 高灰度斑块检测: 在SimpleCV中,函数findBlobs()可用于检测图像中灰度比较高的区域的检测,默认情况下,函数会自动区分高灰度与低灰度区域。 下面是一个硬币检测的例子,代码如下:
注释: a) 第五行中binarize二值化函数可以增加目标物体与背景的对比度,便于斑块检测; b) 第六行中函数findBlobs()没有设置参数,它会返回一个包含图像中高灰度区域的特征集(FeatureSet); c) 第十行中blobs调用的方法show()是FeatureSet预定义的一个方法,它会在图像上显示出每一个特征,可以使用参数color、width来改变绘制时线条的颜色和宽度,默认是绿色; d) 第七行中函数area()返回一个包含每一个特征的面积的数组,其中面积以像素为单位,默认斑块大小按升序排列; e) 第八行中angle()函数返回一个包含角度的数组,其中角度以度为单位; f) 第九行中coordinates()函数返回一个包含每一个斑块的中心坐标的二维数组。 结果如图:
(2) 低灰度斑块检测: 上面演示了检测深色背景中的浅色斑块,如果要检测浅色背景中的深色斑块,可以先将图像的灰度进行翻转,即将浅色背景变为深色,将深色目标变为浅色,然后即可用上面的方法处理。 下面以检测国际象棋为例: 代码如下:
注释: a) 第五行中invert()函数将黑色棋子变为浅色,将浅色背景变为黑色; b) 第七行中在翻转之后的图像上绘制斑块; c) 第八行中将翻转图像的绘制图层叠加到原始图像上。 运行结果如图:
(3) 特定颜色斑块检测: 上面演示了基于灰度的斑块检测,下面演示一下基于色度的斑块检测,因为在现实中,许多物体的色度信息往往比灰度信息更为丰富,所以基于色度的检测更有用。 下面以气球的色度检测为例,目的是检测出颜色为红色的气球。 代码如下:
注释: a) 第五行中color.Distance()函数返回的图像是表示原始图像上每一个像素点的颜色与参数color.RED的距离,任何接近红色的颜色变成了黑色,而远离红色的颜色变成了白色,所以可以再次使用invert()函数,将目标的红色变成白色; b) 第六行中使用新的图像找到红色气球斑块; c) 第七行绘制出红色气球的位置; d) 第八行将处理后的图层叠加到原始图像上。 运行结果如图: |