如何在扫描的文档中找到段落边界框坐标?

时间:2018-10-08 15:09:36

标签: opencv neural-network statistics imagemagick-convert connected-components

我想在文档扫描中获取包含任何文本的所有区域的坐标,如下所示(质量降低;原始文件具有高分辨率):

Example input image

我正在寻找与这些(GIMP'ed!)边界框类似的东西。对我来说,很重要的一点是这些段落必须被承认。但是,如果两个大块(左侧页面的顶部框,右侧页面的中心框)将分别获得两个边界框,则可以:

![Example of a possible desired result

获取这些边界框坐标的方法可以通过某种API(脚本语言优先于编译语言)或通过命令行命令进行,我不在乎。重要的是我自己获取坐标,而不仅仅是获得可见图像的修改版本。原因是我需要计算每个区域的面积大小,然后在最大区域的中央切出一块。

到目前为止,我已经尝试过但没有成功:

  • ImageMagick-并不是要完成这样的任务
  • OpenCV-学习曲线太高或我的google-foo太糟糕了
  • Tesseract-根据我的经验,它是一次性的OCR软件,由于历史原因,它在尝试字符形状识别之前不进行页面布局分析
  • OCRopus / OCRopy-应该能够做到,但是我没有找到如何告诉我我对与单词或字符相对的段落感兴趣的
  • Kraken ibn OCRopus-OCRopus的叉子有一些粗糙的边缘,仍在与之搏斗
  • 使用统计数据,具体地说,是在对图像进行二值化后使用一种聚类算法(OPTICS似乎是最适合此任务的一种算法)-我的数学和编码技能都不足以满足其需求

我已经看到文档扫描互联网上的图像被分割成包含文本,照片和其他元素的部分,因此这个问题似乎已经在学术上得到了解决。不过,如何获得好东西?

1 个答案:

答案 0 :(得分:1)

在Imagemagick中,您可以对图像进行阈值处理以免产生过多的噪点,然后对其进行模糊处理,然后再次进行阈值处理以使较大的黑色区域相连。然后使用-connected-components过滤掉小区域,尤其是白色区域,然后找到黑色区域的边界框。 (Unix bash语法)

convert image.png -threshold 95% \
-shave 5x5 -bordercolor white -border 5 \
-blur 0x2.5 -threshold 99% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:area-threshold=20 \
-define connected-components:mean-color=true \
-connected-components 4 \
+write tmp.png null: | grep "gray(0)" | tail -n +2 | sed 's/^[ ]*//' | cut -d\  -f2`


这是创建的tmp.png图像。请注意,我丢弃了面积小于20像素的区域。根据需要进行调整。还要根据需要调整模糊。您可以使其更大以得到更大的连接区域,也可以使其更小以接近文本的各个行。我将周围的像素全部刮掉了5个像素,以消除图像顶部的斑点噪声,然后用5个像素的白色边框填充。

enter image description here

这是边界框的列表。

这里是清单:

267x223+477+123
267x216+136+43
48x522+413+0
266x86+136+317
266x43+136+410
266x66+477+404
123x62+479+346
137x43+142+259
117x43+486+65
53x20+478+46
31x20+606+347
29x19+608+48
26x18+716+347
26x17+256+480
25x17+597+481
27x18+716+47
21x17+381+240
7x7+160+409

我们可以进一步在区域周围绘制一个抽奖箱:

boxes=""
bboxArr=(`convert image.png -threshold 95% \
-shave 5x5 -bordercolor white -border 5 \
-blur 0x2.5 -threshold 99% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:area-threshold=20 \
-define connected-components:mean-color=true \
-connected-components 4 \
+write tmp.png null: | grep "gray(0)" | sed 's/^[ ]*//' | cut -d\  -f2`)
num="${#bboxArr[*]}"
for ((i=0; i<num; i++)); do
WxH=`echo "${bboxArr[$i]}" | cut -d+ -f1`
xo=`echo "${bboxArr[$i]}" | cut -d+ -f2`
yo=`echo "${bboxArr[$i]}" | cut -d+ -f3`
ww=`echo "$WxH" | cut -dx -f1`
hh=`echo "$WxH" | cut -dx -f2`
x1=$xo
y1=$yo
x2=$((xo+ww-1))
y2=$((yo+hh-1))
boxes="$boxes rectangle $x1,$y1 $x2,$y2"
done
convert image.png -fill none -strokewidth 2 -stroke red -draw "$boxes" -alpha off image_boxes.png


enter image description here

将阈值区域从20再增加一点,您可以摆脱左下角圆点周围的小方框,我认为这是噪音。