在Python中标记2张图片之间的区别

时间:2017-06-12 09:43:24

标签: python python-imaging-library

我最近开始玩Pillow。我正在比较Python 3.3中的两张图片,并希望将差异保存为图像。

from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw

file1 = '300.jpg'
file2 = '300.jpg'

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

diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
draw.rectangle(diff)
im2.convert('RGB').save('file3.jpg')

但我总是得到 TypeError:参数必须是序列

我相信这发生在 draw.rectangle(diff) 我该如何摆脱错误?

谢谢。

1 个答案:

答案 0 :(得分:1)

来自PIL documentation

  

PIL.ImageDraw.Draw.rectangle(xy, fill=None, outline=None)   画一个矩形。

     

参数:
  xy - 定义边界框的四个点。

     

[(x0, y0), (x1, y1)][x0, y0, x1, y1]的顺序。第二点就在绘制的矩形之外。

     

outline - 用于轮廓的颜色。

     

fill - 用于填充的颜色。

这意味着您应该传递一个序列,也可以传递documentation

  

Image.getbbox()

     

计算图像中非零区域的边界框。

     

返回:边界框作为定义左边的4元组返回,   上,右和下像素坐标。如果图像完全   为空,此方法返回None。

所以问题是你将一个4元组传递给一个期望序列为[(x0, y0), (x1, y1)][x0, y0, x1, y1]

的函数

你可以使用list()文字包装你的4元组,以获得函数所期望的第二个选项:

from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw

file1 = '300.jpg'
file2 = '300.jpg'

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

diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
diff_list = list(diff) if diff else []
draw.rectangle(diff_list)
im2.convert('RGB').save('file3.jpg')

或者,如果要将输入替换为第一种类型rectangle,则可以执行以下操作:

from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw

file1 = '300.jpg'
file2 = '300.jpg'

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

diff = ImageChops.difference(im1, im2).getbbox()
draw = ImageDraw.Draw(im2)
diff_list_tuples = >>> [diff[0:2], diff[2:]] if diff else [(None, None), (None, None)]
draw.rectangle(diff_list)
im2.convert('RGB').save('file3.jpg')