我有一个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)
答案 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
),并按B
和A
的字段名称复制值。 (在你澄清情况之前,我会等待细节)。