2017-05-30 74 views
0

我想比較兩張圖像並保存差異圖像,其中差異標記爲紅色。 不幸的是我得到以下錯誤:Python圖像庫:無法訪問像素值

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三元組。

http://effbot.org/imagingbook/image.htm摘自:

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]具有(R,G,B)的值(100150200),然後轉換爲灰度後,它將包含單個值140.75(然後將四捨五入爲整數)

您可以通過在嵌套循環之前檢查pix_diff [0,0]的值來驗證該值。它應該只返回一個值。

所以,你要麼需要在你的pix_diff [Y,X]分配一個灰度值到每個像素,或者將您的pix_diff圖像回的RGB兼容的格式,然後才能分配給每個像素您的(255, 0, 0)