2012-02-08 13 views
0

我正在做项目image processing(图像中的分子识别和在编辑器中绘制这些分子)。因此,需要帮助识别哪种算法可用于检测图像中的线条,曲线,分岔和字符等对象。我想检测图像中的对象并在另一页中重绘它,所以任何人都会请建议可以使用哪种算法?

是的,canny算法检测图像中的边缘。但是为了在编辑器中绘制这些边,我需要这些边的端点(像素值)。那么,canny的算法将如何帮助你做到这一点?或者是否有任何算法来识别这些线的端点?

样图如下

enter image description here

+1

你可能需要一个分割算法来做到这一点。请包含一个示例图像,以便我们了解哪种算法更适合。 – 2012-02-08 11:37:10

+0

@downvoter最好的做法是评论下调原因 – Nikhil 2016-11-21 05:53:10

回答

3

由于gcalmettes已经指出,霍夫可以检测。不过,您正在寻找线段,这对标准算法来说是一个小小的折痕。

另一种选择是RANSAC算法,这是值得研究的,因为它遵循一个非常不同的方法:

http://en.wikipedia.org/wiki/RANSAC

哈夫技术也可以用来寻找圈子。对于曲线拟合,您可以使用样条拟合技术,有时甚至可以使用多项式拟合,尽管后者对实际图像分析的用处不大。

由于细化会在三向交叉点(例如字符“H”中的两个T形交叉点)周围产生不希望的曲线,因此您必须小心进行镂空/变薄(或中轴变换)。细化算法可以很快,但。检查出的Stentiford和张-孙细化算法的实现在WinTopo,对于光栅到矢量转换的应用程序(即,像素的曲线):

http://wintopo.com/

在您的样本图像有2几个例子已知的固定角度的三通交叉点。如果你研究一下角点检测,你应该看看如何将它扩展到检测固定角度的交点。

http://en.wikipedia.org/wiki/Corner_detection

如果图像中的字符和图形的大小是恒定的 - 例如,如果“H”始终是40个像素高 - 然后模板匹配可以用来只找到关于任何模式。 (搜索术语“标准化互相关”,尽管维基百科条目可能不是那么有用。)

http://en.wikipedia.org/wiki/Template_matching

简单的讲,如果图像中的特征将是一个常数的大小,你可以创建一个模板(有点像面具或模板),为明/暗对象的模式匹配被识别。模板匹配相对容易实现和调试,并且比Hough更直观。简而言之,假设您将每个黑色像素赋值为0(没有反射)和每个白色像素值为1(全反射)。为了找到一个3×3填充黑色的方形,您将创建一个模板,像这样:

1 1 1 1 1 
1 0 0 0 1 
1 0 1 0 1 
1 0 0 0 1 
1 1 1 1 1 

然后,您可以检查这个模板在原始图像中的比赛。如果模板中的所有白色像素与图像中的白色像素相匹配,并且模板中的所有黑色像素与图像中的黑色像素相匹配,则匹配。

将小六边形您的苯环(或不管它是什么),你可以有这样的一个模板:

1 1 0 1 1 
1 0 1 0 1 
0 1 1 1 0 
0 1 1 1 0 
0 1 1 1 0 
1 0 1 0 1 
1 1 0 1 1 

这并不完全正确的形状,因为角度不为45度。

在某些情况下,您将无法获得模板的完美匹配,因为其他图形(例如线段,圆圈和字符)会侵入您想要查找的任何特定特征的矩形中。您可以要求模板中所有像素的90%或更多匹配,而不是完美匹配。 “标准化互相关”的“标准化”部分使得模板在对比度变化下更稳健:例如,您的图像可能是浅灰色背景上的深灰色数字,而不是白色背景上的黑色数字。

检查不同图形的各种组合后,可以将2D模板中的某些元素标识为“不关心”,即元素可以是黑色或白色。既然你可以在六边形的角落有代表键的线段,那么你有一些很好的候选者可以用来“不关心”像素。

下面的“不关心”像素用X标记。确定模板中的哪些元素可以是“不关心”像素需要一些修补和调整。

X 1 0 1 X 
1 0 1 0 1 
0 1 1 1 0 
0 1 X 1 0 
0 1 1 1 0 
1 0 1 0 1 
X 1 0 1 X 

确实有更复杂的方式来找到各种数字,但我建议最简单的方法,以防他们的工作。 Hough和RANSAC技术可以推广到找到任何东西,但实现可能会非常棘手。

1

可以使用Hough transform检测直线和圆。 该算法的一个非常直接的实现已经在例如scikits-image librairy(python)中实现。请参阅exemple

从您给出的图像作为示例,您可能需要考虑在应用霍夫变换之前应用骨架化算法将二进制对象减少为1像素宽的表示。

相关问题