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

标签 python image-processing filter label gaussian

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

关于python - 识别非常低级别的图片并在 Python 中将其着色为纯黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637642/

相关文章:

python - 尝试将 R 对象文件加载到 python numpy 数组中时出现内存错误

python - 以最快的方式查找重复的图像

java - j图 : General Traversal & Forest Traversal

image - 在 MATLAB 中为 8 位灰度图像着色

arrays - react JS : Filter an array by a string

python - 将字典键值从 UNIX 时间转换为人类可读时间

python - 使用带有 0 的 Python 逻辑运算符的问题

python - Pandas:根据预定义类别的字符串列创建二进制列(虚拟/单热编码表)

javascript - 使用多个数组过滤嵌套的 JSON 对象并将过滤后的对象存储在数组中

R:如何过滤/子集日期序列