2017-05-30 10 views
0

2つの画像を比較し、差分画像を保存する場合は、差分が赤で表示されます。 残念ながら、私は次のエラーを取得:あなたはグレースケール画像への変換を行った後Python Imaging Library:ピクセル値にアクセスできない

Traceback (most recent call last): 
    File "pythontest.py", line 216, in <module> 
    nDiff = compare(sPathCur, sPathRef, sPathDif) 
    File "pythontest.py", line 88, in compare 
    pix_diff[y, x] = (255, 0, 0) 
TypeError: function takes exactly 1 argument (3 given) 
def compare(sPathCur, sPathRef, sPathDif): 
    im_cur = Image.open(sPathCur) 
    im_ref = Image.open(sPathRef) 

    im_dif = im_cur.convert('L') # convert image to grey scale 

    delta = ImageChops.difference(im_cur, im_ref) 
    width, height = delta.size 

    pix_delta = delta.load() 
    pix_diff = im_dif.load() 

    for y in range(width): 
     for x in range(height): 
      r, g, b = pix_delta[y, x] 
      if (r > 0 or g > 0 or b > 0): 
       pix_diff[y, x] = (255, 0, 0) 

    im_dif.save(sPathDif) 
+0

メソッド 'putpixel'の[docs](http://www.effbot.org/imagingbook/image.htm#tag-Image.Image.putpixel)は、次のように言っています:"色は、単色画像の場合は単一の数値として与えられ、バンド画像、マルチバンド画像用のタプルなどがあります。タプルを単一の値に変換する必要がありますか? – phd

答えて

1

を、各ピクセルは、むしろRGBトリプレットよりも、単一の値が割り当てられます。

When converting from a colour image to black and white, the library uses the ITU-R 601-2 luma transform:

L = R * 299/1000 + G * 587/1000 + B * 114/1000 

ので、[X、Y] = [0,0]であなたのピクセルは次にグレースケールに変換した後、(100150200)の(R、G、B)値を有する場合:http://effbot.org/imagingbook/image.htmから撮影

ネストされたループの前にpix_diff [0,0]の値をチェックすることでこれを確認できます。それはあなたにただ一つの値を返すべきです。

だからあなたpix_diffの各画素に単一のグレースケール値を割り当てる必要があり、[Y、X]、または、各画素に(255, 0, 0)

のあなたの値を割り当てることができる前に、pix_diff画像がバックRGB互換形式に変換いずれか
関連する問題