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

Graphics 如何识别此图像中的矩形?,graphics,artificial-intelligence,machine-learning,computer-vision,Graphics,Artificial Intelligence,Machine Learning,Computer Vision,我有一个水平线和垂直线的图像。事实上,这张图片是英国广播公司网站转换成水平线和垂直线的。 我的问题是,我希望能够找到图像中的所有矩形。我想写一个计算机程序来找出所有的矩形。 是否有人知道如何做这件事,或者就如何开始提出建议?这个任务对于我个人来说很容易找到可视矩形,但我不知道如何将其描述为一个程序 图为英国广播公司网站 为了更新这一点,我编写了代码,将BBC网站图像转换为水平线和垂直线,问题是这些线在拐角处不完全相交,有时它们不完全形成矩形。谢谢 从左到右迭代,直到达到彩色像素,然后使用修改的

我有一个水平线和垂直线的图像。事实上,这张图片是英国广播公司网站转换成水平线和垂直线的。 我的问题是,我希望能够找到图像中的所有矩形。我想写一个计算机程序来找出所有的矩形。 是否有人知道如何做这件事,或者就如何开始提出建议?这个任务对于我个人来说很容易找到可视矩形,但我不知道如何将其描述为一个程序

图为英国广播公司网站



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

从左到右迭代,直到达到彩色像素,然后使用修改的泛光填充算法。关于algo的更多信息另一种方法是找到图像上的任何彩色像素,然后使用

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}
然后向上做同样的事情。
现在你已经定义了一条直线。然后使用线的端点将线近似匹配为矩形。如果它们不是像素完美的,你可以做一些树状折叠。

泛光填充可以工作,或者你可以使用边缘跟踪算法的修改

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

从左到右遍历所有像素,每当发现彩色像素时,将其坐标添加到数组中

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


知道每一行的开始是它的左/上像素,你可以很容易地检查任何4行是否包含一个矩形

假设它是一个合理的无噪声图像(不是屏幕的视频),那么简单的泛光填充算法之一应该可以工作。您可能需要对图像进行放大/腐蚀以缩小间隙

查找直线的常规方法是Hough变换(然后以直角查找直线) Opencv是最简单的方法


看看这个问题

有几种不同的方法解决您的问题。我会用一个像这样的工具。您将可以灵活地定义“矩形”,即使它不是“完全闭合的”(填充算法将失败)


另一种可能是使用一种方法,这种方法基本上是数据驱动的,而不是像前一种方法那样的定义驱动的。你必须给你的算法几个关于矩形是什么的“例子”,它最终会学习(以a和错误率)。

我相信你在寻找答案。

在计算机视觉中,有一种称为广义的算法,可能可以解决你的问题。应该有开源代码实现了这个算法。只需搜索它。

要从几乎接触的水平线和垂直线的图像中获得矩形,请执行以下操作:

  • 转换为二进制(即所有行 是白色的,其余的是黑色的)
  • 执行一个(在这里,您使每个接触源图像中的白色像素或源图像中的白色像素的像素变为白色。触摸仅为直线(因此每个像素“接触”其左侧、右侧、上方和下方的像素),这称为“4-连接”
  • 如果两端之间的间隙大于2像素宽,请重复步骤3几次,但不要太频繁
  • 执行骨架操作(此处,如果源图像中的每个像素都是白色像素,并且至少接触一个黑色像素,则将输出图像中的每个像素设置为黑色,并且它接触的白色像素(在源图像中)都彼此接触。再次使用4-连通性定义接触。请参阅下面的示例
  • 重复步骤4,直到重复后图像不变(所有白色像素均为线端或连接器)
  • 幸运的是,这将首先显示带有粗粗线条的框,在图像上留下粗粗的伪影(在步骤3之后)然后在第5步之后,所有的厚脂肪伪影都会被移除,而所有的盒子都会保留下来。你需要在第3步中检查重复次数以获得最佳结果。如果你对图像形态学感兴趣

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

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

    我运行了opencv提供的houghlines演示,下面是您提供的图像的结果(检测到的线标记为红色):

    (来源:)

    neat。创建图像使用的是什么程序?您是否可以使用其源代码(识别框以便绘制它们)用于您自己的目的?或者您是否只有最终的.png图像可供使用?您的示例图像很有帮助,因为它提出了一个重要的问题。其中有许多形状近似于矩形,但它们是不同的由于间隙而不完整,通常在拐角处。您是否在寻找所有完美的矩形或形状,大部分近似于矩形?后者将更难确定。您能否分享您的结果,以及您是如何获得上述图形的?我的浏览器说链接下的网站是一个报告攻击页面。您可以重新上传吗加载图像?方法简单,但需要大量编码
    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