gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:21:14 25 4
gpt4 key购买 nike

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

Example input image

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

![Example of a possible desired result

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

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

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

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

    最佳答案

    在 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

    这是边界框的列表。

    这是 list :
    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 增加阈值区域再多一点,你就可以去掉左下角一个圆点周围的小盒子,我认为这是噪音。

    关于opencv - 如何在扫描的文档中找到段落边界框坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52705219/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com