使用numpy将二进制蒙版应用于RGB图像时出现问题

时间:2019-10-18 14:41:57

标签: python-3.x numpy python-imaging-library

我正在尝试使用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

1 个答案:

答案 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张量相乘以产生所需的结果。