numpy:根据多个条件将值设为零

3

我有一张RGB图像,想要使用以下简单的方法进行阈值处理:

from skimage import filter
def threshold(image):
    r = image[:, :, 0]
    g = image[:, :, 1]
    b = image[:, :, 2]

    rt = filter.threshold_otsu(r)
    gt = filter.threshold_otsu(g)
    bt = filter.threshold_otsu(b)

我现在想做的是制作一个二进制掩模,其中原始图像中RGB值小于这些阈值的部分应设置为0。

mask = np.ones(r.shape)

我无法弄清如何设置掩码索引(x,y)为零的方法,其中
image[x, y, 0] < rt and image[x, y, 1] < gt and image [x, y, 2] < bt

我需要从原始图像中获取符合此条件的(x,y)像素索引,但我不确定如何做到这一点。


дҪ е°қиҜ•иҝҮдҪҝз”Ё&д»Јжӣҝandеҗ—пјҹпјҲPythonзҡ„andеңЁеӨ„зҗҶNumPyж•°з»„ж—¶ж•ҲжһңдёҚдҪігҖӮпјү - Alex Riley
我遇到了这个问题。它会报错:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。我从未完全弄清楚如何解决这个问题。 - Luca
2个回答

6

NumPy的&执行按位与。当应用于数组时,按位与逐个元素应用。由于比较,例如r < rt,返回布尔数组,因此按位与的结果在这里与逻辑与相同。需要括号,因为NumPy的&<具有更高的优先级

mask = (r < rt) & (g < gt) & (b < bt)
image[mask] = 0

非常感谢您的额外解释! - Luca

2
请注意 - OpenCV 使用的是"BGR"而不是RGB。因此使用时要注意。

r = image[:, :, 0]

产生蓝色通道,而不是红色通道!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接