Image 如何根据rgba图像的不透明度值添加rgb图像和rgba图像
假设一个图像是成形的(x,y,3),另一个是成形的(x,y,4)。现在取决于第4层中像素的值是0还是非零。我需要使用以下规则替换第一幅图像中的像素值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)
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左右的图像数组和预期结果。