2016-04-08 10 views
1

2次元配列の各要素(またはピクセル)に対応する3バイトの配列を含むカラー画像を表すndarrayの3Dインスタンスをスライスしようとしています。それぞれ赤、緑、青の値。私は、各色ごとに2次元のndarrayを個別にスライスして、実装要件に応じてそれらをフラット化してエンドツーエンドで連結することができます。私が現在試みているコードは、次のとおりです。Pythonで3次元のndarrayをスライスする

red = image[:, :, 0] 
green = image[:, :, 1] 
blue = image[:, :, 2] 
collapsed_image = numpy.concatenate((red.flatten('C'), green.flatten('C'), blue.flatten('C')), axis=0) 

ここで、imageは、3次元のバイト配列を含むnumpy.ndarrayオブジェクトです。これは、個々の色の2次元配列をスライスして、両端でそれらを平坦化/連結することになりますか?

+0

各色の2D配列をいくつかの小さなテスト配列に設定し、結果があなたの望むものと一致するかどうかを確認することができます –

答えて

0

このような出力を達成することを意味しますか?

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) 

出力:

(215L, 235L, 3L) 

enter image description here

0

ndarrayは、メモリのバイトのフラット化コレクションは常にではないが所望の順序で、すでにあります。 np.rollaxisはそれを変更することができます。簡単な例として

まず古典2x2の画像(各桁は、管に関連付けられている):

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) 

他のビュー、第一管:

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) 

と平坦なレイアウト:

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) 

私は最後があなたが望むものだと思います:np.rollaxis(image,2).flatten()

関連する問題