Python 如何识别扫描的PDF文件中的图像?
我试图在扫描的PDF文件中识别图像(而不是文本),最好使用python。有没有办法做到这一点?举个简单的例子,假设你扫描了一本书的一章。页面有三种可能的选项:Python 如何识别扫描的PDF文件中的图像?,python,image-processing,machine-learning,computer-vision,ocr,Python,Image Processing,Machine Learning,Computer Vision,Ocr,我试图在扫描的PDF文件中识别图像(而不是文本),最好使用python。有没有办法做到这一点?举个简单的例子,假设你扫描了一本书的一章。页面有三种可能的选项: 仅包含文本 仅包含一个图像(或多个) 包含文本和图像 我想输出属于第2类或第3类的页面列表。我的想法是寻找普通文本中没有的功能-可能是垂直的、跨越多行的黑色元素。我选择的工具是ImageMagick,它安装在大多数Linux发行版上,可用于macOS和Windows。我会在终端的命令提示符下运行它 因此,我将使用此命令-注意,我将原始页面
我想输出属于第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
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,pdf有任何文本吗?比如页码或标题之类的?只有在两种情况之间有明确的界限时,才能应用机器学习。为了给你一个抽象的想法,pdf需要转换成图像。然后将图像转换为灰度,然后转换为矢量形式,其中每个像素都表示为一个数组。如果根本没有文本,向量将与包含文本和图像的向量具有不同的模式。这个模式是由神经网络拾取的,因此它会学习。@MarkSetchell关于这个标记有一个可下载的PDF担忧-你的答案似乎很有效!你的方法似乎需要2-3秒。有没有更快的方法?I@Dhruva谁知道呢?这取决于很多事情!您的CPU、RAM、操作系统、PDF的大小、PDF的数量、PDF中图像的分辨率、您实际想要确定的内容。。。如果您有特定的问题,请随时询问新问题(免费),并可能包含一个指向此问题的链接以供参考-通过单击
共享@Mark Setchell获取链接您为什么不直接计算黑色像素<代码>numpy
库通常能够快速完成此类任务。