我有一张带有水平线和垂直线的图像。其实这张图片是BBC网站转换成横竖线的。我的问题是我希望能够找到图像中的所有矩形。我想编写一个计算机程序来查找所有矩形。有谁知道如何做到这一点或建议如何开始?作为一个人,这个任务很容易找到视觉矩形,但我不知道如何将它描述为一个程序。
图片是这里的 BBC 网站http://www.bbc.co.uk/
对此更新,我编写了将 BBC 网站图像转换为水平和垂直线的代码,问题是这些线在拐角处不完全相交,有时它们不完全形成一个矩形。谢谢!
我有一张带有水平线和垂直线的图像。其实这张图片是BBC网站转换成横竖线的。我的问题是我希望能够找到图像中的所有矩形。我想编写一个计算机程序来查找所有矩形。有谁知道如何做到这一点或建议如何开始?作为一个人,这个任务很容易找到视觉矩形,但我不知道如何将它描述为一个程序。
图片是这里的 BBC 网站http://www.bbc.co.uk/
对此更新,我编写了将 BBC 网站图像转换为水平和垂直线的代码,问题是这些线在拐角处不完全相交,有时它们不完全形成一个矩形。谢谢!
Opencv(用 c 编写的图像处理和计算机视觉库)实现了霍夫变换(简单的霍夫变换在图像中找到线,而广义的变换找到更复杂的对象),这可能是一个好的开始。对于确实有闭合角的矩形,还有角检测器,例如cornerHarris,可以提供帮助。
我运行了 opencv 提供的 houghlines 演示,这是您提供的图像上的结果(检测到的线标记为红色):(
来源:splintec.com)
我相信您正在寻找广义霍夫变换。
在计算机视觉中,有一种称为广义霍夫变换的算法可能可以解决您的问题。应该有实现该算法的开源代码。只是搜索它。
假设它是一个合理的无噪声图像(不是屏幕视频),那么其中一个简单的填充算法应该可以工作。您可能需要在图像上运行扩张/腐蚀以缩小差距。
查找线的正常方法是 Hough 变换(然后查找直角线) Opencv 是最简单的方法。
从左到右迭代,直到你碰到一个颜色像素,然后使用修改后的洪水填充算法。有关算法洪水填充的更多信息 @ wiki
另一种方法是在图像上找到任何彩色像素,然后使用
while(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
然后向上做同样的事情。现在你已经定义了一条线。然后使用线条的末端将线条近似匹配为矩形。如果它们不是像素完美的,您可以进行某种阈值处理。
洪水填充会起作用,或者您可以使用边缘跟踪算法的修改。
你要做的是:创建一个二维数组(或任何其他 d2 数据结构)- 每行代表屏幕上的一条水平像素线,每列代表一条垂直线
遍历所有像素,从左到右,当你找到一个有颜色的像素时,将它的坐标添加到数组中
遍历数组并查找行并存储每个行的开始和结束像素(不同的数据结构)
知道每行的开头是其左/顶部像素,您可以轻松检查是否有任何 4 行包含一个矩形
要从几乎接触水平和垂直线到矩形的图像中获取:
运气好的话,这将首先显示带有粗粗线条的框,在整个图像上留下粗粗伪影(在步骤 3 之后),然后在步骤 5 之后,所有粗粗伪影都将被移除,而所有框仍然存在. 您需要调整步骤 3 中的重复次数以获得最佳结果。如果您对图像形态学感兴趣,这是我学习的一门非常好的入门课程的书。
样本:(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