比较两个图像/图片,并标记差异

时间:2014-11-06 07:23:14

标签: python python-imaging-library

我正在学习比较两张图片/图片。我发现帖子Compare two images the python/linux way非常有用,我对这项技术有一些疑问。

问题1:

这篇文章展示了比较2张图片/图片的方法。可能最简单的方法是:

from PIL import Image
from PIL import ImageChops

im1 = Image.open("file1.jpg")
im2 = Image.open("file2.jpg")

diff = ImageChops.difference(im2, im1).getbbox()

print diff

当我有2张相似的图片并在上面运行时,它会给出结果:

(389, 415, 394, 420)

图片中的位置是两张图片的区别所在。所以我的问题是,是否可以在图片上标记差异(例如,画一个圆圈)?

问题2:

import math, operator
from PIL import Image
def compare(file1, file2):
    image1 = Image.open(file1)
    image2 = Image.open(file2)
    h1 = Image.open("image1").histogram()
    h2 = Image.open("image2").histogram()

    rms = math.sqrt(reduce(operator.add, map(lambda a,b: (a-b)**2, h1, h2))/len(h1))

if __name__=='__main__':
    import sys
    file1 = ('c:\\a.jpg')        # added line
    file2 = ('c:\\b.jpg')        # added line

    file1, file2 = sys.argv[1:]
    print compare(file1, file2)

当我在上面运行时,它会给出一个错误“ValueError:需要超过0个值才能解压缩”,问题出在这一行:

file1, file2 = sys.argv[1:]

如何更正?而我在下面试过它也不起作用。

    print compare('c:\\a.jpg', 'c:\\b.jpg')

更新

在Matt的帮助下添加了问题。

它可以绘制一个矩形来标记两个图像/图片的差异。当两个图像/图片看起来一般相同但有小点差异蔓延。它绘制了一个大矩形标记,包括所有斑点差异。有没有办法单独标记差异?

2 个答案:

答案 0 :(得分:2)

关于您的第一个问题:

import ImageDraw
draw = ImageDraw.Draw(im2)
draw.rectangle(diff)
im2.show()

关于你的第二个问题:

错误说明sys.argv未包含足够的值以分配给file1file2。您需要将要比较的两个文件的名称传递给python脚本(变量sys.arv包含脚本名称和所有命令行参数):

python name_of_your_script.py file1.jpg file2.jpg

答案 1 :(得分:1)

问题1:ImageDraw

image = Image.open("x.png")
draw = ImageDraw.Draw(image)
draw.ellipse((x-r, y-r, x+r, y+r))