简体   繁体   中英

Numpy: Convert RGB flat array to matrix

I have an array containing the RGB values of all pixels in an image. Supposing a 4x4 image, the array is of size 48, where the first 16 values are the red values, the next 16 are the green and the last 16 are the blue:

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

Now I want to convert that array to a 4x4 matrix with depth 3 in this form:

[[[r0, g0, b0], ..., [r3, g3, b3]],
  ...
 [[r12, g12, b12], ..., [r15, g15, b15]]]

To do so, I am doing a 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()

在此输入图像描述

Is there a more efficient/short way to do that? (ie: with less reshaping/transposing)

Here is an option with one step less:

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

Or you can use np.moveaxis to move axis 0 to the last axis:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM