使用PIL检测空白页的扫描

所以我经常在一个非智能的佳能多功能上运行巨大的双面扫描工作,这给我留下了一个巨大的JPEG文件夹。我是否疯狂考虑使用PIL分析图像文件夹以检测空白页的扫描并标记它们以进行删除? 离开文件夹爬行和标记部分,我想这看起来像: 检查图像是否为灰度,因为这被认为是不确定的。 如果是这样,请检测阴影的主要范围(背景颜色)。 如果没有,检测主要的阴影范围,限制为浅灰色。 确定整个图像的百分比由所述阴影组成。 尝试找到能够充分检测带有类型或书写或图像的页面的阈值。 也许一次测试图像碎片以提高阈值的准确性。 我知道这是一种边缘情况,但任何有PIL经验的人都可以提供一些指示吗?     
已邀请:
这是一种替代解决方案,使用mahotas和牛奶。 首先创建两个目录:
positives/
negatives/
,您将手动选择一些示例。 我将假设其余数据位于
unlabeled/
目录中 计算所有图像的正面和负面的功能 学习分类器 在未标记的图像上使用该分类器 在下面的代码中,我使用了jug来为您提供在多个处理器上运行它的可能性,但是如果删除每一行提及the3ѭ代码也可以使用
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
,但这会变得更复杂)。一般来说,我发现很难用你想要的那种硬阈值进行分类,除非扫描是非常有控制的。     
就像第一次尝试一样,按文件大小对图像文件夹进行排序。如果来自一个文档的所有扫描具有相同的分辨率,则空白页肯定会导致比非空白页更小的文件。 我不知道你扫描了多少页,但如果数量足够低,这可能是一个简单的快速修复。     
一些非PIL特定的建议需要考虑: 扫描或书面材料的扫描将具有许多高对比度的锐利边缘;类似于中值滤波器(以减少噪声),然后进行某种简单的边缘检测,可以很好地区分真实内容和空白页面。 一次测试片段非常有用,不仅因为它可能会提高您的准确性,还因为它可能会帮助您在很多页面上尽早放弃。大概你的大多数扫描都不是空白的,所以你应该从一个简单的检查开始,通常将非空白页面识别为非空白;只有当它说明页面可能是空白时你才需要仔细观察。 如果照明或页面本身是不均匀的,你可能想要开始做类似
image = image-filter(image)
的事情,其中​​
filter
做了某种非常宽泛的平滑。这将减少识别主导色调的需要,以及当页面上主要阴影不太均匀时的应对。     

要回复问题请先登录注册