image matching algorithms
Shane Geiger
sgeiger at ncee.net
Mon Mar 10 20:46:02 EDT 2008
Daniel Fetchinson wrote:
>>> There are a number of free tools for image matching but it's not very
>>> easy to decipher the actual algorithm from the code that includes db
>>> management, GUI, etc, etc. I have my own image database and GUI so all
>>> I need is the actual algorithm preferably in pseudo code and not in
>>> the form of a research paper (from which I also found a lot but since
>>> I'm not that much interested in the actual science of image
>>> recognition this seems like an over kill).
>>>
>> I'd recommend SIFT. There's quite a bit of information on SIFT. In most
>> cases, they don't cover the background science too much, but are still
>> heavy on the math. Pseudo code is hard to come by since it will take
>> many lines of pseudo code just to express one concise mathematical
>> equation. There are however many links to implementations in various
>> languages on the Wikipedia page.
>>
>> http://en.wikipedia.org/wiki/Scale-invariant_feature_transform
>>
>> I have had good experiences with SIFT for feature extraction from images
>> (I have used it for panorama stitching and robot mapping). It's
>> insensitive to scale and rotation. Note that it is a patented algorithm
>> and this may (or may not) pose a problem for you.
>>
>
> Thanks for the info! SIFT really looks like a heavy weight solution,
> but do you think the whole concept can be simplified if all I needed
> was: given a photo, find similar ones? I mean SIFT first detects
> objects on the image and find similarities, but I don't need the
> detection part at all, all I care about is similarity for the whole
> photo. I surely don't understand the big picture fully but just have
> the general feeling that SIFT and other expert tools are an overkill
> for me and a simplified version would be just as good with a much more
> easily comprehensible core algorithm.
>
> Or am I being too optimistic and there is no way out of going into the details?
>
Using the histogram of the picture may be good enough for your
application. Here's something I put together for comparing images (for
purposes of detecting motion) taken by the built-in web cam in my
Macbook Pro. This might be good enough if you play with the threshold.
"""
I'm writing a simple little app for doing motion detection with data
output from wacaw, a package for MacOSX. You could easily modify this
script to get data output from some other source.
cd /Applications ; for i in `jot 1024`; do /Applications/wacaw --png
picture-${i} && sleep 3 ; done; open *.png
cd /Applications; open picture-*
"""
# cd /Applications ; for i in `jot 1024`; do /Applications/wacaw --png
picture-${i} && sleep 3 ; done; open *.png
# SOURCE:
http://gumuz.looze.net/wordpress/index.php/archives/2005/06/06/python-webcam-fun-motion-detection/
import os
from time import sleep
import tempfile
import Image
# Sun Mar 18 16:40:51 CDT 2007
def diff_image(img1, img2, pix_threshold=50, img_threshold=4):
"""Compare 2 images to detect possible motion
You might want to choose the img_threshold amount based on the
conditions.
"""
img1 = Image.open(img1)
img2 = Image.open(img2)
if not img1 or not img2: return False
img1 = img1.getdata()
img2 = img2.getdata()
pixel_count = len(img1)
pixdiff = 0
for i in range(pixel_count):
#if abs(sum(img1[i]) - sum(img2[i])) > pix_threshold:
diffval = abs(sum(img1[i]) - sum(img2[i]))
#print "Pixel diffval:",diffval
if diffval > pix_threshold:
pixdiff += 1
diffperc = pixdiff / (pixel_count/100.0)
print "Photo diff percentage:",diffperc
if diffperc > img_threshold:
# motion detected
return True
else:
return False
photos = [] # consider automatically serializing this data
import commands
"""
def analyze_thresholds(list_of_photos):
last = list_of_photos[0]
for photo in list_of_photos[1:]:
diff_image(last, photo)
last = photo
"""
def detect():
number = 0
while True:
number += 1
sleep(3)
current = 'photo-'+str(number)
#tmp = tempfile.mktemp()
print commands.getoutput('/Applications/wacaw --png ' + current
) # ' + tmp +'.png')
# Here's the actual name of the file wacaw created:
current = '/Applications/'+current+'.png'
photos.append( current )
if len(photos) < 2: # pad the list for the first time
photos.append( current )
if diff_image(photos[-1],photos[-2], pix_threshold=50,
img_threshold=5):
print "motion detected"
else:
print "motion NOT detected"
detect()
#import glob
#analyze_thresholds(glob.glob('/Applications/photo-*')
--
Shane Geiger
IT Director
National Council on Economic Education
sgeiger at ncee.net | 402-438-8958 | http://www.ncee.net
Leading the Campaign for Economic and Financial Literacy
More information about the Python-list
mailing list