Image 如何根据rgba图像的不透明度值添加rgb图像和rgba图像

Image 如何根据rgba图像的不透明度值添加rgb图像和rgba图像,image,numpy,Image,Numpy,假设一个图像是成形的(x,y,3),另一个是成形的(x,y,4)。现在取决于第4层中像素的值是0还是非零。我需要使用以下规则替换第一幅图像中的像素值 如果第4层中的像素为0,则返回图像的值=rgb图像中该像素处(x,y,3)的值 如果非零返回图像的值=rgba图像中该像素处的值 返回图像应具有形状(x,y,3)您可以执行以下操作: mask = img2[...,3] > 0 new_img = np.where(mask[...,None], img2[...,:3], img1)

假设一个图像是成形的(x,y,3),另一个是成形的(x,y,4)。现在取决于第4层中像素的值是0还是非零。我需要使用以下规则替换第一幅图像中的像素值

  • 如果第4层中的像素为0,则返回图像的值=rgb图像中该像素处(x,y,3)的值

  • 如果非零返回图像的值=rgba图像中该像素处的值

  • 返回图像应具有形状(x,y,3)

    您可以执行以下操作:

    mask = img2[...,3] > 0
    
    new_img = np.where(mask[...,None], img2[...,:3], img1)
    
    也无需广播:

    mask = img2[...,3:] > 0
    
    new_img = np.where(mask, img2[...,:3], img1)
    

    如果我理解正确,您实际上希望使用RGBA图像的alpha部分作为二进制掩码。假设
    A
    是rgb基本图像,
    B
    是rgba顶部图像,两者都表示为numpy数组:

    mask = B[:, :, 3] > 0.5  # you can also use another threshold here
    A[mask] = B[mask, 0:3]
    
    为此,两个图像必须具有相同的形状

    或者,也可以使用alpha通道(而不是使用二进制遮罩)将第二个图像覆盖在第一个图像的顶部:

    A = (1-B[:,:,3])*A + B[:,:,3]*B[:,:,0:3]
    

    正如我理解你的建议,掩码将是一个形状(x,y)的布尔数组,对吗?请你详细说明一下,这将如何映射到wither img1或img 2相同像素位置的值?@alphason。尝试一个最简单的例子,你应该从你的问题开始就提供这个例子。也就是说,是的,这是一个2D数组。@alphason是的。没错。然后我们对
    np.where
    使用
    broadcast
    。这是
    where
    的一个很好的用法。可以说,它通常被插入方孔中。我还注意到mask=img2[…,3]不起作用,而正如Quang正确地提到的那样mask=img2[…,3:]。因为第一部分中掩码的返回形状是(x,y),这会给出值错误,而[…,3:]返回形状(x,y,1),如果使用掩码进行权重计算,则该形状有效,请不要忘记将
    A
    乘以
    1-B[…,-1]
    @anroesti!这把它分解得很好(谢谢)这是个好问题。如果你能提供一个简单的例子,那就太完美了。类似于一对3x4左右的图像数组和预期结果。