检测图像中某种颜色的矩形

时间:2016-03-25 14:15:09

标签: image opencv image-processing

我有很多像这个gif中的图像: enter image description here

我想裁剪它们以移除不均匀的边框,只留下边框内的文字,例如: enter image description here

有些源图像有点旋转,边框位置略有不同,所以我需要动态找到文字周围的矩形。

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:0)

我确信没有最好的方法可以做任何事情。

您可以将图像缩小到仅帧的色彩范围(色调)。

然后使用Hough变换或角点检测器等找到该框。您也可以应用模板匹配来查找框的角,如果它们看起来总是一样的。

这个问题可以通过广泛的方式为您提供完整的解决方案。你为什么不把它分成小问题。

答案 1 :(得分:0)

不是一个完整或严格的解决方案,但答案可能有助于您解决问题。我选择使用安装在大多数Linux发行版上的ImageMagick,并且可以免费用于OSX和Windows。在Sourceforge处有一个名为im4java的Java绑定(我不使用或不知道)。你也可以用PHP,Perl,C ++,C ......

来做

无论如何,在命令行,您可以将手稿的第一帧([0])转换为色相/饱和度/亮度色彩空间并丢弃饱和度和亮度,这样您就可以使用Hue,就像这样:

convert manuscript.gif[0] -colorspace hsl -separate -delete 1,2 -blur 0x3 -contrast-stretch 10% -threshold 50% hue.png

然后我对比拉伸并保存为hue.png。它看起来像这样:

enter image description here

然后我可以拍摄该图像(hue.png)并在其上应用“连接组件分析”(也称为“Blob Analysis”),并丢弃所有的小斑点 - 斑点只是一个连续的区域。

convert hue.png                                      \
   -define connected-components:verbose=true         \
   -define connected-components:area-threshold=10000 \     
   -connected-components 8 -auto-level output.png

Objects (id: bounding-box centroid area mean-color):
  6: 645x1033+50+78 372.4,594.0 663108 gray(0)
  0: 851x1231+0+0 595.5,678.2 244279 gray(0)
  2: 728x1123+9+36 376.7,604.3 140194 gray(255)

如果我在第一个黑框中画出红色,就像这样:

convert manuscript.gif[0] -fill none -stroke red -strokewidth 5 -draw "rectangle 50,78 695,1100" result.png

我会得到这个:

enter image description here

或者,我可以像这样裁剪:

convert manuscript.gif[0] -crop 645x1033+50+78 result.png

得到这个:

enter image description here

你可能不得不对数字和数值进行一些调整,但总体思路应该适用于你的问题。

答案 2 :(得分:-1)

Opencv的轮廓检测和近似将解决这个问题。 我做了以下, 转换为灰度 阈值使用otsu 检测轮廓 排序轮廓 近似为矩形。 从图像中间走,以提取第一个最大的矩形

enter image description here当我拍摄截图时,图片被挤压了。