【问题标题】:How to find paragraph bounding box coordinates in a scanned document?如何在扫描的文档中找到段落边界框坐标?
【发布时间】:2018-10-08 15:09:36
【问题描述】:

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

我正在寻找类似于这些(GIMP'ed-up!)边界框的东西。对我来说,重要的是要承认这些段落。不过,如果两个大块(左页的顶部框,右页的中心块)各有两个边界框,那就没问题了:

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

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

  • ImageMagick - 它不适合这样的任务
  • OpenCV - 学习曲线太高或者我的 google-foo 太差了
  • Tesseract - 据我所知,它是一次性 OCR 软件,由于历史原因,它在尝试字符形状识别之前不进行页面布局分析
  • OCRopus/OCRopy - 应该能够做到,但我不知道如何告诉它我对段落感兴趣,而不是单词或字符
  • Kraken ibn OCRopus - OCRopus 的一个分支,边缘有些粗糙,仍在与之抗争
  • 在图像二值化后使用统计数据,特别是聚类算法(OPTICS 似乎是最适合此任务的算法) - 我的数学和编码能力都不够

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

【问题讨论】:

  • 我不明白这个问题。如果您指定convert image -crop WxH+X+Y +repage result。然后你应该得到你指定的区域。任何外部边界都不重要。你是在裁剪一个非常大的区域。我认为你的问题是关于裁剪一个小区域以获得一些特定的词。请澄清。
  • 问题不在于如何裁剪,而在于如何决定裁剪什么。我有数百个,每个都不一样。许多文本朝向图像的中心,但到目前为止还不是全部。那么如何找出适合种植的区域呢?
  • @fmw42,我的问题你还不清楚吗?我很想修改它,使它更容易理解,但我不确定它可能不清楚......
  • 我没有很好的解决方案来避免任何大的边框效果,例如您显示的内容。如果您知道所需区域的大小,则可以创建一个比白色低 5% 灰度的模板,然后使用 Imagemagick 比较在较大的图像中找到最佳匹配。但是如果你不知道你想要的区域的大小,那么我目前没有一个好的解决方案。我会考虑的。
  • 续:但我仍然不明白您是如何决定要提取哪段文本的。

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


【解决方案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 像素的白色边框填充。

这是边界框列表。

这里是列表:

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


将阈值区域从20 再增加一点,你可以去掉左下角围绕圆点的小框,我认为这是噪声。

【讨论】:

  • 哇,这令人印象深刻,仅使用 ImageMagick!小盒子根本没有问题,因为我正在计算盒子面积大小,然后选择最大的盒子。问题是左右页面之间的阴影也被检测到了。我会稍微调整一下阈值,看看是否可以让它消失。如果没有,我将不得不首先丢弃任何比宽度高得多的东西。如果可以的话,我想在接受答案之前等待一段时间,看看是否也出现了“理解”“影子”和“文本”之间的区别的东西。
  • 只需测试该框以丢弃非常高的细框,即几乎是页面的整个高度以及您认为合适的位于两页图像中间的任何宽度。
  • 一件小事:你为什么关注grep "gray(0)"tail -n +2?这是否意味着在某些时候摆脱“对象(id:bounding-box centroid area mean-color):”?
  • 另外,如果你有兴趣,这就是你的代码对全分辨率图像所做的,没有调整任何应用的值:i.imgur.com/wU9iBTw.png ...如果有人试图用 Tesseract 做 OCR,这可能是一个很好的准备。
  • 没有做很多实验。这就是我要使用的:i.imgur.com/I1oN4hR.png(剃须 100x100,边框 100,模糊 0x7.5)。计算完最大的横向正方形后,我会再次更新问题。
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 2017-09-30
  • 2020-04-26
  • 2010-10-07
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多