2011-05-11 66 views
0

我想找到相似的斑点(几乎尺寸相同,并在同一行)。 Here是一个示例图像。最好的算法来寻找爱科斑点系列

我使用C#和OpenCV。

+0

所有的斑点都是矩形的吗?如果只是遍历图像,找到所有的矩形,然后使用任何你想要的“相似”标准。 – soandos 2011-05-11 20:22:58

回答

5

我建议做一个Blob detection并确定重心和斑点的面积。我假设图像中的旋钮会被黑色填充?如果没有,那么这一步必须在提取blob之前进行。有了这个坐标,你就可以计算点和线之间的差异。通过移动图像中的线条,您会得到不同的“错误”。见here如何计算这个误差(只是一个例子)

minimizing这个错误,那么你有你的线。

要计算你也可以考虑先以滤除斑点的大小斑点坐标(只有差不多大小)

+0

这是一个不错的方法。我会建议一个变体:将候选斑点投影到与测试线垂直的线上。然后,这些预测需要足够重叠,以便将这些斑点视为“在一条线上”。 (如果统计技术适合于这个问题,这甚至可以作为对blob来自单一分布的假设的测试来完成)。这会做一些与你最后一次按blob大小过滤的建议有所不同,尽管它也是一种处理不同Blob大小的方法。 – 2011-05-12 01:58:34

+0

Ted:这是投影到线上的一种“Blob密度函数”,或者?我喜欢。 – schoetbi 2011-05-12 05:43:56

+0

我在想,这将是一个密度投影到正交线上的子空间。 – 2011-05-12 05:58:04

1

至于你提到的错误,如果只有相同大小和趴在同一行(大约)是标准,那么这是另一种解决方法。

  1. 使用OpenCV函数cvFindContours(),查找连接的组件(猜测你可以松散地调用blob检测,不确定)。 This链接提供了工作代码来做到这一点。

  2. 计算每个轮廓的Bounding Rectangle,当您逐步浏览图片中存在的所有轮廓列表时。

  3. Bounding Rectangle本质上是一个CvRect结构,它包含包围选定轮廓/特征的最小矩形的x位置,y位置,宽度和高度。 typedef struct CvRect { int x; int y; int width; int height; } CvRect;

  4. 当然,对于你的照片,我会比较轮廓的y位置是选择那些接近的。

  5. 此外,在结构的宽度和高度字段将告诉你在大小相似。

注:同一地区可能并不总是表示相同的尺寸。例如。 a * b = ab,也是(a/4)*(4b)= ab,但几乎没有相同的大小。代码示例是用C语言编写的,但我认为用C#编写它不会太难。希望这对你有用!