我正在开发一个应用程序,用于识别圆形/椭圆形内类似线条的特征。这些形状看起来如下所示(这里展示了两个):
- 形状本身可以在圆形和椭圆形之间略有变化。
- 每个形状内部最多有5条线,这些线大致位于形状的相同区域。
- 这些线在长度、粗细、旋转和曲度上可能略有不同。
- 这些线有时可能会轻微接触/交叉。
- 通常有确切的5条线,但偶尔可能完全缺少一条线。
- 我对颜色不关心,黑白阈值处理就足够了。
每个对象(总共100多个)将通过视频单独捕获;捕获过程是手动/物理操作(即每次我都手持相机)。我完全控制相机,因此可以为每次捕获一致地定位相机。
目前我正在尝试使用OpenCV进行识别。我能够修改样本“人脸识别”应用程序,使用另一个Haar标识符XML文件,但这似乎只能处理外部圆形/椭圆形的检测。
我希望为每个样本生成一个对象,以描述5条内部线条以便进一步处理:
{ 1: { length: 20, avg_thick: 2.3 }, 2: { length: 4, avg_thick: 2.0 }, 3: { length: 9.1, avg_thick: 2.1 }, 4: { length: 2, avg_thick: 1.9 }, 5: { length: 17, avg_thick: 2.1 }}
这是我第一次涉及图像识别项目。应该使用/研究哪些算法或程序来实现这个目标?谢谢!
更新:
由于图像是手动拍摄的,它们并非纯黑白。尝试应用阈值处理时,形状内部的(微弱)线条有时会消失。我如何改进阈值处理结果?
回答:
如果线条大致是直的,可以使用霍夫变换来查找所有线条,并使用圆形版本的霍夫变换来查找所有圆形/椭圆形(然后你可以检查是否找到了边界圆形/椭圆形,以及哪些线条在其内部,例如)。
如果线条不是直的:你的意思是“狭长的区域”而不是线条,对吗?:) 你需要先进行阈值处理,然后进行骨架化。有用的教程:“使用OpenCV-Python进行骨架化”。由于你还需要宽度(=从骨架到边缘的距离),请使用skimage.morphology.medial_axis(…, return_distance=True)。你可能还需要某种方法来遍历每个骨架的分支并修剪短分支(很遗憾,没有现成的解决方案可以做到这一点)。
Haar类型的方法完全不适用,它只能在特征具有固定相对位置和形状的情况下(即使是理论上)工作。你需要某种几何特征提取算法,而不是图像识别。
编辑: Python示例代码:
import numpy, scipy, scipy.ndimage, skimage.morphology, matplotlib.pyplotimg = scipy.ndimage.imread("test.png")# 快速且粗略的阈值处理binary_img = img[:,:,0] < 0.1# 骨架化skel_binary, skel_distances = skimage.morphology.medial_axis(binary_img, return_distance=True)# 查找单个线条structure_element = scipy.ndimage.generate_binary_structure(2,2)skel_labels, num_skel_labels = scipy.ndimage.measurements.label(skel_binary, structure=structure_element)for n in range(1, num_skel_labels + 1): # 为这条线创建一个二进制标签 line = (skel_labels == n) # 从骨架计算宽度 mean_width = 2 * numpy.mean( skel_distances[ line ] ) print "line %d: width %f" % (n, mean_width) # 你需要某种方法来查找线条的末端 # 或许是最远的一对点?# 显示标签# 圆圈也被标记# 你需要某种方法来检查哪个标签是圆圈并排除它matplotlib.pyplot.imshow(skel_labels)matplotlib.pyplot.show()
这对你上面发布的图像产生了合理的结果,并且(为了检查线条粗细是否有效)对这些图像的10倍放大版本也有效。它不处理交叉的线条,也许你可以为此使用图形算法。你确实需要以某种方式排除外部圆圈(似乎总是n=1,因为标记是从左上角开始的,它找到的第一个标记区域是圆圈)。
编辑: 如何(或是否)进行阈值处理是一个有趣的问题。你可以尝试自动阈值处理,可能是基于Otsu方法,或者基于高斯混合(示例)。我认为你可能会通过某种背景和前景颜色和亮度的统计模型,结合局部自适应阈值处理,获得最佳结果。这真的取决于你的图像的性质。