2017-02-15 10 views
1

私は、RGB画像に対応する3次元のナンパー配列を持っています。 R、G、またはBチャンネルのピクセルが1の場合、2次元配列の対応するピクセルが255になるように、2次元のナンシー配列を作成する必要があります。3-D Numpy配列から2-D配列を作成する方法は?

Numpy配列のリスト理解のようなものですが、結果は元の配列と同じ形です。私は新しい形が2次元であることが必要です。

答えて

2

出力ピクセルを0にしたい場合は、255でなく、入力がMxNx3であるとします。

RGB = RGB == 1 # you can skip this if your original (RGB) contains only 0's and 1's anyway 
out = np.where(np.logical_or.reduce(RGB, axis=-1), 255, 0) 
1

apply_along_axisを使用してください。例えば

In [28]: import numpy as np 
In [29]: np.random.seed(10) 
In [30]: img = np.random.randint(2, size=12).reshape(3, 2, 2) 
In [31]: img 
Out[31]: 
array([[[1, 1], 
     [0, 1]], 
     [[0, 1], 
     [1, 0]], 
     [[1, 1], 
     [0, 1]]]) 
In [32]: np.apply_along_axis(lambda a: 255 if 1 in a else 0, 0, img) 
Out[32]: 
array([[255, 255], 
     [255, 255]]) 

詳細はdoc of numpyを参照してください。ブール値が自動的intタイプにアップスケールされるよう

2

一つのアプローチはこれと同様に、第三のDIMに沿っany()を使用し、次いで255を掛けるとなり得る -

(img==1).any(axis=2)*255 

サンプルラン -

In [19]: img 
Out[19]: 
array([[[1, 8, 1], 
     [2, 4, 7]], 

     [[4, 0, 6], 
     [4, 3, 1]]]) 

In [20]: (img==1).any(axis=2)*255 
Out[20]: 
array([[255, 0], 
     [ 0, 255]]) 

ランタイムテスト -

In [45]: img = np.random.randint(0,5,(1024,1024,3)) 

# @Paul Panzer's soln 
In [46]: %timeit np.where(np.logical_or.reduce(img==1, axis=-1), 255, 0) 
10 loops, best of 3: 22.3 ms per loop 

# @nanoix9's soln  
In [47]: %timeit np.apply_along_axis(lambda a: 255 if 1 in a else 0, 0, img) 
10 loops, best of 3: 40.1 ms per loop 

# Posted soln here  
In [48]: %timeit (img==1).any(axis=2)*255 
10 loops, best of 3: 19.1 ms per loop 

さらに、我々はnp.uint8に変換することができ、その後、いくつかの更なるパフォーマンスの向上のために255でそれを掛ける -

In [49]: %timeit (img==1).any(axis=2).astype(np.uint8)*255 
100 loops, best of 3: 18.5 ms per loop 

そして、もっと、私たちは第三薄暗いに沿って個々のスライスで作業する場合 -

In [68]: %timeit ((img[...,0]==1) | (img[...,1]==1) | (img[...,2]==1))*255 
100 loops, best of 3: 7.3 ms per loop 

In [69]: %timeit ((img[...,0]==1) | (img[...,1]==1) | (img[...,2]==1)).astype(np.uint8)*255 
100 loops, best of 3: 5.96 ms per loop 
関連する問題