Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何识别扫描的PDF文件中的图像?_Python_Image Processing_Machine Learning_Computer Vision_Ocr - Fatal编程技术网

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

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。我会在终端的命令提示符下运行它 因此,我将使用此命令-注意,我将原始页面

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

  • 仅包含文本
  • 仅包含一个图像(或多个)
  • 包含文本和图像

  • 我想输出属于第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
    库通常能够快速完成此类任务。