如何识别此图像中的矩形?

Posted

技术标签:

【中文标题】如何识别此图像中的矩形?【英文标题】:How to recognize rectangles in this image? 【发布时间】:2010-12-21 12:09:22 【问题描述】:

我有一张带有水平线和垂直线的图像。其实这张图片是BBC网站转换成横竖线的。 我的问题是我希望能够找到图像中的所有矩形。我想编写一个计算机程序来查找所有矩形。 有谁知道如何做到这一点或建议如何开始?作为一个人,这个任务对我来说很容易找到视觉矩形,但我不知道如何将它描述为一个程序。

图片是这里的BBC网站http://www.bbc.co.uk/


对此进行更新,我编写了将 BBC 网站图像转换为水平和垂直线的代码,问题是这些线在拐角处不完全相交,有时它们不完全形成一个矩形。谢谢!

【问题讨论】:

整洁。什么程序用于创建图像?你可以使用它的源代码 - 识别框以便绘制它们 - 用于您自己的目的吗?还是您只有最终的 .png 图像可供使用? 您的示例图像很有帮助,因为它提出了一个重要问题。那里有许多近似矩形的形状,但由于间隙而不完整,通常在角落。您是否正在寻找所有完美的矩形或大部分近似矩形的形状?后者将更难确定。 您能否分享一下您的结果以及您是如何得出上图的? 我的浏览器显示链接下的站点是一个报告的攻击页面。 可以重新上传图片吗? 【参考方案1】:

Opencv(用 c 编写的图像处理和计算机视觉库)实现了霍夫变换(简单的霍夫变换找到图像中的线条,而广义的变换找到更复杂的对象),这可能是一个好的开始。对于确实有闭合角的矩​​形,还有角检测器,例如cornerHarris,可以提供帮助。

我运行了 opencv 提供的 houghlines 演示,这是您提供的图像上的结果(检测到的线标记为红色): (来源:splintec.com)

【讨论】:

你能把 GitHub 或任何 repo 链接放到试试这个***.com/users/235263/elijah【参考方案2】:

我相信您正在寻找generalized Hough transform。

【讨论】:

【参考方案3】:

在计算机视觉中有一种称为 Generalized Hough Transform 的算法也许可以解决您的问题。应该有实现该算法的开源代码。只需搜索即可。

【讨论】:

【参考方案4】:

假设它是一张相当无噪点的图片(不是屏幕视频),那么其中一种简单的填充算法应该可以工作。您可能需要在图像上运行扩张/腐蚀以缩小差距。

寻找线的正常方法是霍夫变换(然后找到直角的线) Opencv 是最简单的方法。

看看这个问题OpenCV Object Detection - Center Point

【讨论】:

【参考方案5】:

有几种不同的方法可以解决您的问题。我会使用morphological image processing 工具,例如this one。您将可以灵活地定义“矩形”,即使不是“完全闭合”(填充算法将失败)。

另一种可能性是使用machine learning 方法,它基本上比前一种方法更受数据驱动而不是定义驱动。您必须为您的算法提供几个矩形的“示例”,它最终会学习(带有bias 和错误率)。

【讨论】:

【参考方案6】:

从左到右迭代,直到找到一个颜色像素,然后使用修改后的填充算法。有关算法的更多信息flood fill @ wiki

【讨论】:

【参考方案7】:

另一种方法是在图像上找到任何彩色像素,然后使用

while(pixel under current is colored)

  lowest pixel coordinate = pixel under current
  current = pixel under

然后向上做同样的事情。 现在你已经定义了一条线。然后使用线条的末端将线条近似匹配为矩形。如果它们不是像素完美的,您可以进行某种阈值处理。

【讨论】:

方法简单,但需要大量编码【参考方案8】:

洪水填充会起作用,或者您可以使用边缘跟踪算法的修改。

你要做的是: 创建一个二维数组(或任何其他 d2 数据结构)- 每行代表屏幕上的一条水平像素线,每列代表一条垂直线

从左到右遍历所有像素,每当你找到一个有颜色的像素时,将其坐标添加到数组中

遍历数组并找到行并存储每个行的开始和结束像素(不同的数据结构)

知道每行的开头是它的左/上像素,您可以轻松检查是否有任何 4 行包含一个矩形

【讨论】:

【参考方案9】:

要从几乎接触水平和垂直线到矩形的图像中获取:

    转换为二进制(即所有行 是白色的,其余的是黑色的) 执行Binary dilation(此处您将接触到源图像中的白色像素或源图像中的白色像素的每个像素设置为白色。仅触摸是笔直的(因此每个像素“接触”其左侧的像素) ,对,在它的上面和下面)这被称为“4-connected” 如果两端之间的间隙大于 2 个像素宽,请重复步骤 3 几次,但不要太频繁! 执行骨架操作(如果源图像中的一个白色像素至少接触一个黑色像素并且它接触到的白色像素(在源图像中)都相互接触,则在此将输出图像中的每个像素设为黑色. 再次触摸定义为 4 连通性。请参见下面的示例。 重复第 4 步,直到图像在重复后不发生变化(所有白色像素都是线端或连接器)

如果运气好的话,这将首先显示带有粗脂肪线的框,在图像上留下厚脂肪伪影(在第 3 步之后),然后在第 5 步之后,所有粗脂肪伪影都将被移除,而所有的盒子都留下了。您需要调整步骤 3 中的重复次数以获得最佳结果。如果你对图像形态学感兴趣,this is the book of a really good introductory course I took.

示例:(0=黑色,1=白色,正在考虑每个 3x3 块中心的像素,左输入,右输出)

011 => 011    
011 => 001  all other white pixels touch, so eliminate      
011 => 011    

010 => 010    
010 => 010  top pixel would become disconnected, so leave      
010 => 010    

010 => 010    
010 => 000  touches only one white pixel, so remove     
000 => 000    

010 => 010    
111 => 111  does not touch black pixels, leave    
010 => 010    

010 => 010    
011 => 011  other pixels do not touch. so leave    
000 => 000    

【讨论】:

以上是关于如何识别此图像中的矩形?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别图像中的闭合连通分量?

OCR,识别和裁剪矩形

Halcon学习(车牌识别)

图像识别中的图像特征类别

基于opencv实现人脸识别案例

如何在 JavaFX 中的矩形或圆形内添加图像?