Python PIL图像比较问题

4
我正在尝试使用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]处出现。请问有人可以解释一下原因吗?


看起来它们并不完全相同,至少 PNG 格式的图片高度似乎没有对齐。将它们转换为字节流或使用图像工具包进行检查。 - yacc
谢谢,对于肉眼来说看起来一样,但实际上似乎存在差异。 - Venkat .Tarakad
我现在遇到了这个问题。你最终是怎么解决这个问题的? - Crislips
欢迎来到KBAI。所以我最终使用了相似度比率,而不是仅进行像素级别的精确比较。 - Venkat .Tarakad
1个回答

10

"这两张图片完全相同,但我看到了不同之处。"

但它们并不相同。

您可以使用以下代码查看:

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)))
< p>返回True

< p>(这里将图片与其两次转置的版本进行比较)


非常感谢,让我好好想想你的分析并尝试理解。 - Venkat .Tarakad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接