我有以下具有RGB值和相应类别的图像蒙版:
现在我想在像素级别上每个类具有一个布尔型numpy数组,以便每个像素具有相应的类,即每个类的[length,width]布尔型数组,每个像素的值为True或False,具体取决于是否它属于该类。
对于BG,嘴巴和眼睛,我可以简单地复制轴0、1或2,然后使用np.bool将其转换为True或False(255 = True,0 = False)。
但是,对于其他类,我在不使用double for循环的情况下努力工作。有人可以在不使用for循环的情况下帮助我获得我想要的东西吗?
答案 0 :(得分:0)
这样的事情怎么样?
labels = {'bg' : [255, 0, 0],
'face' : [255, 255, 0],
'hair' : [127, 0, 0],
'eyes' : [0,0,255],
'nose' : [0, 255, 255],
'mouth' : [0,255,0],
}
arr = np.random.choice([0,127,255], size=(3,500,500)) # simulated image
for key in labels.keys():
key_img = (arr[0,...]==labels[key][0]) * (arr[1,...]==labels[key][1]) * (arr[2,...]==labels[key][2])
# do something with key_img
btw:
对于BG,嘴巴和眼睛,我可以简单地复制轴0、1或2,然后使用np.bool将其转换为True或False(255 = True,0 = False)。
将导致标签不明确。例如,鼻子得分为BG和眼睛得分
答案 1 :(得分:0)
您可以利用numpy广播:
一个例子:
>>> pprint(labels)
{'BG': array([255, 0, 0]),
'eyes': array([ 0, 0, 255]),
'face': array([255, 255, 0]),
'hair': array([127, 0, 0]),
'mouth': array([ 0, 255, 0]),
'nose': array([ 0, 255, 255])}
>>> example
array([[[255, 0, 0],
[127, 0, 0],
[255, 0, 0],
[255, 0, 0]],
[[255, 255, 0],
[ 0, 255, 0],
[255, 0, 0],
[ 0, 255, 0]],
[[ 0, 0, 255],
[255, 255, 0],
[ 0, 0, 255],
[ 0, 0, 255]]])
使用广播可以同时检查三个频道。然后沿着轴2使用all
,我们可以选择满足所有三个相等性的点。
>>> masks = {k: (example==v).all(2) for k, v in labels.items()}
仅此而已。结果:
>>> pprint(masks)
{'BG': array([[ True, False, True, True],
[False, False, True, False],
[False, False, False, False]]),
'eyes': array([[False, False, False, False],
[False, False, False, False],
[ True, False, True, True]]),
'face': array([[False, False, False, False],
[ True, False, False, False],
[False, True, False, False]]),
'hair': array([[False, True, False, False],
[False, False, False, False],
[False, False, False, False]]),
'mouth': array([[False, False, False, False],
[False, True, False, True],
[False, False, False, False]]),
'nose': array([[False, False, False, False],
[False, False, False, False],
[False, False, False, False]])}