我有一张二进制图片,想要检测/跟踪其中的曲线。我不知道任何信息(坐标、角度等)。有没有人能指导我应该如何开始?假设我有这张图片
我想将曲线与其他直线分离开来。我只对曲线及其参数感兴趣。我想将曲线的信息(在数组中)存储起来以便以后使用。
我有一张二进制图片,想要检测/跟踪其中的曲线。我不知道任何信息(坐标、角度等)。有没有人能指导我应该如何开始?假设我有这张图片
我想将曲线与其他直线分离开来。我只对曲线及其参数感兴趣。我想将曲线的信息(在数组中)存储起来以便以后使用。
由于您似乎已经有一个好的二进制图像,最简单的方法可能是分离图像的不同连通部分,然后计算它们的参数。
首先,您可以通过扫描图像进行分离,并在遇到黑色像素时应用标准的洪水填充算法以查找形状中的所有像素。 如果您使用Matlab图像工具箱,则可以使用bwconncomp和bwselect过程来执行此操作。 如果您的形状不是完全连接的,则可以对图像应用形态学闭合操作以连接形状。
分割出不同的形状后,您可以通过测试其偏离直线的程度来过滤曲线。您可以简单地选择曲线的端点,并计算其他点距离由端点定义的直线多远。如果这个值超过了某个最大值,则说明您有一条曲线而不是一条直线。使用链码也可以提供另一种解决方案。 理解OCR中的Freeman链码
链码基本上为每个像素分配一个值,介于1-8(或0到7)之间,表示你的连接前身在8连通邻域中的哪个像素位置。因此,就像Hackworth建议的那样,首先执行连接组件标记,然后为每个组件曲线计算链码。查看链码的分布和梯度,可以轻松区分直线和曲线。但是,该方法的问题在于当我们有振荡曲线时,梯度不太有用,因此需要依靠链码的聚类!
1)阅读一本关于图像分析的书籍。
2)扫描黑色像素,找到后查找相邻的黑色像素,存储它们的位置,然后将它们变为白色。这样可以得到一个对象的点并从图像中删除它。只需重复此过程,直到没有剩余的黑色像素为止。
如果您想将曲线与直线分开,请尝试进行线拟合,然后获取相关系数。类似的算法也适用于曲线,相关性告诉您该点与理想形状的接近程度。
虽然我不是计算机视觉专家,但我认为你可以使用一些基本的边缘检测算法(例如Sobel滤波器)相对容易地在二进制图像中检测出线条/曲线。