5

我正在尝试使用不同的方法检测灰度图像中的白色矩形:轮廓检测和霍夫变换。不幸的是,我正在处理的图像有一些限制,即

  1. 图像中有很多特征,矩形不是唯一的特征
  2. 矩形可以合并到其他特征(例如,矩形边缘之一可以与一条长直线重叠)
  3. 矩形可以包含一些其他特征(例如矩形内的字母、数字或一些徽标)
  4. 有一些特征看起来像矩形(例如字符'D'看起来像一个在右上角和右下角有小弧的矩形;另一个例子是梯形而不是平行四边形)
  5. 矩形可以顺时针和逆时针旋转 0 到 15 度
  6. 在不同的照明条件下(例如 1 个像素间隙),线条可能会被分成几条线,因此过滤线条的最小线条长度必须很小(例如在 Hough 变换中)
  7. 当最小线长设置为较小的值时,更常见的是同一条线在不同方向看到重复线(即需要合并几条线)

对于轮廓方法,一些图像的轮廓被破坏了。此外,图像可以包含矩形等特征(例如字符“D”)。我不确定这是否是一个好方法。

我看到很多文章/论坛建议使用霍夫变换来检测矩形,如下面的帖子。不幸的是,我必须设置最小行长度的小值并且看到重复的行。我不知道如何处理上面提到的点(例如,结合所有重复的线并为每个边缘只选择一条线,如何区分大部分是线但带有像“D”这样的小弧线的特征,以及如何隔离一个边与一条长直线合并的正方形等)。

使用透视投影进行矩形识别的霍夫变换与轮廓检测

欢迎任何建议!

编辑:添加一些图片

字符 D

字符 D

矩形边缘与长直线合并

带徽标的矩形,边缘与长直线合并

在此处输入图像描述

梯形(顶部有阴影,底部形成梯形)

4

1 回答 1

1

我建议您尝试在每个图像上使用二进制阈值(自适应或其他),这将为您的轮廓检测提供一些清晰的线条。您还可以腐蚀/扩大图像以消除噪声(例如第二张图像中的细线)

然后使用轮廓检测​​,并计算轮廓,找到图像中具有四个边的最大对象(这可能是您的对象)。

在使用二进制/腐蚀之前制作图像的副本,这样一旦您从轮廓检测中获得感兴趣的区域,您就可以将复制图像裁剪到该区域。

抱歉,示例链接是用 python 编写的,但我相信一旦你明白了,将它移植到 C++ 会很容易。

希望这可以帮助。

编辑

刚刚自己尝试了上述方法,对每张图像进行阈值化、轮廓检测,然后在最大的一组轮廓周围绘制一个边界框。

下面看结果:

在此处输入图像描述

围绕最大轮廓集的边界框

在此处输入图像描述

相同,绘制在原始图像上

在此处输入图像描述

于 2015-05-07T08:31:01.497 回答