如何将项添加到numpy数组的每个元组元素?

时间:2018-06-14 07:38:55

标签: python arrays numpy

我有一个numpy数组A的形状(512,512,4) 每个元素都是一个元组:(r,g,b,a)。它代表512x512 RGBA图像。

我有一个numpy数组B的形状(512,512,3) 每个元素都是一个元组:(r,g,b)。它代表一个类似的RGB图像。

我想快速复制所有' a' (A)从A的每个元素到B中的相应元素的值(基本上转移alpha通道)。

得到的B形状将是(512,512,4)。

我怎样才能做到这一点?该算法基于here布局的快速像素处理技术。

代码:

## . input_image is loaded using PIL/pillow
rgb_image = input_image
print(f"Image: {rgb_image}")
rgb_image_array = np.asarray(rgb_image) # convert to numpy array
print(f"Image Array Shape: {rgb_image_array.shape}")

gray_image = rgb_image.convert("L") # convert to grayscale
print(f"Gray image: {gray_image}")
gray_image_array = np.asarray(gray_image)
print(f"Gray image shape: {gray_image_array.shape}")

out_image_array = np.zeros(rgb_image_array.shape, rgb_image_array.dtype)
print(f"Gray image array shape: {out_image_array.shape}")

rows, cols, items = out_image_array.shape

# create lookup table for each gray value to new rgb value
LUT = []
for i in range(256):
    color = gray_to_rgb(i / 256.0, positions, colors)
    LUT.append(color)

LUT = np.array(LUT, dtype=np.uint8)

print(f"LUT shape: {LUT.shape}")

# get final output that uses lookup table technique.
# notice that at this point, we don't have the alpha channel
out_image_array = LUT[gray_image_array]
print(f"output image shape: {out_image_array.shape}")

# How do I get the alpha channel back from rgb_image_array into out_image_array

输出:

Image: <PIL.Image.Image image mode=RGBA size=512x512 at 0x7FDEF5F2F438>
Image Array Shape: (512, 512, 4)
Gray image: <PIL.Image.Image image mode=L size=512x512 at 0x7FDEF5C25CF8>
Gray image shape: (512, 512)
Gray image array shape: (512, 512, 4)
LUT shape: (256, 3)
output image shape: (512, 512, 3)

2 个答案:

答案 0 :(得分:2)

使用numpy切片:

import numpy as np

A = [[(1,1,1,4)], [(1,1,1,5)]]
B = [[(2,2,2)], [(3,3,3)]]

# A and B are tensors of order 3
A = np.array(A)  
B = np.array(B)


print("A=")
print(A)
print("B=")
print(B)

C = np.copy(A)

# assign along all 1st and 2nd dimensions, but only the first three elements of the third dimension
C[:,:,0:3] = B

print("C=")
print(C)

输出:

A=
[[[1 1 1 4]]

 [[1 1 1 5]]]
B=
[[[2 2 2]]

 [[3 3 3]]]
C=
[[[2 2 2 4]]

 [[3 3 3 5]]]

答案 1 :(得分:0)

让我们注意术语

  

我有一个numpy数组A的形状(512,512,4)每个元素都是一个元组:(r,g,b,a)。它代表512x512 RGBA图像。

如果A具有该形状,并且具有数字dtype(例如np.int32),那么它具有512 * 512 * 4个元素。如果tuple是对象,它可以拥有dtype元素的唯一方法。我怀疑你有一个512x512的图像,其中每个像素由4个值表示。

A[0,0,:]

将是一个(4,)形状数组,表示一个像素的4个值(有时称为通道)。

A[:,:,0]

是整个图像的r值。

如果它们确实是3d数组,那么@mocav的复制列(在最后一个维度上建立索引)到新数组的解决方案是正确的。

另一种可能性是它们是分别具有4和3个字段的2d数组。这将打印(str)作为元组,但repr打印将使复合dtype显式。但解决方案将类似 - 创建一个正确形状和dtype的新数组(如A),并按BA的字段名称复制值。 (在你澄清情况之前,我会等待细节)。