2024-04-29 14:49:49 发布
网友
所以我经常在一个不聪明的佳能多功能上运行大量的双面扫描作业,这给我留下了一个巨大的jpeg文件夹。考虑使用PIL来分析一个文件夹中的图像来检测空白页面的扫描并标记它们删除,我是不是疯了?在
离开文件夹爬行和标记部件,我想这看起来像:
我知道这是一个边缘案例,但是有PIL经验的人能提供一些建议吗?在
需要考虑的一些非PIL具体建议:
打印或书写材料的扫描会有很多高对比度的锐利边缘;像中值滤波器(减少噪音)再加上某种简单的边缘检测,可能会很好地区分真实内容和空白页面。在
一次测试片段是有用的,不仅因为它可以提高你的准确性,还因为它可以帮助你在很多页面上尽早放弃。大概你的大部分扫描都是空白的,所以你应该从一个简单的检查开始,通常将非空白页面识别为非空白页面;只有当它显示页面可能是空白时,你才需要更仔细地查看。在
如果照明或页面本身是不均匀的,您可能需要从image = image-filter(image)开始,其中filter执行某种非常广泛的平滑处理。这将减少识别主色调的需要,以及当主色调在页面上不太一致时的处理。在
image = image-filter(image)
filter
作为第一次尝试,按文件大小对图像文件夹进行排序。如果来自一个文档的所有扫描都具有相同的分辨率,则空白页肯定会导致比非空白页小的文件。在
我不知道你扫描了多少页,但如果数量足够少,这可能是一个简单的快速修复。在
这是一个替代解决方案,使用mahotas和{a2}。在
positives/
negatives/
unlabeled/
在下面的代码中,我使用了jug让您有可能在多个处理器上运行它,但是如果您删除每一行提到TaskGenerator的代码也可以工作
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,但这会变得更复杂)。一般来说,我发现很难用你想要的那种硬阈值进行分类,除非扫描控制得很好。在
mahotas.features
mahotas.surf
需要考虑的一些非PIL具体建议:
打印或书写材料的扫描会有很多高对比度的锐利边缘;像中值滤波器(减少噪音)再加上某种简单的边缘检测,可能会很好地区分真实内容和空白页面。在
一次测试片段是有用的,不仅因为它可以提高你的准确性,还因为它可以帮助你在很多页面上尽早放弃。大概你的大部分扫描都是空白的,所以你应该从一个简单的检查开始,通常将非空白页面识别为非空白页面;只有当它显示页面可能是空白时,你才需要更仔细地查看。在
如果照明或页面本身是不均匀的,您可能需要从
image = image-filter(image)
开始,其中filter
执行某种非常广泛的平滑处理。这将减少识别主色调的需要,以及当主色调在页面上不太一致时的处理。在作为第一次尝试,按文件大小对图像文件夹进行排序。如果来自一个文档的所有扫描都具有相同的分辨率,则空白页肯定会导致比非空白页小的文件。在
我不知道你扫描了多少页,但如果数量足够少,这可能是一个简单的快速修复。在
这是一个替代解决方案,使用mahotas和{a2}。在
positives/
和negatives/
,您将在其中手动选择几个示例。在unlabeled/
目录中在下面的代码中,我使用了jug让您有可能在多个处理器上运行它,但是如果您删除每一行提到
TaskGenerator
的代码也可以工作这使用了纹理特性,这可能已经足够好了,但是如果您愿意,您可以使用
mahotas.features
中的其他特性(或者尝试mahotas.surf
,但这会变得更复杂)。一般来说,我发现很难用你想要的那种硬阈值进行分类,除非扫描控制得很好。在相关问题 更多 >
编程相关推荐