2017-11-18 13 views
2

大きなRGBイメージをnumpy配列として持つ、R = 0、G = 0、B = 0〜R = 255、G = 0のすべてのピクセルを設定したい、B = 0である。 最も速い方法は何ですか? 私が試した:numpy配列のピクセル値を変更する方法

for pix in result: 
    if np.all(np.logical_and(pix[0]==pix[1],pix[2]==0,pix[2]==pix[1])): 
     pix [0] = 255 

をしかし、このように私は、単一のピクセルを持っていません。同様の方法でインデックスを反復しないのですか?

+0

画像の '.shape'とは何ですか? – gboffi

答えて

3

ここではベクトル化されたソリューションがあります。あなたのイメージは、基本的に3(色)の配列でhでwです。把握しにくいが非常に強力な放送ルールを利用することができます。

基本的に、配列全体を、あなたが探している値を持つ3つのベクトルと比較します。放送のルールのため、Numpyは各ピクセルをその3つのベクトルと比較し、一致するかどうかを教えてくれます(この特定のケースでは、赤、緑、青が一致する場合)。ですから、あなたはイメージと同じ大きさの真理と偽りの真偽値の配列で終わるでしょう。

ここで、3つの色がすべて一致しているピクセルを探したいだけです。そのためには、 "all"メソッドを使用します。これは、配列のすべての値がtrueの場合に真です。これを特定の軸(この場合は色軸)に適用すると、すべての色が一致していれば、真であるw×hの配列が得られます。

今度は、この2Dブール値マスクをオリジナルのwに3倍の配列で適用し、私たちの色と一致するピクセルを得ることができます。今度は再放送することができます。すべての値は、単純かつ効率的な方法で正またはヌルであるため、ここで

は、例えば、コード

import numpy as np 

#create a 2x2x3 image with ones 
img = np.ones((2,2,3)) 

#make the off diagonal pixels into zeros 
img[0,1] = [0,0,0] 
img[1,0] = [0,0,0] 

#find the only zeros pixels with the mask 
#(of course any other color combination would work just as well) 
#... and apply "all" along the color axis 
mask = (img == [0.,0.,0.]).all(axis=2) 

#apply the mask to overwrite the pixels 
img[ mask ] = [255,0,0] 
+0

ありがとう、非常に明確な答え – leoScomme

1

ある:

img[img.sum(axis=2)==0,0]=255 

img.sum(axis=2)==0は、2つの第1の次元で、良好な画素を選択し、0 3番目の赤い運河。

関連する問題