2017-09-14 10 views
1

画像の処理では、すべての白いピクセルを無視したいと思います。これを行う最善の方法は、初期化するとすぐに白い画素があるマスク配列を変更するようにマスク配列を設定することです。これを行うには、次のコードの最後の行に記載されているメソッドを使用します。numpyを使用して特定の値のピクセルのマスク配列を作成する

with PIL.Image.open(picture) as im: 
    pix = numpy.array(im, dtype=numpy.float) 
[height, width, _] = pix.shape 
mask = numpy.zeros((height,width)) 
mask[numpy.argwhere(pix == [255,255,255])] = 1 

しかし、この行は次のエラーを生成します。

File "C:\Users\Alec\zone_map.py", line 19, in zone_map 
    mask[numpy.argwhere(pix == [255,255,255])] = 1 

IndexError: index 5376 is out of bounds for axis 0 with size 4000 

どのように私は望ましい結果を達成するために、これを変更することができますか?

+1

あなたは何をすべきか「うまくいかない」という意味ですか?それはエラーを投げますか?予期しない結果を出す? –

答えて

1

そうのように、boolean-indexing次(S)値を割り当てるには、入力配列に最後の軸と、単にインデックスに沿ってALL-reducedのマスクを使用する -

mask = (pix==255).all(axis=-1) 
pix[mask] = 1 

をサンプル実行 -

In [18]: pix 
Out[18]: 
array([[[ 5, 11, 10], 
     [ 9, 5, 11], 
     [ 11, 10, 9], 
     [255, 255, 255]], 

     [[ 9, 8, 8], 
     [ 10, 8, 9], 
     [255, 255, 255], 
     [ 5, 8, 10]]]) 

In [19]: mask = (pix==255).all(-1) 

In [21]: pix[mask] = 1 

In [22]: pix 
Out[22]: 
array([[[ 5, 11, 10], 
     [ 9, 5, 11], 
     [11, 10, 9], 
     [ 1, 1, 1]], 

     [[ 9, 8, 8], 
     [10, 8, 9], 
     [ 1, 1, 1], 
     [ 5, 8, 10]]]) 
関連する問題