web-dev-qa-db-fra.com

numpy avec python: convertit un tableau 3D en 2D

Dites que j'ai une image en couleur, et cela sera naturellement représenté par un tableau à 3 dimensions en python, disons de forme (n x m x 3) et appelez-le img.

Je veux un nouveau tableau 2-d, appelez-le "narray" pour avoir une forme (3, nxm), telle que chaque ligne de ce tableau contient la version "aplatie" des canaux R, G et B. respectivement. De plus, il devrait avoir la propriété de pouvoir facilement reconstituer n'importe quel canal d'origine par quelque chose comme:

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

La question est de savoir comment puis-je construire le "narray" à partir de "img"? Le simple img.reshape (3, -1) ne fonctionne pas car l'ordre des éléments n'est pas souhaitable pour moi.

Merci

9
wudanao

Vous devez utiliser np.transpose pour réorganiser les dimensions. Maintenant, n x m x 3 doit être converti en 3 x (n*m), envoyez donc le dernier axe au premier plan et décalez à droite l'ordre des axes restants (0,1). Enfin, remettez en forme pour avoir 3 lignes. Ainsi, la mise en œuvre serait -

img.transpose(2,0,1).reshape(3,-1)

Exemple de cycle -

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]])
13
Divakar

Si vous avez installé le module scikit, vous pouvez utiliser rgb2grey (ou rgb2gray) pour créer une photo de couleur en gris (de 3D à 2D). 

depuis skimage import io, couleur

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

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

Dans [34]: lina_gray.shape Out [34]: (1920, 1280)

0
Harry

Disons que nous avons un tableau img de taille m x n x 3 à transformer en un tableau new_img de taille 3 x (m*n)

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