我有二进制图像,我想检测/跟踪该图像中的曲线。我什么都不知道(坐标,角度等)。任何人都可以指导我如何开始?假设我有这张图片
我想将曲线和其他线分开。我只对曲线及其参数感兴趣。我想存储曲线的信息(在数组中)以供以后使用。
答案 0 :(得分:13)
这实际上取决于你对“曲线”的意思。
如果您只想将每个离散的像素集合标识为“曲线”,则可以使用connected-components算法。每个组件对应于一组像素。然后,您可以应用一些测试来确定组件的线性度或其他一些功能。
如果您正在寻找直线,圆形曲线或任何其他参数曲线,您可以使用Hough transform来检测图像中的元素。
最好的方法实际上取决于您要查找的曲线,以及曲线所需的信息。
参考链接:
答案 1 :(得分:1)
1)阅读有关图像分析的书
2)扫描黑色像素,当找到相邻的也是黑色的像素时,存储它们的位置然后将它们变成白色。这将获取一个对象中的点并将其从图像中删除。只要不断重复,直到没有剩余的黑色像素。
如果要将曲线与直线分开,请尝试线拟合,然后获取相关系数。类似的算法可用于曲线,相关性告诉您点与理想形状的接近程度。
答案 2 :(得分:1)
由于您似乎已经拥有了良好的二进制图像,因此最简单的方法是将图像的不同连接组件分开,然后计算它们的参数。
首先,您可以通过扫描图像来进行分离,当遇到黑色像素时,您可以应用标准flood-fill算法来找出形状中的所有像素。如果你有matlab图像工具箱,你可以找到使用bwconncomp和bwselect程序。如果您的形状没有完全连接,您可以对图像应用morphological closing操作来连接形状。
在分割出不同的形状后,您可以通过测试它们与线条的偏差来过滤掉曲线。您可以简单地通过拾取曲线的端点,并计算其他点距端点定义的线的距离来完成此操作。如果此值超过某个最大值,则表示曲线而不是直线。
另一种方法是测量端点距离与物体长度的比率。对于线条,该比率接近1,对于曲线和摇摆形状,该比率更大。
如果您的图像具有您希望与曲线分离的角度,则可以检查曲线的方向渐变。对形状进行分段,从中选取一组等距点,并为每个点计算前一点和下一点的角度。如果角度的差异太大,则没有平滑的曲线,而是一些有角度的形状。
实现中可能遇到的困难包括粗线,您可以通过骨架转换来解决这些问题。对于骨架的matlab实现和查找曲线端点,请参阅matlab image processing toolkit documentation
答案 3 :(得分:1)
使用链码还有另一种解决方案。 Understanding Freeman chain codes for OCR
链码基本上为每个像素指定1-8(或0到7)之间的值,表示连接的前任所在的8个连接邻域中的哪个像素位置。因此,如Hackworths中提到的那样,建议执行连接组件标记,然后计算每个组件曲线的链代码。查看链码的分布和梯度,可以很容易地区分线和曲线。该方法的问题是当我们有osciallating曲线时,在这种情况下,渐变不太有用,一个取决于链码的聚类!
答案 4 :(得分:-2)
我不是计算机视觉专家,但我认为您可以使用一些基本的边缘检测算法(例如索贝尔滤波器)相对容易地检测二进制图像中的线条/曲线。