Python PIL图像比较问题

时间:2017-09-09 03:16:09

标签: python image-processing python-imaging-library pillow

我正在尝试使用PIL比较2个图像,以下是我的场景。

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] 有人可以解释一下为什么吗?

1 个答案:

答案 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

(此处,等效像素为灰色,而白色像素表示img1中的像素设置为(暗),而未设置为img2,黑色像素表示相反。)

您似乎怀疑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

(这里,图像与自身的两次转换版本进行比较)