给定一个带标签的图像(像素值对应其标签),以及接受的标签列表,我正在尝试创建一个“掩码”图像,如果像素的标签被接受,则其值为255
,否则为0
。
我知道这是一种缓慢的方法,因为它以Python速度迭代图像(但它很好地演示了这个想法):
mask = numpy.zeros(labels.shape[:2], dtype = "uint8")
for i in xrange(mask.shape[0]):
for j in xrange(mask.shape[1]):
if labels[i][j] in accepted:
mask[i][j] = 255
我知道使用python切片和掩码会更快,但我不知道如何组合一个复杂的条件。当我逐个遮罩像这样接受标签的像素时,我仍然可以获得巨大的加速。
for value in accepted:
mask[labels == value] = 255
我能用一行代码实现我想要的吗?我的python知识比较生疏(也就是说:最近几年几乎没有接触过python),虽然我试图借鉴其他例子来构造代码,但是下面这段代码是我得到的最接近结果:
mask[(labels in accepted).all()] = 255
在这种情况下,我遇到了以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我查看了类似的SO问题(例如这里或这里等),但它们似乎都涵盖了值来自范围或低于/高于阈值(<10)的情况,或者要更改的图像切片是连续的。任何有关如何检查“值是否在接受的值之间”的建议都将非常有用。