我想检测图像中的对象并在另一个页面中重绘它,所以任何人都可以建议可以使用哪种算法?

时间:2012-02-08 10:44:57

标签: java android image image-processing ocr

我在image processing上做项目(在图像中识别分子并在编辑器中绘制这些分子)。因此需要帮助识别,哪种算法可用于检测图像中的线,曲线,分叉和字符等对象。

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

示例图像如下

enter image description here

2 个答案:

答案 0 :(得分:3)

正如gcalmettes已经注意到的,Hough可以检测线。但是,您正在寻找线段,这对标准算法来说是一个轻微的皱纹。

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

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

霍夫技术也可用于寻找圆圈。对于曲线拟合,您可以使用样条拟合技术或有时甚至是多项式拟合,尽管后者往往对实际图像分析不太有用。

你必须小心骨骼化/细化(或中轴转换),因为细化会在三向交叉点周围产生不希望的曲线,例如字符“H”中的两个T交叉点。但是,细化算法可以很快。查看WinTopo中Stentiford和Zhang-Suen细化算法的实现,这是一个用于光栅到矢量转换的应用程序(即像素到曲线):

http://wintopo.com/

在您的样本图像中,有几个已知固定角度的双向和三向交叉的例子。如果您稍微研究角点检测,您应该看到如何将其扩展到检测固定角度的交叉点。

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

如果图像中字符和图形的大小不变 - 例如,如果“H”总是高40像素 - 则可以使用模板匹配来查找任何模式。 (搜索术语“规范化互相关”,尽管维基百科条目可能没有那么有用。)

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

简单地说,如果图像中的要素是恒定大小,则可以创建与要识别的对象的亮/暗图案匹配的模板(类似于蒙版或模板)。模板匹配相对容易实现和调试,并且比Hough更直观。

简单来说,假设您将每个黑色像素分配给值0(没有反射),每个白色像素分配值1(全反射)。要找到3 x 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 :(得分:1)

您可以使用Hough transform来检测直线或圆圈。 例如在scikits-image librairy(python)中已经实现了该算法的非常简单的实现。请参阅exemple

从您提供的图像中,您可能需要考虑在应用Hough变换之前应用骨架化算法将二进制对象减少为1像素宽的表示。