Snow
Snow

Reputation: 1138

Mark the difference between 2 pictures in Python

I have recently started to play with Pillow. I am comparing two pictures in Python 3.3 and want to save the difference as an image.

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

But I always get a TypeError: argument must be sequence

I believe this happens at draw.rectangle(diff) How can I get rid of the error?

Thank you.

Upvotes: 0

Views: 2508

Answers (1)

Avihoo Mamka
Avihoo Mamka

Reputation: 4786

From PIL documentation:

PIL.ImageDraw.Draw.rectangle(xy, fill=None, outline=None) Draws a rectangle.

Parameters:
xy – Four points to define the bounding box.

Sequence of either [(x0, y0), (x1, y1)] or [x0, y0, x1, y1]. The second point is just outside the drawn rectangle.

outline – Color to use for the outline.

fill – Color to use for the fill.

This means that you should pass a sequence, and from the documentation as well:

Image.getbbox()

Calculates the bounding box of the non-zero regions in the image.

Returns: The bounding box is returned as a 4-tuple defining the left, upper, right, and lower pixel coordinate. If the image is completely empty, this method returns None.

So the problem is that you pass a 4 tuple to a function that expects a sequence of either [(x0, y0), (x1, y1)] or [x0, y0, x1, y1]

You can wrap your 4 tuple with list() literal to get the second option of what the function expects:

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

Or if you want to replace the input to the first type rectangle expects you can do the following:

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

Upvotes: 1

Related Questions