将包含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
答案 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]]
。