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

Posted

技术标签:

【中文标题】如何识别扫描的 PDF 文件中的图像?【英文标题】:How to recognize images within scanned PDF files? 【发布时间】:2017-06-26 13:40:00 【问题描述】:

我正在尝试识别扫描的 PDF 文件中的图像(而不是文本),最好使用 python。有没有办法做到这一点?举个简单的例子,假设您浏览了一本书的一章。页面有三种可能的选项:

    仅包含文字 仅包含一张(或多张)图片 包含文字和图片

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

【问题讨论】:

这在很大程度上取决于您的图像和文本。您需要查看您的数据集。可能是图像有很多颜色。文本可以有颜色,但通常不多。它也可能是你可以在比字符大的东西周围画出的最大的白色边框。在这种情况下,“白色”需要“足够白,以允许传感器噪声”......但仍然如此。这将识别方形图片。也许没有那么多图表。 提供一些例子如何让我们都在同一个页面上? 对于案例 2,pdf 是否有任何文本?像页码或标题之类的?只有当这两种情况之间有明确的界限时,您才能应用机器学习。为了给您一个抽象的想法,需要将pdf转换为图像。然后将图像转换为灰度,然后转换为矢量形式,其中每个像素都表示为一个数组。如果根本没有文本,则与带有文本和图像的向量相比,向量将具有不同的模式。这种模式被神经网络拾取并因此学习。 @MarkSetchell archive.org/details/adventureshuckle00twaiiala 有一个可下载的 pdf 文件 对不起那个马克 - 你的回答似乎很好! 【参考方案1】:

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

所以,我会使用这个命令 - 请注意,我将原始页面添加到右侧已处理页面的左侧,并在其周围放置了一个红色边框,仅用于说明:

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

我明白了:

page-25.png

page-26.png

page-27.png

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

【讨论】:

您的方法似乎需要大约 2-3 秒。有更快的方法吗?我 @Dhruva 谁知道?这取决于很多事情!您的 CPU、RAM、操作系统、PDF 的大小、PDF 的数量、PDF 中图像的分辨率、您实际想要确定的内容……如果您有具体问题,请随时咨询新的(它是免费的),并且可能包含一个返回到这个的链接以供参考 - 点击 share 获取链接。 @Mark Setchell 为什么不计算黑色像素? numpy 库通常可以快速完成此类任务。

以上是关于如何识别扫描的 PDF 文件中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

发现PDF Transformer+转换的图像字体小了如何处理

对pdf中的图片进行自动识别

使用 USB 中的扫描仪将图像扫描并存储为 PDF [关闭]

制成双层pdf格式进行OCR识别时缺少两项不能OCR识别怎么办

怎么知道PDF是扫描版

如何知道 PDF 是不是仅包含图像或已被 OCR 扫描以进行搜索?