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

How to recognize images within scanned PDF files?

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

我明白了:

页-25.png

页-26.png

页-27.png

页-28.png

上面命令的解释...

在上面的命令中,我没有设置阈值,而是将颜色减少为 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 像素,然后结构元素的大小(用于计算中位数)应该相当一致。