2017-11-06 30 views
1

rgbデータを含む1次元配列を3D RGB配列に変換する最良の方法は何ですか?私の配列がフォームであるしかし1次元配列を3D RGB配列に変換する

配列がこの順番にあった場合、それは簡単だろうが、(単一リシェイプ)

RGB RGB RGB RGB ...

RRRR ... GGGG .... BBBB

または時々EVエン、

GGGG .... RRRR .... BBBB

(結果はまだRGBないGRBでなければなりません)私はもちろん、これを達成するためにいくつかのPythonの方法を導き出すことができ、私もしてみてくださいでした数え切れないほどの解決策、それは動作しますが、それは明らかに悪い解決策です私はおそらく組み込みの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 

ループのためのあなたを混乱させる、私はただの一部ではありませんビデオ、のような文字列で相互に連結したフレームを、持っていてはいけません質問。

What did not help me:この質問では、r、g、bの値は既に2次元配列であるため、私の状況には役立ちません。

EDIT1:所望の配列形状が2Dから640 x 480 x 3

+0

高さや幅を知らずに3D配列に変更するにはどうすればよいですか? – Divakar

+0

@Divakar申し訳ありませんが、私は編集しますが、フレームは921600バイトで、それを3つに分けて見ることができます。私たちは307200を持っています。これは640x480の製品です。 – Rockybilly

答えて

1

リシェイプされ、トランスポーズし、次いでRRRR...GGGG....BBBBフォームのバック3Dに整形 -

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

またはFortran順序で再形成し、次に軸をスワップ使用 -

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

のサンプル実行 - GGGG....RRRR....BBBBフォームの

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 

は、単に追加:[...,[1,0,2]]

+0

あなたの答えをありがとう、私のコードは性能に依存しているので、私は結果をテストし、それらの質問に投稿します、パフォーマンスへのアドバイスも受け入れられます。 – Rockybilly

+0

@Rockybilly私に連絡してください。 – Divakar

+0

@Rockybillyこれがあなたの問題を解決した場合、更新されますか? – Divakar

関連する問題