Numpy met Python: Converteer 3D-array naar 2D

Zeg dat ik een kleurenbeeld heb, en natuurlijk wordt dit weergegeven door een driedimensionale array in Python, zeg van vorm (n x m x 3) en noem het IMG.

Ik wil een nieuwe 2-D-array, bel het “Naray” om een ​​vorm (3, NXM) te hebben, zodat elke rij van deze array de “afgevlakte” versie van R-, G- en B-kanaal bevat. Bovendien moet het eigendom hebben dat ik gemakkelijk een van het oorspronkelijke kanaal kan reconstrueren door iets als

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

De vraag is hoe kan ik het “Naray” van “img” construeren? De eenvoudige IMG.Reshape (3, -1) werkt niet als de volgorde van de elementen niet wenselijk voor mij.

bedankt


Antwoord 1, Autoriteit 100%

U moet np.transposeom de afmetingen te herschikken. Nu, n x m x 3moet worden geconverteerd naar 3 x (n*m), dus stuur de laatste as naar de voor- en verschuif de volgorde van de resterende assen (0,1). Eindelijk hervormd om 3rijen te hebben. Aldus zou de implementatie zijn –

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

Sample RUN –

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

Antwoord 2, autoriteit 10%

Als je de scikit-module hebt geïnstalleerd, kun je de rgb2grey (of rgb2gray) gebruiken om een foto te maken van kleur naar grijs (van 3D naar 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)

Antwoord 3, autoriteit 10%

[ORIGINEEL ANTWOORD]

Stel dat we een array imgmet de grootte m x n x 3hebben om te transformeren in een array new_imgmet de grootte 3 x (m*n)

Eerste oplossing:

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

[BEWERKT ANTWOORD]

Flaw: de omvorming begint bij de eerste dimensie en hervormt de rest. Deze oplossing heeft het potentieel om de waarden uit de derde dimensie te mengen. Wat in het geval van afbeeldingen semantisch incorrect zou kunnen zijn.

Aangepaste oplossing:

# Dimensions: [m, n, 3]
new_img = new_img.transpose()
# Dimensions: [3, n, m]
new_img = img.reshape(img.shape[0], (img.shape[1]*img.shape[2]))

Strikte oplossing:

# Dimensions: [m, n, 3]
new_img = new_img.transpose((2, 0, 1))
# Dimensions: [3, m, n]
new_img = img.reshape(img.shape[0], (img.shape[1]*img.shape[2]))

De strikte is een betere manier om rekening te houden met de volgorde van dimensies, terwijl de resultaten van de Adapteden Strictidentiek zullen zijn in termen van de waarden (set(new_img[0,...])), echter met de volgorde geschud.

Other episodes