【问题标题】:Using PIL to detect a scan of a blank page使用 PIL 检测空白页的扫描
【发布时间】:2011-07-22 12:57:46
【问题描述】:

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

撇开文件夹抓取和标记部分,我想这看起来像:

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

我知道这是一种极端情况,但任何有 PIL 经验的人都可以指点一下吗?

【问题讨论】:

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


    【解决方案1】:

    这是一个替代解决方案,使用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,但这会变得更复杂)。一般来说,我发现很难使用您正在寻找的那种硬阈值进行分类,除非扫描受到非常严格的控制。

    【讨论】:

    • 你写的库令人印象深刻!
    • 为 nit-pick 道歉,但是变量 features 被使用了两次,一次作为函数,接下来作为列表。然后作为函数调用。特征列表不应该类似于 features_learned 并应用于学习器模型而不取消原始函数的链接吗?那是我能够应用sn-p的唯一方法。感谢周围的真棒图书馆。他们工作得很好!谢谢。
    • features.haralick 应该是什么意思?格莱美?从 GLCM 中提取的建议统计数据?但是,取最后一个的平均值是没有意义的。同时,将后者用作分类的特征集更有意义。因此,您使用的是前者并使用每个图像的单个特征进行分类。您为什么不使用 Haralick 提出的这 14 种测量方法(或其中的一部分)?
    • features.haralick 是 Haralick 的 14 个测量值(实际上,默认情况下,最后一个特征被排除在外)!每次测量都在 4 个方向上进行。 Haralick 然后建议对它们进行平均和ptp()ing,以获得 28 个特征。在这里,我只是做了平均。
    • 牛奶已过期且无人维护:还有其他解决方案吗?
    【解决方案2】:

    作为第一次尝试,按文件大小对图像文件夹进行排序。如果一个文档的所有扫描都具有相同的分辨率,那么空白页面肯定会导致文件比非空白页面更小。

    我不知道您正在扫描多少页,但如果数量足够少,这可能是一个简单的快速修复。

    【讨论】:

      【解决方案3】:

      需要考虑的一些非 PIL 特定建议:

      印刷或书面材料的扫描件会有很多高对比度的锐边;像中值滤波器(以减少噪音)和某种简单的边缘检测之类的东西可能会很好地将真实内容与空白页区分开来。

      一次测试片段很有用,不仅因为它可以提高您的准确性,还因为它可以帮助您尽早放弃许多页面。大概您的大多数扫描不是空白的,因此您应该从通常将非空白页面识别为非空白的简单检查开始;只有当它说页面可能是空白时,您才需要更仔细地查看。

      如果照明或页面本身不均匀,您可能希望首先执行image = image-filter(image) 之类的操作,其中filter 会进行某种非常广泛的平滑处理。这将减少识别主要阴影的需要,以及在主要阴影在整个页面上不太均匀时应对的需要。

      【讨论】:

      • +1 好建议。我认为即使是简单的图像熵计算也可能足以区分页面的“空虚”。 brainacle.com/…
      • 好点,保罗。我每天都在处理直方图,但从未考虑过计算熵。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多