2016-04-08 10 views
1

Ich versuche, eine 3-D-Instanz von NDarray zu zerschneiden, die ein Farbbild darstellt, wobei jedes Element (oder Pixel) im 2-D-Array ein Array mit 3 Bytes enthält die Werte von Rot, Grün bzw. Blau. Ich möchte ein 2D-Array für jede Farbe einzeln ausschneiden, so dass ich sie abflachen und Ende-zu-Ende gemäß unseren Implementierungsanforderungen verketten kann. Der Code, den ich gerade versuche, ist ...Slicing eines 3-dimensionalen NDarray in Python

Wo Bild ist meine numpy.darray Objekt mit der 3-D-Array von Bytes. Würde das funktionieren, um das 2D-Array jeder einzelnen Farbe auszuschneiden und sie Ende-zu-Ende zusammenzuflicken/verketten?

+0

Sie können es selbst testen, indem Sie jede Farbe 2D-Array zu einem kleinen Test-Array und sehen, ob das Ergebnis, was Sie wollen –

Antwort

0

Wollen Sie eine Ausgabe wie folgt erreichen?

from scipy.ndimage import * 
import matplotlib.pyplot as p 
%matplotlib inline 

im=imread('rgb.png') 
print np.shape(im) 

p.subplot(121) 
p.imshow(im) 

red = im[:, :, 0] 
green = im[:, :, 1] 
blue = im[:, :, 2] 
imchannels = np.concatenate((red, green, blue)) 

p.subplot(122) 
p.imshow(imchannels) 

Output:

(215L, 235L, 3L) 

enter image description here

0

ein ndarray ist bereits eine Flatten Sammlung von Bytes des Speichers, aber nicht immer in der gewünschten Reihenfolge. np.rollaxis kann es ändern.

Als einfaches Beispiel:

Zuerst ein klassisches 2x2 Bild (jede Ziffer zu einem Kanal zugeordnet ist):

image=np.arange(12).reshape(2,2,3)%3 

In [08]: image 
Out[08]: 
array([[[0, 1, 2], 
     [0, 1, 2]], 

     [[0, 1, 2], 
     [0, 1, 2]]], dtype=int32) 

Eine andere Ansicht, Kanal zuerst:

bycolor= r,g,b = np.rollaxis(image,axis=2) 

In [10]: bycolor 
Out[10]: 
array([[[0, 0], 
     [0, 0]], 

     [[1, 1], 
     [1, 1]], 

     [[2, 2], 
     [2, 2]]], dtype=int32) 

und abgeflachte Layouts:

In [11]: image.flatten() 
Out[11]: array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int32) 

In [12]: bycolor.flatten() 
Out[12]: array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32) 

Ich denke, die letzte ist, was Sie wollen: np.rollaxis(image,2).flatten()