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

标签 python image-processing machine-learning computer-vision ocr

我正在尝试识别扫描的 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

上面命令的解释...

在上面的命令中,我没有设置阈值,而是将颜色减少为 2 种颜色,然后转换为灰度,然后归一化 - 基本上应该选择黑色和背景色作为两种颜色,它们将变成黑色和转换为灰度并归一化时为白色。

然后我用一个 200 像素高的结构元素做一个中值过滤器,它比几条线高 - 所以它应该识别高的特征 - 垂直线。

解释结束

继续...

因此,如果我反转图像,使黑色变成白色,白色变成黑色,然后取平均值并将其乘以图像中的像素总数,这将告诉我有多少像素是垂直特征的一部分:

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

convert 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 像素,然后结构元素的大小(用于计算中位数)应该相当一致。

关于python - 如何识别扫描的 PDF 文件中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121567/

相关文章:

python - 通过 python3 中连接的集群的多数投票进行标记

带有 --enable-shared : will not build any extensions 的 Python 3.1.1

python - 使用 Python 读取 fortigate 配置文件

opencv - 分割 - 分离接触对象

algorithm - 使用大半径/标准差对图像进行高斯模糊时的奇怪行为

r - 在硬盘上存储的非常大的数据集上训练 SVM

python:如何通过ssh远程运行脚本

python - 遍历 Web 元素

c++ - OpenCV 中的叠加图像

tensorflow - 如何使用TensorBoard分析结果并降低均方误差