我正在研究一种自动化的“错误计数”算法,我想知道如何识别非常低的对比度(垫上没有其他错误 - 假设相机处于相同位置且光线条件非常相似)如果我将两张照片相互减去,我将不会得到干净的黑色图像,因为光线条件会略有不同。现在,我应用高斯滤波器和 mahotas.thresholding.otsu() 来绘制存在错误的位置(在顶部放置一个白色 Blob ),然后我使用 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()
最佳答案
我可以看到解决这个问题的多种方法
(这是评论中的建议)。 定义一些基于平均值、标准差、最大值或某种组合类型的固定规则。您最终将进行如下测试之一:
bug_img.mean() + 2*bug_img.std() < THRESHOLD bug_img.std() < THRESHOLD bug_img.max() < THRESHOLD sorted(bug_img.ravel())[-10] < THRESHOLD
使用基于纹理特征的分类系统(参见前面的 my answer to a related question)。
继续使用
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)
关于python - 识别非常低级别的图片并在 Python 中将其着色为纯黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637642/