所以我经常在一台不智能的佳能多功能机上运行大量的双面扫描作业,这给我留下了一个巨大的 JPEG 文件夹。考虑使用 PIL 分析图像文件夹以检测空白页扫描并将它们标记为删除,我是不是疯了?
将文件夹抓取和标记部分排除在外,我想这看起来像这样:
- 检查图像是否为灰度,因为这被假定为不确定。
- 如果是,检测主要的色调范围(背景色)。
- 如果不是,检测主要色调范围,限制为浅灰色。
- 确定整个图像中由所述阴影组成的百分比。
- 尝试找到一个阈值来充分检测带有字体、文字或图像的页面。
- 也许一次测试图像的片段以提高阈值的准确性。
我知道这是一种边缘情况,但有 PIL 经验的人可以提供一些指导吗?
最佳答案
- 首先创建两个目录:
positives/
和negatives/
,您将在其中手动挑选一些示例。 - 我假设其余数据位于
unlabeled/
目录中 - 计算正片和负片中所有图像的特征
- 学习分类器
- 在未标记的图像上使用该分类器
在下面的代码中我使用了 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/