【问题标题】:Programmatically divide scanned images into separate images以编程方式将扫描的图像分成单独的图像
【发布时间】:2018-07-11 11:23:49
【问题描述】:

为了提高 OCR 质量,我需要对扫描的图像进行预处理。有时我需要对带有少量图片(页面上的组件并且它们处于不同角度 - 例如,一次扫描的几个纸质文档)的图像进行 OCR,例如:

是否可以以编程方式自动将此类图像划分为包含每个逻辑文档的单独图像?例如使用 ImageMagick 之类的工具或其他工具?有没有针对此类问题的解决方案/技术?

【问题讨论】:

  • 如果您有超过 50 张图像和许多不同的图像组合,您可以尝试使用 ML 驱动的解决方案。类似app.nanonets.com/ObjectCategorySelection
  • 我使用 OpenCV 进行图像处理。 To seperate the first image, erode, threshold, and findContours, rotate if necessary. 然后我得到these detectionsthese cropeds。但是图像中的文字太小,无法进行 OCR。您更新后的图像对于图像处理来说更糟糕。
  • 这只是一个示例,用于描述问题。原始图像的质量要好一些。
  • @Silencer 你能显示代码吗?

标签: image-processing imagemagick ocr image-preprocessing


【解决方案1】:

在 ImageMagick 6 中,您可以将图像模糊到足以使文本重叠和阈值,以便文本框每个都是白色背景上的一个大黑色区域。然后您可以使用连接组件来查找每个单独的黑色灰色(0)区域及其边界框。然后使用边界框值裁剪每个此类区域的原始图像。

输入:

Unix 语法(将模糊调整到足够大以使文本区域保持纯黑色):

infile="image.png"
inname=`convert -ping $infile -format "%t" info:`
OLDIFS=$IFS
IFS=$'\n'
arr=(`convert $infile -blur 0x5 -auto-level -threshold 99% -type bilevel +write tmp.png \
-define connected-components:verbose=true \
-connected-components 8 \
null: | tail -n +2 | sed 's/^[ ]*//'`)
num=${#arr[*]}
IFS=$OLDIFS
for ((i=0; i<num; i++)); do
#echo "${arr[$i]}"
color=`echo ${arr[$i]} | cut -d\  -f5`
bbox=`echo ${arr[$i]} | cut -d\  -f2`
echo "color=$color; bbox=$bbox"
if [ "$color" = "gray(0)" ]; then
convert $infile -crop $bbox +repage -fuzz 10% -trim +repage ${inname}_$i.png
fi
done


文字列表:

color=gray(255); bbox=892x1008+0+0
color=gray(0); bbox=337x430+36+13
color=gray(0); bbox=430x337+266+630
color=gray(0); bbox=202x147+506+252

tmp.png 显示模糊和阈值区域:

裁剪图像:

【讨论】:

  • 感谢您的回答!我在我的 Ubuntu 16 上安装了 ImageMagick 6.8.9-9 Q16 x86_64 2017-07-31。您的脚本可以正常工作,但“tmp.png”文件仅包含黑色背景,仅此而已。我做错了什么?
  • 这是输出:color=; bbox=892x1008+0+0 color=; bbox=316x409+46+23 color=; bbox=409x316+277+640 color=; bbox=183x126+516+263 color=; bbox=8x16+154+222 color=; bbox=16x8+471+748 color=; bbox=8x9+680+376 color=; bbox=8x7+178+221 color=; bbox=7x8+481+772 color=; bbox=3x5+93+321 color=; bbox=5x3+383+687 color=; bbox=5x2+580+383 color=; bbox=5x2+565+383
  • 我是否需要为 IM 安装任何其他库/脚本才能使您的脚本正常工作?
  • 我添加了另一个带有扫描伪影的图像。这种方法也适用于此类图像吗?
  • 只有在文本的每个部分不是太靠近以至于模糊会将它们合并到同一个对象中时才会起作用。您需要 ImageMagick 6.8.9.10 或更高版本才能使用连接的组件。也许你需要升级。您可能有一个未完全运行的初步版本。单独尝试此命令:convert image.png -blur 0x5 -auto-level -threshold 99% -type bilevel tmp.png。那看起来一样吗?你在窗户上吗?如果是这样,windows 需要 % 转义为 %%。此外,我的循环代码仅适用于 unix。那么你的平台是什么?
【解决方案2】:

alexanoid 写道: 我添加了另一个带有扫描伪影的图像。这种方法也适用于此类图像吗?

不,它不会很好地工作,原因有几个。您提供的第二张图片比第一张大得多。所以它需要更大的模糊。它是jpg,里面有文物。 JPG 不是一种好的格式,因为“恒定”区域中的图像并不是真正恒定的。模糊会拾取您的伪影,并且需要有不同的阈值才能删除其中的一些。在您的情况下,图像的顶部有一个大小合适的工件,会被作为对象捕获。最后,您的模糊和阈值文本区域的边界框即使不接触也会重叠。因此,一种裁剪可能包含来自其他区域的文本。

这是我对图像进行模糊和阈值化的测试命令:

convert image.jpg -blur 0x50 -auto-level -threshold 95% -type bilevel tmp.png

【讨论】:

  • 谢谢!我真的很感谢你的帮助!我应该使用什么格式来准备然后 OCR 图像?我应该使用例如 PNG 而不是 JPG 还是什么?
  • 一般不要使用JPG等有损压缩格式。 PNG和TIFF都很好。但主要问题是文件被扫描并从纸张或玻璃上拾取缺陷。考虑到图像的分辨率和所需的大模糊,文本区域也过于靠近。
猜你喜欢
  • 2012-01-24
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
相关资源
最近更新 更多