Numpy:将RGB平坦数组转换为矩阵

4

我有一个包含图像中所有像素RGB值的数组。假设图片是4x4大小,该数组大小为48,其中前16个值是红色值,接下来的16个是绿色值,最后16个是蓝色值:

[r0, r1, ..., r15, g0, g1, ..., g15, b0, b1, ..., b14, b15]

现在我想将该数组转换为一个深度为3的4x4矩阵,形式如下:
[[[r0, g0, b0], ..., [r3, g3, b3]],
  ...
 [[r12, g12, b12], ..., [r15, g15, b15]]]

为此,我正在进行一次reshape+transpose+reshape
import matplotlib.pyplot as plt

N = 4
numpy.random.seed(0)
rrggbb = numpy.random.randint(0, 255, size=N*N*3, dtype='uint8')
imgmatrix = rrggbb.reshape((3, -1)).transpose().reshape((N, N, 3))

plt.imshow(imgmatrix)
plt.show()

enter image description here

有没有更高效/简洁的方法来完成这个任务?(即:少使用重塑/转置操作)

1个回答

2

这里有一个步骤更少的选项:

rrggbb.reshape((3, N, N)).transpose((1,2,0))
​
(rrggbb.reshape((3, N, N)).transpose((1,2,0)) == imgmatrix).all()
# True

或者您可以使用np.moveaxisaxis 0移动到最后一个轴:

np.moveaxis(rrggbb.reshape((3, N, N)), 0, -1)

(np.moveaxis(rrggbb.reshape((3, N, N)), 0, -1) == imgmatrix).all()
#True

谢谢,我的脑海里一直在告诉我那里有些不太高效的地方... ^^ - Peque
嗯,我不是专家,但我猜你的方法应该是高效的,因为reshape几乎没有成本,它只是*在不改变数据的情况下给数组一个新的形状。*,而转置则是在移动数据。 - Psidom
1
虽然效率稍低,因为它需要3个操作而不是2个,但从CPU时间的角度来看,你的实现似乎更快(对于小图像,我的使用情况实际上快了约30%)。 - Peque
有趣。感谢分享时间结果。 - Psidom

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