我正在尝试使用numpy将二进制蒙版应用于RGB图像
我找到了这个https://stackoverflow.com/a/26843467/4628384,但是我还没有写评论的权限。 无论如何,我遇到了问题。任何帮助表示赞赏。
def masktoRGB(self,image,image_mask):
# create mask with same dimensions as image
mask = np.zeros_like(image)
# copy your image_mask to all dimensions (i.e. colors) of your image
for i in range(3):
mask[:,:,i] = image_mask.copy()
# apply the mask to your image
# tried to swap axes, not a solution
#image = image.swapaxes(0,1)
#this gives the error:
masked_image = image[mask]
print(mask.shape)
print(image.shape)
print(image_mask.shape)
return masked_image
这给了我
IndexError:索引213超出了尺寸为212的轴0的边界
打印输出:
(188,212,3) (188,212,3) (188,212)
image和image_mask是相同的图像,除了第一个是RGB,第二个是模式L
答案 0 :(得分:2)
尝试使用广播和乘法:
image * image_mask[..., None]
我假设image_mask的类型是bool,它映射到数字0和1。因此,图像和mask的成对乘法会将掩码值设置为零。
可以通过np.where()或&运算符实现类似的效果。
问题是image和image_mask的形状不兼容。 Numpy首先会在形状的头部添加额外的尺寸,直到两个张量具有相同的形状。因此,image_mask从(188,212)重塑为(1,188,212)。此新形状与图像的形状不兼容 (188,212,3)。
诀窍是使用花式索引重塑image_mask。您可以将“无”用作索引,以在形状末端添加大小为1的虚拟尺寸。 image_mask [...,None]操作会将它的形状从(188,212)重塑为(188,212,1)。
广播规则告诉我们,通过沿广播维度重复所有值来扩展大小为1的维度。因此,numoy会自动将张量从(188,212,1)重塑为(188,212,3)。操作非常快,因为没有创建副本。
现在可以将bith张量相乘以产生所需的结果。