如何识别扫描PDF文件中的图像?

我想在扫描的PDF文件中识别图像(相对于文本),理想情况下使用Python来实现。有没有办法做到这一点?举个简单的例子,假设你扫描了一本书的一章。每页有三种可能的情况:

  1. 仅包含文本
  2. 仅包含图像(或多个图像)
  3. 同时包含文本和图像

我想输出属于第2类或第3类的页面列表。


回答:

我的想法是寻找不出现在普通文本中的特征——这些特征可能是跨越多行的垂直黑色元素。我选择的工具是ImageMagick,它安装在大多数Linux发行版上,并且适用于macOS和Windows。我会在终端的命令提示符下运行它。

所以,我会使用这个命令——请注意,我将原始页面放在处理后的页面的左侧,并为说明目的在其周围添加了一个红色边框:

magick page-28.png -alpha off +dither -colors 2 -colorspace gray -normalize -statistic median 1x200 result.png

结果如下:

page-25.png

enter image description here

page-26.png

enter image description here

page-27.png

enter image description here

page-28.png

enter image description here

上述命令的解释…

在上面的命令中,我没有使用阈值处理,而是进行了颜色减少到两种颜色,然后转换为灰度并进行归一化——基本上这应该会选择黑色和背景色作为两种颜色,当转换为灰度并归一化后,它们将变成黑色和白色。

然后我使用了一个200像素高的结构元素进行中值滤波,它比几行还要高——所以它应该能识别出高大的特征——垂直线条。

解释完毕

继续…

所以,如果我将图像反转,使黑色变成白色,白色变成黑色,然后计算平均值并乘以图像中的总像素数,这将告诉我有多少像素属于垂直特征:

convert page-28.png -alpha off +dither -colors 2 -colorspace gray -normalize -statistic median 1x200 -negate -format "%[fx:mean*w*h]" info:90224convert page-27.png -alpha off +dither -colors 2 -colorspace gray -normalize -statistic median 1x200 -negate -format "%[fx:mean*w*h]" info:0

因此,第28页不是纯文本,而第27页是纯文本。


这里有一些提示…

提示

你可以像这样查看PDF中有多少页,尽管可能有更快的方法:

convert -density 18 book.pdf info:

提示

你可以像这样提取PDF的一页:

convert -density 288 book.pdf[25] page-25.png

提示

如果你处理多本书,你可能希望归一化图像,使它们都达到,例如,1000像素的高度,这样计算中值的结构元素的大小就会相当一致。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注