2017-09-09 4 views
3

J'essaie de comparer 2 images en utilisant PIL et le ci-dessous est mon scénario.Python PIL image comparer numéro

img1:

img1

img2:

img2

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

J'ai écrit une simple fonction de diff qui retourne -1 s'il y a une différence ou 0 si elles sont identiques.

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 

Je transmets les éléments suivants:

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

Les deux sont des exactement, mais je reçois l'image différence. La différence semble être à: [27 84] Quelqu'un peut-il m'expliquer pourquoi?

+0

Attend car ils ne sont pas exactement les mêmes, au moins ceux .png ne semblent pas être alignés en hauteur. Videz-les en tant que flux d'octets ou vérifiez-les avec une boîte à outils d'image. – yacc

+0

Merci, il semblait même à l'œil nu, mais en fait, il semble y avoir une différence. –

Répondre

8

"Les deux sont exactement la même image mais j'ai une différence."

Mais ils ne le sont pas.

Vous pouvez le voir, en utilisant le code ci-dessous par exemple:

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) 

Quels sont les résultats dans

diff

(Ici, un pixel qui diffère entre les deux images est de couleur rouge.)

Ou avec

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) 

qui se traduit par

delta

(Ici, des pixels équivalents sont gris tandis qu'un pixel blanc signifie un pixel dans img1 a été créé (foncé), tandis que non durci dans img2 et un pixel noir signifie le contraire.)

Il semble que vous ayez suspecté que la méthode Image.transpose de PIL ait causé le problème, mais que les images sources ne soient pas juste transposées.

Image.transpose œuvres que vous attendez - donc quelque chose comme:

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))) 

retours True.

(Ici, une image est comparée à une version deux fois transposée d'elle-même)

+0

Merci beaucoup, laissez-moi réfléchir à votre analyse et essayer de comprendre. –