2016-09-18 2 views
12

FD ** - 私はPython newbと同様にスタックオーバーフローnewbです。コメントに基づいて質問を編集しました。np配列は不変です - "代入先は読み取り専用です"

私の目標は、一連のPNGファイルを読み込み、Image.open( 'filename')でImageを作成し、1と0のみの単純な2D配列に変換することです。 PNGの形式はRGBAで、値は255と0のみです。イメージでは、エッジはグレースケール値ですが、これは2D配列では避けたいものです。

「赤い」チャンネルだけを取得するnp.asarray(画像)を使用して画像から2D配列を作成しました。現在の値がゼロでない場合、2次元画像配列のそれぞれで、セル値= 1を設定したいと思います。

だから、I 2次元配列へのループと私はセルの値をチェックし、それは私に、配列が読み取り専用であることを示すエラーが発生します。1.

に設定してみてください。私はいくつかのスタックオーバーフロースレッドを読むと、np配列は不変であり、それはまだ不明な点です。私はPILとnumpyを使用します。

ありがとう@ user2314737私はそのフラグを設定しようとします。 @エリック、あなたのコメントにも感謝します。

from PIL import Image 
import numpy as np 

関連コード:

prArray = [np.asarray(img)[:, :, 0] for img in problem_images] 

for img in prArray: 
    for x in range(184): 
     for y in range(184): 
      if img[x][y] != 0: 
       img[x][y] = 1 

エラー「割当先が読み取り専用であるが、」最後の行です。

皆様、ありがとうございます。

+0

でそれを変更

>>> img.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : False ALIGNED : True UPDATEIFCOPY : False 

で書き込み可能な場合、多くのWebリンクがhttp://stackoverflow.com/questions/13572448/changeがあります-values-in-a-numpy-arrayは少なくとも2つを示唆しています – NaN

+0

'img'はどこから来たのですか?なぜ' asarray'が必要ですか? – Eric

+2

この完全なコードは、 'prArray = prArray!= 0'と書く方が良いでしょう。 – Eric

答えて

16

チェック配列がWRITEABLEがfalseの場合、

img.setflags(write=1) 
+4

配列が読み込み専用である理由があるかもしれません。なぜ' img'のプロデューサが結果を決めるのかフラグを変更する前に読み取り専用です。理由が妥当でない場合は、代わりに 'img = img.copy()'を使うことを検討してください – Eric

関連する問題