将1-D numpy数组转换为3D RGB数组

时间:2017-11-06 20:35:37

标签: python arrays numpy rgb

将包含rgb数据的1D数组转换为3D RGB数组的最佳方法是什么?

如果数组按此顺序排列,那将很容易(单个重塑)

  

RGB RGB RGB RGB ...

但是我的数组的形式是

  

... RRRR GGGG .... BBBB

或有时甚至,

  

GGGG .... RRRR .... BBBB(结果仍然应该是RGB而不是GRB)

我当然可以推导出一些Python方法来实现这一点,我甚至尝试了一个numpy解决方案,它可以工作,但它显然是一个糟糕的解决方案,我想知道什么是最好的方式,也许是一个内置的numpy功能?

我的解决方案:

for i in range(len(video_string) // 921600 - 1):        # Consecutive frames iterated over.
    frame = video_string[921600 * i: 921600 * (i + 1)]  # One frame
    array = numpy.fromstring(frame, dtype=numpy.uint8)  # Numpy array from one frame.
    r = array[:307200].reshape(480, 640)
    g = array[307200:614400].reshape(480, 640)
    b = array[614400:].reshape(480, 640)
    rgb = numpy.dstack((b, r, g))                       # Bring them together as 3rd dimention

不要让for循环让你感到困惑,我只是让字符串中的帧相互连接,就像视频一样,这不是问题的一部分。

What did not help me:在这个问题中,r,g,b值已经是2d数组,因此对我的情况没有帮助。

Edit1:所需的数组形状为640 x 480 x 3

1 个答案:

答案 0 :(得分:3)

重塑为2D,转置,然后重塑为3D RRRR...GGGG....BBBB形式 -

a1D.reshape(3,-1).T.reshape(height,-1,3) # assuming height is given

或者使用Fortran订单重塑,然后交换轴 -

a1D.reshape(-1,height,3,order='F').swapaxes(0,1)

示例运行 -

In [146]: np.random.seed(0)

In [147]: a = np.random.randint(11,99,(4,2,3)) # original rgb image

In [148]: a1D = np.ravel([a[...,0].ravel(), a[...,1].ravel(), a[...,2].ravel()])

In [149]: height = 4

In [150]: np.allclose(a, a1D.reshape(3,-1).T.reshape(height,-1,3))
Out[150]: True

In [151]: np.allclose(a, a1D.reshape(-1,height,3,order='F').swapaxes(0,1))
Out[151]: True

对于GGGG....RRRR....BBBB表单,只需添加:[...,[1,0,2]]