使用numpy为RGB数组添加alpha通道

25

我有一个RGB色域的图像数组,希望添加阿尔法通道并将其设置为全零。具体来说,我有一个形状为(205,54,3)的numpy数组,我希望将其形状更改为(205,54,4),第三维的额外位置都是0.0。哪个numpy操作可以实现这一点?

```python import numpy as np # 创建形状为(205, 54, 3)的随机数组 image = np.random.rand(205, 54, 3)
# 将第三维增加到 4,并用零填充 image_alpha = np.concatenate([image, np.zeros((205, 54, 1))], axis=2) ```

你是指希望得到一个包含 RGB 值的数组,并且使 RGB 值看起来像 (205, 54, 4, 0) 这样吗?请提供一个输出示例。 - Linus
@Linus OP 表示输入是一个三维数组,其尺寸为 205 x 54 x 3。 - kennytm
@kennytm 正确 - 输入的形状为(205,54,3),我希望它的形状为(205,54,4)。例如,x.shape = (205,54,3)x[0][0] = [255, 255, 255],我想要 x[0][0] = [255, 255, 255, 0] - Melanie
4个回答

26
你可以使用其中一个堆栈函数(stack / hstack / vstack / dstack / concatenate)来将多个数组连接在一起。
numpy.dstack( ( your_input_array, numpy.zeros((205, 54)) ) )

1
谢谢。我尝试了几个,但似乎找不到合适的。np.dstack很有道理。 - Melanie
@kennytm 由于某些我无法理解的原因,在我的情况下:data = np.dstack(( data, np.zeros((data[:,:,0].shape)))) 返回了一个类型为float64的数组,而不是uint8。有任何线索吗? - pippo1980
@pippo1980 在 np.zeros 中指定 dtype。它的默认值是 float64。https://numpy.org/doc/stable/reference/generated/numpy.zeros.html - kennytm
是的,谢谢,我已经想通了。我不想编辑你的答案。即使我被禁止再提问了!而且我也不知道该如何恢复。 - pippo1980

9
如果你已经有当前图像的RGB变量,那么只需使用以下代码:
rgba = numpy.concatenate((rgb, numpy.zeros((205, 54, 1))), axis=2)

Concatenate函数将rgb和zeros数组合并在一起。Zeros函数创建一个全是零的数组。我们将轴设置为2,这意味着我们在第三个维度上进行了合并。注意:轴从0开始计数。


9

np数组样式,在深度维度(通道维度,第三个维度)上堆叠:

rgba = np.dstack((rgb, np.zeros(rgb.shape[:-1])))

但你应该使用OpenCV函数:

rgba = cv2.cvtColor(rgb, cv2.COLOR_RGB2RGBA)

5

不确定您是否还在寻找答案。

最近,我正在尝试使用numpy实现与您相同的目标,因为我需要将24位深度的png强制转换为32位。 我同意使用dstack很合理,但我无法使其正常工作。 我使用了插入insert来达到我的目标。

# for your code it would look like the following:
rgba = numpy.insert(
    rgb,
    3, #position in the pixel value [ r, g, b, a <-index [3]  ]
    255, # or 1 if you're going for a float data type as you want the alpha to be fully white otherwise the entire image will be transparent.
    axis=2, #this is the depth where you are inserting this alpha channel into
)

希望这能帮到你,祝好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接