2013-11-01 28 views
3

假设我有激光扫描的这样的位图,激光在它上面有一条红线,那么找到那条线的中心的正确方法是什么?要么将其坐标存储在数组中,要么只是在其上绘制思路。如何检测位图中的线条/曲线? (C#)

你会建议什么方法?优先选择能够平滑该线。

http://gyazo.com/1c8fb41b300ca83103c73c63a7150e8f.png

感谢

+0

你可以尝试使用边缘检测。见[这里](http://www.codeproject.com/Articles/93642/Canny-Edge-Detection-in-C)是一个很好的起点。 –

+0

不是,我不需要外边缘,而不需要某种“拓扑骨架”。 –

+1

如果线条总是直线向下(并且不再向上),则可以在线中搜索最高红色值的中心点。之后,只需连接所有点。 –

回答

1

我会用蠕虫来解决这个问题。让你的蠕虫从一个像素开始,让它沿着这条线移动。每当您检测到任何维度的方向变化时,您都会发出一个提示。然后通过你的观点拟合样条。添加开始和结束位置也作为点。

重要的问题:

  • 你需要保持它的像素已被访问,这样,当蠕虫完成,如果你需要开始对剩下一个新的,你可以检测到。
  • 您需要在您的蠕虫中保留一个速度向量,并根据这个向前选择权重来更接近您当前所在的行。这是因为...
  • 您需要处理拓扑变化,其中有两条或更多条线与相同的点相交。或者分成两部分。

用于安装花本身看看Numerics on NuGet

3

我建议

  • 图像转换为单色
  • 转换图像黑白使用 “图像阈值” 小
  • 拼合图零件
  • 对于每一个零件,这并不完全是bla CK,计算Hough变换和细近似段
  • 合并这些段成链,然后(例如使用的Catmull-ROM样条)

然而这不是唯一可能的方法顺利地把它们,有很多的他们

1

我的建议是:

  • 您排走行,省红色十岁上下像素的第一和最后一个出场的坐标在每一行中。
  • 然后,在每一行中的每两个坐标之间或每两个坐标的中间像素之间拉伸一条线。