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

3
我正在尝试识别扫描PDF文件中的图像(而不是文本),最好使用Python。有没有办法做到这一点?以一个简单的例子为例,假设您已经扫描了一本书的章节。页面有三种可能的选项:
1. 仅包含文本 2. 仅包含图像(或多个) 3. 同时包含文本和图像
我想输出一个列表,列出属于第2或第3类的页面。

1
这在很大程度上取决于您的图像和文本。 您需要查看数据集。 可能图像有很多颜色。 文本可以有颜色,但通常不多。 这也可能是您可以绘制的最大白色边框,该边框比字符大。 在这种情况下,“白色”需要“足够白色以允许传感器噪声”...但仍然如此。 这将识别正方形图片。 也许不太适用于图表。 - zBeeble
能否提供一些例子,这样我们就可以达成共识了吗? - Mark Setchell
对于情况2,PDF文件中是否有任何文本?比如页码或标题之类的东西吗?只有在两种情况之间有清晰的分界线时,您才可以应用机器学习。为了给您一个抽象的想法,需要将PDF转换成图像,然后将图像转换成灰度值,并将其转换成向量形式,其中每个像素都表示为数组。如果没有任何文本,则与文本和图像相比,向量将具有不同的模式。神经网络会捕捉到这种模式,从而进行学习。 - Arjun
@MarkSetchell https://archive.org/details/adventureshuckle00twaiiala 这里有可下载的PDF文件。 - iOSBeginner
抱歉马克,你的答案看起来很有效! - iOSBeginner
1个回答

5
我的想法是寻找在正常文本中不会出现的特征 - 可能是跨越多行的垂直黑色元素。我选择的工具是 ImageMagick,它已安装在大多数Linux发行版上,并可用于macOS和Windows。我只需在命令提示符下在终端中运行它。
因此,我将使用此命令 - 请注意,我在处理后的页面右侧添加了原始页面,并加了一个红色边框以进行说明:
magick page-28.png -alpha off +dither -colors 2 -colorspace gray -normalize -statistic median 1x200 result.png

And I get this:

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像素,然后计算中值时结构元素的大小应该是相当一致的。


你的方法似乎需要大约2-3秒钟的时间。有更快的方法吗? - Dhruva
@Dhruva 谁知道呢?这取决于很多因素!你的CPU、RAM、操作系统、PDF文件的大小、PDF文件的数量、PDF文件中图像的分辨率,以及你实际想要确定的内容...如果你有具体问题,请随时提出新问题(免费),并可能包含一个链接以供参考 - 通过点击“分享”获取链接。 - Mark Setchell
@ Mark Setchell 为什么不直接计算黑色像素?numpy库通常在执行此类任务时速度很快。 - Dhruva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接