我正在尝试识别扫描的PDF文件中的图像(而不是文本),理想情况下使用python。有没有办法做到这一点?举个简单的例子,假设你已经扫描了一本书的一章。页面有三种可能的选项:
我想输出属于第2类或第3类的网页列表。
答案 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 强>
页-26.png 强>
页-27.png 强>
页-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像素高,然后结构元素的大小(用于计算中位数)应该相当一致。