2017-09-09 61 views
3

我想比較使用PIL的2張圖像,下面是我的場景。Python PIL圖像比較問題

IMG1:

img1

IMG2:

img2

img1 = Image.open(img1.png) 
img2 = Image.open(img2.png) 

我已經寫了一個簡單的diff函數將返回-1,如果有,如果他們的差或0是一樣的。

def diff(img1, img2): 
    im1 = img1.load() 
    im2 = img2.load() 

    for i in range(0, img1.size[0]): 
     for j in range(0, img1.size[1]): 
      if(im1[i,j] != im2[i,j]): 
       return -1 
    return 0 

我傳遞如下:

diff(img2, img1.transpose(Image.FLIP_LEFT_RIGHT)) 

兩個是完全一樣的圖像,但我得到的差異。差異似乎是: [27 84] 有人可以請解釋我爲什麼? 「

+0

看來,他們是不完全一樣的,至少那些PNG似乎沒有高度對齊。將它們轉儲爲字節流或使用圖像工具包進行檢查。 – yacc

+0

謝謝,它看起來同一個肉眼但實際上似乎是一個區別。 –

回答

8

」兩者完全相同,但我有所不同。「

但他們不是。

你可以看到這一點,使用下面的代碼,例如:

def show_diff(img1, img2): 
    diff = Image.new("RGB", img1.size, (255,255,255)) 
    for x1 in range(img1.size[0]): 
     for y1 in range(img1.size[1]): 
      x2 = img1.size[0] - 1 - x1 
      y2 = img1.size[1] - 1 - y1 

      if img1.getpixel((x1,y1)) != img2.getpixel((x2,y2)): 
       print(x1,y1,x2,y2) 
       diff.putpixel((x1,y1), (255,0,0)) 

    diff.show() 

img_r = Image.open("img/pacman-r.png") 
img_l = Image.open("img/pacman-l.png") 
show_diff(img_r, img_l) 

導致

diff

(在這裏,這兩個圖像是紅色之間是不同的任何像素。 )

或與

def show_delta(img1, img2): 
    diff = Image.new("RGB", img1.size, (255,255,255)) 
    for x1 in range(img1.size[0]): 
     for y1 in range(img1.size[1]): 
      x2 = img1.size[0] - 1 - x1 
      y2 = img1.size[1] - 1 - y1 

      p1 = img1.getpixel((x1,y1)) 
      p2 = img2.getpixel((x2,y2)) 
      p3 = round((p1[0]/2) - (p2[0]/2)) + 128 

      diff.putpixel((x1,y1), (p3,p3,p3)) 

    diff.show() 

img_r = Image.open("img/pacman-r.png") 
img_l = Image.open("img/pacman-l.png") 
show_delta(img_r, img_l) 

這導致

delta

(在此,相當於像素是灰色,而白像素中IMG2標誌着IMG1的像素被設定(暗),同時取消設置和黑色像素表示相反。)

看起來像你懷疑PIL的Image.transpose方法引起的問題,但源圖像不是只是調換。

Image.transpose如你所期望的作品 - 所以像:

def diff(img1, img2): 
    im1 = img1.load() 
    im2 = img2.load() 

    images_match = True 
    for i in range(0, img1.size[0]): 
     for j in range(0, img1.size[1]): 
      if(im1[i,j] != im2[i,j]): 
       images_match = False 

    return images_match 

img_r = Image.open("img/pacman-r.png")  
# NOTE: **NOT** Using img_l here 
print(diff(img_r, img_r.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.FLIP_LEFT_RIGHT))) 

回報True

(這裏,圖像相比其自身的兩次換位版)

+0

非常感謝,讓我考慮一下你的分析並嘗試理解。 –