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

时间:2017-02-08 19:05:32

标签: python image-processing machine-learning computer-vision ocr

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

  1. 仅包含文字
  2. 仅包含图像(或多个)
  3. 包含文字和图片
  4. 我想输出属于第2类或第3类的网页列表。

1 个答案:

答案 0 :(得分:2)

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

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

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

我明白了:

页-25.png

enter image description here

页-26.png

enter image description here

页-27.png

enter image description here

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