我正在尝试识别扫描的 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 像素,然后结构元素的大小(用于计算中位数)应该相当一致。
关于python - 如何识别扫描的 PDF 文件中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121567/