我试图使用不同的方法检测灰度图像中的白色矩形:轮廓检测和霍夫变换 . 不幸的是,我正在处理的图像有一些限制,即
-
图像中有许多功能,矩形不是唯一的功能
-
矩形可以合并到其他要素(例如,其中一个矩形边可以与长直线重叠)
-
矩形可能包含一些其他功能(例如矩形内的字母,数字或某些徽标)
-
有些特征看起来像矩形(例如,字符'D'看起来像一个矩形,右上角和右下角有一个小弧形;另一个例子是梯形而不是平行四边形)
-
矩形可以顺时针和逆时针旋转0到15度
-
有可能在不同的光照条件下(例如1个像素间隙)将线分成几行,因此过滤线的最小线长必须很小(例如在Hough变换中)
-
当最小行长度设置为较小值时,更常见的是在不同方向上查看同一行的重复行(即需要组合多行)
对于contonours方法,一些图像的轮廓被打破 . 此外,图像可以包含诸如矩形之类的特征(例如字符“D”) . 我不确定这是不是一个好方法 .
我看过许多文章/论坛建议使用Hough变换检测矩形,如下面的帖子 . 不幸的是,我必须设置最小行长度的小值,并看到重复的行 . 我不知道如何处理上面提到的几点(例如,组合所有重复的行并为每个边选择一行,如何区分大多数部分的特征是线但是像'D'那样的小弧,以及如何隔离正方形,其中一条边与一条长直线合并,等等 .
Hough transformation vs Contour detection for Rectangle recognition with perspective projection
欢迎任何建议!
EDIT: Add some pictures
Character D
Rectangle with logo and the edges are merged with long straight line
Trapezoid (with shadow on the top forming trapezoid in the bottom)
1 回答
我建议您尝试在每个图像上使用binary threshold(自适应或其他),这将为您的轮廓检测提供一些清晰的线条 . 您还可以erode/dilate图像去除噪点(例如第二张图片中的细线)
然后使用轮廓检测,并对轮廓进行计数,找到图像中具有四个边的最大对象(这可能是您的对象) .
在使用二进制/侵蚀之前制作图像的副本,以便在获得轮廓检测感兴趣的区域后,可以将复制图像裁剪到该区域 .
道歉示例链接是用python编写的,但我相信一旦你明白了,将它移植到C将很容易 .
希望这可以帮助 .
EDIT
通过对每个图像进行阈值处理,轮廓检测,然后在最大的轮廓集周围绘制一个边界框,我自己尝试了上述方法 .
下面看到结果:
Bounding box around largest set of contours
The same, drawn over the original images