web-dev-qa-db-ja.com

Pythonでnumpy:3D配列を2Dに変換

私がカラー画像を持っていると言うと、当然これはPythonの3次元配列、たとえば形状(n x m x 3)で表され、imgと呼ばれます。

新しい2次元配列が必要です。この配列の各行にR、G、およびBチャンネルの「フラット化」バージョンがそれぞれ含まれるように、形状(3、nxm)を持つ「narray」と呼びます。さらに、次のような方法で元のチャンネルを簡単に再構築できるという特性が必要です。

narray[0,].reshape(img.shape[0:2])    #so this should reconstruct back the R channel.

問題は、「img」から「narray」をどのように構築すればよいですか?単純なimg.reshape(3、-1)は、要素の順序が私にとって望ましくないため機能しません。

ありがとう

11
wudanao

_np.transpose_ を使用してディメンションを再配置する必要があります。ここで、_n x m x 3_は3 x (n*m)に変換されるため、最後の軸を前に送り、残りの軸_(0,1)_の順序を右にシフトします。最後に、_3_行を持つように形状を変更します。したがって、実装は次のようになります-

_img.transpose(2,0,1).reshape(3,-1)
_

サンプル実行-

_In [16]: img
Out[16]: 
array([[[155,  33, 129],
        [161, 218,   6]],

       [[215, 142, 235],
        [143, 249, 164]],

       [[221,  71, 229],
        [ 56,  91, 120]],

       [[236,   4, 177],
        [171, 105,  40]]])

In [17]: img.transpose(2,0,1).reshape(3,-1)
Out[17]: 
array([[155, 161, 215, 143, 221,  56, 236, 171],
       [ 33, 218, 142, 249,  71,  91,   4, 105],
       [129,   6, 235, 164, 229, 120, 177,  40]])
_
18
Divakar

サイズ3 x (m*n)の配列m x n x 3に変換するサイズnew_imgの配列imgがあるとしましょう

new_img = img.reshape((img.shape[0]*img.shape[1]), img.shape[2])
new_img = new_img.transpose()
1
yashgarg1232

Scikitモジュールがインストールされている場合は、rgb2grey(またはrgb2gray)を使用して、カラーからグレー(3Dから2D)に写真を作成できます。

from skimage import io, color

lina_color = io.imread(path+img)
lina_gray = color.rgb2gray(lina_color)

In [33]: lina_color.shape
Out[33]: (1920, 1280, 3)

In [34]: lina_gray.shape
Out[34]: (1920, 1280)
0
Harry