我想在扫描的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
上述命令的解释…
在上面的命令中,我没有使用阈值处理,而是进行了颜色减少到两种颜色,然后转换为灰度并进行归一化——基本上这应该会选择黑色和背景色作为两种颜色,当转换为灰度并归一化后,它们将变成黑色和白色。
然后我使用了一个200像素高的结构元素进行中值滤波,它比几行还要高——所以它应该能识别出高大的特征——垂直线条。
解释完毕
继续…
所以,如果我将图像反转,使黑色变成白色,白色变成黑色,然后计算平均值并乘以图像中的总像素数,这将告诉我有多少像素属于垂直特征:
convert page-28.png -alpha off +dither -colors 2 -colorspace gray -normalize -statistic median 1x200 -negate -format "%[fx:mean*w*h]" info:90224convert 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像素的高度,这样计算中值的结构元素的大小就会相当一致。