首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想要检测图像中的对象,并在另一个页面中重新绘制它,所以有人会建议使用哪种算法吗?

我想要检测图像中的对象,并在另一个页面中重新绘制它,所以有人会建议使用哪种算法吗?
EN

Stack Overflow用户
提问于 2012-02-08 18:44:57
回答 2查看 1.5K关注 0票数 0

我正在做一个关于image processing的项目(在图像中进行分子识别,并在编辑器中绘制这些分子)。所以想要帮助识别,哪种算法可以用来检测图像中的直线、曲线、分叉和字符等对象。

是的,canny的算法检测图像中的边缘。但是要在编辑器中绘制这些边,我需要这些边的端点(像素值)。那么,精明的算法将如何帮助您做到这一点呢?或者,有没有什么算法可以识别这些线的端点?

示例图片如下

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-09 11:52:33

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

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

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

Hough技术也可以用来寻找圆。对于曲线拟合,您可以使用样条拟合技术,有时甚至可以使用多项式拟合,尽管后者对于真实世界的图像分析往往不太有用。

您必须小心骨架化/细化(或中轴变换),因为细化将倾向于在三向交叉点周围产生不需要的曲线,例如字符"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未填充的黑色正方形,您可以创建一个模板,如下所示:

代码语言:javascript
运行
复制
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

然后检查此模板在原始图像中的匹配项。如果模板中的所有白色像素都与图像中的白色像素匹配,并且模板中的所有黑色像素都与图像中的黑色像素匹配,则表示匹配。

为了匹配你的苯环(或其他任何东西)的一个小六边形,你可以有一个这样的模板:

代码语言:javascript
运行
复制
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标记。识别模板中哪些元素可以是“无关”像素需要进行一些修补和调整。

代码语言:javascript
运行
复制
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技术可以推广到几乎任何东西,但实现起来可能很棘手。

票数 3
EN

Stack Overflow用户

发布于 2012-02-09 04:50:26

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9191762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档