6

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

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

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

我知道这是一种边缘情况,但是任何有 PIL 经验的人都可以提供一些建议吗?

4

3 回答 3

13

这是另一种解决方案,使用mahotas牛奶

  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,但这会变得更复杂)。一般来说,我发现很难用你正在寻找的那种硬阈值进行分类,除非扫描得到很好的控制。

于 2011-03-31T20:14:22.183 回答
5

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

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

于 2011-03-25T09:30:23.520 回答
3

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

印刷或书面材料的扫描件会有很多高对比度的锐边;诸如中值滤波器(以减少噪声)之类的东西,然后是某种简单的边缘检测,可能会很好地从空白页中区分真实内容。

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

如果照明或页面本身不均匀,您可能希望首先执行类似image = image-filter(image)where filterdoes a very broad smoothing 之类的操作。这将减少识别主要阴影的需要,以及在主要阴影在整个页面上不太均匀时应对。

于 2011-03-24T23:14:35.367 回答