Comparing bitmap images for differences?

Diez B. Roggisch deets at nospam.web.de
Tue May 1 10:42:27 EDT 2007


lanwrangler at gmail.com schrieb:
> I know it's a long shot but does anyone have any pointers to generic
> algorithms - or, even better, Python code - for comparing images and
> computing a value for the "difference" between them?
> 
> What I want to do is to compare two bitmap images (taken from a
> webcam, so I'll likely be using PIL) and get some idea of the
> "difference" between them so I can tell if something in the image has
> changed, eg, a person has entered the field of view.  I've had a look
> at the PIL documentation and all it really told me was how little I
> knew about image processing :-) and I couldn't see any recipes in the
> Python Cookbook that are aimed at this problem area.  In a perfect
> world I'd love a method such as CompareImage(Img1, Img2) which would
> give a result of 255 if they're identical and 0 if not one pixel
> matches with a sliding scale inbetween but I know I'm probably asking
> for a lot there...
> 
> Some ideas I've had is, maybe, increasing the contrast on both images
> (to take out variation in lighting etc), then compressing the results
> to get a hash value and comparing the hash, but that sounds likely to
> produce a lot of false positives.  I note that PIL provides a
> histogram function for counting pixel colour values which sounds
> potentially useful and if no-one's got any better ideas I'll probably
> start working in that direction.  Or, maybe, dump the bitmap data into
> a numpy array and do some kind of FFT on that but that feels very CPU-
> intensive.
> 
> Those are my ideas so far but I thought it would be worth asking here
> first in case there are some known-good algorithms for doing this kind
> of thing rather than me trying to re-invent a wheel that ends up
> triangular...

There is the excellent OpenCV-library from intel which is FOSS and has a 
python-binding. Either using swig, or a ctypes-version:

http://wwwx.cs.unc.edu/~gb/wp/blog/2007/02/04/python-opencv-wrapper-using-ctypes/

With that, you can approach your problem. What is usually done is that a 
sequence of background images is sampled & an average is built. Then the 
actual image is subtracted from that image, with an epsilon to account 
for noise.

The result is then converted to a binary image for further processing. 
There are some blob-detection-recipes out there.

Another approach is to use the motion-detection parts of the lib.

Diez



More information about the Python-list mailing list