这是另一种解决方案,使用mahotas和牛奶。
- 首先创建两个目录:您将在
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
,但这会变得更复杂)。一般来说,我发现很难用你正在寻找的那种硬阈值进行分类,除非扫描得到很好的控制。