5

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

在此处输入图像描述

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

4

2 回答 2

4

在 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 显示模糊和阈值区域:

在此处输入图像描述

裁剪图像:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2018-02-01T08:35:24.457 回答
1

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

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

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

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

在此处输入图像描述

于 2018-02-01T18:03:34.150 回答