2

我正在研究一种自动“错误计数”算法,我想知道如果我减去,我如何才能识别出非常低的对比度(垫上没有额外的错误 - 假设相机处于相同的位置并且光照条件非常相似)两张相互的照片,我不会得到干净的黑色图像,因为光线条件会略有不同。现在我应用一个高斯滤波器和 mahotas.thresholding.otsu() 来画出有错误的地方(在顶部放一个白色斑点),然后我使用 ndimage.label() 来计算它们。

但是,如果我的输入图像“cropbugs.jpg”非常深灰色,我会在应用 otsu() 后得到一些随机输出,并且我的 label() 函数会返回一个随机错误计数。我如何识别我的图像是非常深灰色还是对比度低并且只是将错误计数设置为 0?谢谢

到目前为止,我的代码如下所示:

bug_img = mahotas.imread('cropbugs.jpg')
pylab.gray()

bug_img = ndimage.gaussian_filter(bug_img, 6)#8
T = mahotas.thresholding.otsu(bug_img)
pylab.imshow(bug_img > T)
labeled,nr_objects = ndimage.label(bug_img > T)
print "Bug Count: "+str(nr_objects)
pylab.imshow(labeled)
pylab.jet()
pylab.show()
4

1 回答 1

1

我可以看到解决这个问题的多种方法

  1. (这是评论中的建议)。根据平均值、标准差、最大值或某种组合定义某种类型的固定规则。你最终会得到一个类似以下之一的测试:

    bug_img.mean() + 2*bug_img.std() < THRESHOLD
    bug_img.std() < THRESHOLD
    bug_img.max() < THRESHOLD
    sorted(bug_img.ravel())[-10] < THRESHOLD
    
  2. 使用基于纹理特征的分类系统(参见我之前对相关问题的回答)。

  3. 继续使用label,就好像一切都很好,然后对结果进行后过滤。例如:

    labeled,nr_objects = mahotas.label(bug_img > T)
    sizes = mahotas.labeled.labeled_size(labeled)
    good_objects = (MIN_BUG_SIZE <= sizes) & (sizes <= MAX_BUG_SIZE)
    print np.sum(good_objects)
    
于 2013-02-02T13:40:36.133 回答