python - 使用 PIL 检测空白页扫描

标签 python computer-vision python-imaging-library imaging image-scanner

所以我经常在一台不智能的佳能多功能机上运行大量的双面扫描作业,这给我留下了一个巨大的 JPEG 文件夹。考虑使用 PIL 分析图像文件夹以检测空白页扫描并将它们标记为删除,我是不是疯了?

将文件夹抓取和标记部分排除在外,我想这看起来像这样:

  • 检查图像是否为灰度,因为这被假定为不确定。
  • 如果是,检测主要的色调范围(背景色)。
  • 如果不是,检测主要色调范围,限制为浅灰色。
  • 确定整个图像中由所述阴影组成的百分比。
  • 尝试找到一个阈值来充分检测带有字体、文字或图像的页面。
  • 也许一次测试图像的片段以提高阈值的准确性。

我知道这是一种边缘情况,但有 PIL 经验的人可以提供一些指导吗?

最佳答案

这是一个替代解决方案,使用 mahotasmilk .

  1. 首先创建两个目录:positives/negatives/,您将在其中手动挑选一些示例。
  2. 我假设其余数据位于 unlabeled/ 目录中
  3. 计算正片和负片中所有图像的特征
  4. 学习分类器
  5. 在未标记的图像上使用该分类器

在下面的代码中我使用了 jug让您可以在多个处理器上运行它,但是如果您删除提到 TaskGenerator

的每一行,代码也可以工作
from glob import glob
import mahotas
import mahotas.features
import milk
from jug import TaskGenerator


@TaskGenerator
def features_for(imname):
    img = mahotas.imread(imname)
    return mahotas.features.haralick(img).mean(0)

@TaskGenerator
def learn_model(features, labels):
    learner = milk.defaultclassifier()
    return learner.train(features, labels)

@TaskGenerator
def classify(model, features):
     return model.apply(features)

positives = glob('positives/*.jpg')
negatives = glob('negatives/*.jpg')
unlabeled = glob('unlabeled/*.jpg')


features = map(features_for, negatives + positives)
labels = [0] * len(negatives) + [1] * len(positives)

model = learn_model(features, labels)

labeled = [classify(model, features_for(u)) for u in unlabeled]

这使用纹理特征,这可能已经足够好了,但如果您愿意,您可以使用 mahotas.features 中的其他特征(或尝试 mahotas.surf ,但这变得更加复杂)。一般来说,我发现很难用您正在寻找的那种硬阈值进行分类,除非扫描非常受控。

关于python - 使用 PIL 检测空白页扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5426482/

相关文章:

python - 鱼眼校准 OpenCV Python

python - 检索支持的读取文件扩展名/格式列表

django - 使用枕头处理我的 jpg 图像时出现 OSError

python - 为什么单个python进程的cpu占用率可以超过100%?

python - 从文件中提取成绩?

python - 如何将基于 pytorch cpu 的转换转换为基于 cuda 的转换?

django - 如何解决 OSError : decoder jpeg not available on centos 7

python - 如何使用Python从AWS机器访问Github中的Excel数据

python - 在dynamic_rnn和LSTMCell中使用带有输入字符串的TensorFlow时出错

python - 非矩形四边形上并集的交集