[EMAIL PROTECTED] 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 -- http://mail.python.org/mailman/listinfo/python-list