Skip to main content
 首页 » 编程设计

python之识别非常低级别的图片并在 Python 中将其着色为纯黑色

2025年05月04日14jpfss

我正在研究一种自动化的“错误计数”算法,我想知道如何识别非常低的对比度(垫上没有其他错误 - 假设相机处于相同位置且光线条件非常相似)如果我将两张照片相互减去,我将不会得到干净的黑色图像,因为光线条件会略有不同。现在,我应用高斯滤波器和 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() 

请您参考如下方法:

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

  1. (这是评论中的建议)。 定义一些基于平均值、标准差、最大值或某种组合类型的固定规则。您最终将进行如下测试之一:

    bug_img.mean() + 2*bug_img.std() < THRESHOLD 
    bug_img.std() < THRESHOLD 
    bug_img.max() < THRESHOLD 
    sorted(bug_img.ravel())[-10] < THRESHOLD 
    
  2. 使用基于纹理特征的分类系统(参见前面的 my answer to a related question)。

  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)