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.transpose
om de afmetingen te herschikken. Nu, n x m x 3
moet 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 3
rijen 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 img
met de grootte m x n x 3
hebben om te transformeren in een array new_img
met 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 Adapted
en Strict
identiek zullen zijn in termen van de waarden (set(new_img[0,...])
), echter met de volgorde geschud.