Chr*_*ell 5 python imaging computer-vision python-imaging-library image-scanner
所以我经常在一个非智能的佳能多功能上运行巨大的双面扫描工作,这给我留下了一个巨大的JPEG文件夹.我是否疯狂考虑使用PIL分析图像文件夹以检测空白页的扫描并标记它们以进行删除?
离开文件夹爬行和标记部分,我想这看起来像:
我知道这是一个边缘情况,但任何有PIL经验的人都可以提供一些指示吗?
lui*_*dro 12
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]
Run Code Online (Sandbox Code Playgroud)
这使用纹理特征,这可能足够好,但mahotas.features如果您愿意(或尝试mahotas.surf,但这会变得更复杂),您可以使用其他功能.一般来说,我发现很难用你想要的那种硬阈值进行分类,除非扫描是非常有控制的.
就像第一次尝试一样,按文件大小对图像文件夹进行排序。如果来自一个文档的所有扫描具有相同的分辨率,则空白页肯定会导致比非空白页更小的文件。
我不知道您正在扫描多少页,但如果数量足够少,这可能是一个简单的快速修复。
需要考虑的一些非 PIL 特定建议:
印刷或书面材料的扫描件将具有大量高对比度的锐边;像中值滤波器(以减少噪音)之类的东西,然后进行某种简单的边缘检测,可能会很好地区分真实内容和空白页面。
一次测试片段很有用,不仅因为它可能会提高您的准确性,而且因为它可能会帮助您尽早放弃许多页面。想必您的大部分扫描件都不是空白的,因此您应该从简单的检查开始,通常会将非空白页识别为非空白页;只有当它说该页面可能是空白时,您才需要更仔细地查看。
如果照明或页面本身不均匀,您可能需要首先执行某种非常广泛的平滑操作image = image-filter(image)。filter这将减少识别主要色调的需要,以及当主要色调在整个页面上不太均匀时的应对方法。