Revision: 6327
Author: multichill
Date: 2009-02-05 22:22:41 +0000 (Thu, 05 Feb 2009)
Log Message:
-----------
Program to match images based on histograms.
This is just a first version so that other people can play around with it.
Expect the code to change a lot!
Added Paths:
-----------
trunk/pywikipedia/match_images.py
Added: trunk/pywikipedia/match_images.py
===================================================================
--- trunk/pywikipedia/match_images.py (rev 0)
+++ trunk/pywikipedia/match_images.py 2009-02-05 22:22:41 UTC (rev 6327)
@@ -0,0 +1,184 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+'''
+Program to match two images based on histograms.
+
+Usage:
+match_images.py ImageA ImageB
+
+This is just a first version so that other people can play around with it.
+Expect the code to change a lot!
+
+'''
+#
+# (C) Multichill, 2009
+#
+# Distributed under the terms of the MIT license.
+#
+__version__ = '$Id$'
+
+import sys, math, StringIO
+import wikipedia, config
+from PIL import Image
+
+def matchImagePages(imagePageA, imagePageB):
+ '''
+ This functions expects two image page objects.
+ It will return True if the image are the same and False if the images are not the same
+ '''
+
+ imageA = getImageFromImagePage(imagePageA)
+ imageB = getImageFromImagePage(imagePageB)
+
+ (imA_width, imA_height) = imageA.size
+ (imB_width, imB_height) = imageB.size
+
+ imageB = imageB.resize((imA_width, imA_height))
+
+ imageA_topleft = imageA.crop((0,0, int(imA_width/2), int(imA_height/2)))
+ imageB_topleft = imageB.crop((0,0, int(imA_width/2), int(imA_height/2)))
+
+ imageA_topright = imageA.crop((int(imA_width/2),0, imA_width, int(imA_height/2)))
+ imageB_topright = imageB.crop((int(imA_width/2),0, imA_width, int(imA_height/2)))
+
+ imageA_bottomleft = imageA.crop((0, int(imA_height/2), int(imA_width/2), imA_height))
+ imageB_bottomleft = imageB.crop((0, int(imA_height/2), int(imA_width/2), imA_height))
+
+ imageA_bottomright = imageA.crop((int(imA_width/2),int(imA_height/2), imA_width, imA_height))
+ imageB_bottomright = imageB.crop((int(imA_width/2),int(imA_height/2), imA_width, imA_height))
+
+ imageA_center = imageA.crop((int(imA_width * 0.25), int(imA_height * 0.25), int(imA_width * 0.75), int(imA_height * 0.75)))
+ imageB_center = imageB.crop((int(imA_width * 0.25), int(imA_height * 0.25), int(imA_width * 0.75), int(imA_height * 0.75)))
+
+ wholeScore = matchImages(imageA, imageB)
+ topleftScore = matchImages(imageA_topleft, imageB_topleft)
+ toprightScore = matchImages(imageA_topright, imageB_topright)
+ bottomleftScore = matchImages(imageA_bottomleft, imageB_bottomleft)
+ bottomrightScore = matchImages(imageA_bottomright, imageB_bottomright)
+ centerScore = matchImages(imageA_center, imageB_center)
+ averageScore = (wholeScore + topleftScore + toprightScore + bottomleftScore + bottomrightScore + centerScore)/6
+
+ print u'Whole image ' + str(wholeScore)
+ print u'Top left of image ' + str(topleftScore)
+ print u'Top right of image ' + str(toprightScore)
+ print u'Bottom left of image ' + str(bottomleftScore)
+ print u'Bottom right of image ' + str(bottomrightScore)
+ print u'Center of image ' + str(centerScore)
+ print u' -------------'
+ print u'Average ' + str(averageScore)
+
+ # Hard coded at 80%, change this later on.
+ if ((averageScore*100) > 80):
+ print u'We have a match!'
+ return True
+ else:
+ print u'Not the same.'
+ return False
+
+def getImageFromImagePage(imagePage):
+ '''
+ Get the image object to work based on an imagePage object
+ '''
+ imageURL=imagePage.fileUrl()
+ imageURLopener= wikipedia.MyURLopener()
+ imageWebFile = imageURLopener.open(imageURL)
+ imageBuffer = StringIO.StringIO(imageWebFile.read())
+ image = Image.open(imageBuffer)
+
+ return image
+
+def matchImages(imageA, imageB):
+ '''
+ Match two image objects. Return the ratio of pixels that match
+ '''
+ histogramA = imageA.histogram()
+ histogramB = imageB.histogram()
+
+ totalMatch = 0
+ totalPixels = 0
+
+ if not (len(histogramA)==len(histogramB)):
+ return 0
+
+ for i in range(0, len(histogramA)):
+ totalMatch = totalMatch + min(histogramA[i], histogramB[i])
+ totalPixels = totalPixels + max(histogramA[i], histogramB[i])
+
+ if (totalPixels==0):
+ return 0;
+
+ return float(totalMatch)/float(totalPixels)*100
+
+
+
+def main():
+ site = wikipedia.getSite(u'commons', u'commons')
+
+ #Array of images to work on
+ images = []
+ imageTitleA = u''
+ imageTitleB = u''
+ familyA = u''
+ familyB = u''
+ langA = u''
+ langB = u''
+ imagePageA = None
+ imagePageB = None
+
+ for arg in wikipedia.handleArgs():
+ if arg.startswith('-familyA:'):
+ if len(arg) == len('-familyA:'):
+ familyA = wikipedia.input(u'What family do you want to use?')
+ else:
+ familyA = arg[len('-familyA:'):]
+ elif arg.startswith('-familyB:'):
+ if len(arg) == len('-familyB:'):
+ familyB = wikipedia.input(u'What family do you want to use?')
+ else:
+ familyB = arg[len('-familyB:'):]
+ elif arg.startswith('-langA:'):
+ if len(arg) == len('-langA:'):
+ langA = wikipedia.input(u'What language do you want to use?')
+ else:
+ langA = arg[len('-langA:'):]
+ elif arg.startswith('-langB:'):
+ if len(arg) == len('-langB:'):
+ langB = wikipedia.input(u'What language do you want to use?')
+ else:
+ langB = arg[len('langB:'):]
+ else:
+ images.append(arg)
+
+ if not (len(images)==2):
+ raise wikipedia.Error, 'require two images to work on.'
+ else:
+ imageTitleA=images[0]
+ imageTitleB=images[1]
+
+ if not (imageTitleA == u''):
+ if not (langA == u''):
+ if not (familyA == u''):
+ imagePageA = wikipedia.ImagePage(wikipedia.getSite(langA, familyA), imageTitleA)
+ else:
+ imagePageA = wikipedia.ImagePage(wikipedia.getSite(langA, u'wikipedia'), imageTitleA)
+ else:
+ imagePageA = wikipedia.ImagePage(wikipedia.getSite(u'commons', u'commons'), imageTitleA)
+
+ if not (imageTitleB == u''):
+ if not (langB == u''):
+ if not (familyB == u''):
+ imagePageB = wikipedia.ImagePage(wikipedia.getSite(langB, familyB), imageTitleB)
+ else:
+ imagePageB = wikipedia.ImagePage(wikipedia.getSite(langB, u'wikipedia'), imageTitleB)
+ else:
+ imagePageB = wikipedia.ImagePage(wikipedia.getSite(u'commons', u'commons'), imageTitleB)
+
+ if (imagePageA and imagePageB):
+ matchImagePages(imagePageA, imagePageB)
+
+
+if __name__ == "__main__":
+ try:
+ main()
+ finally:
+ wikipedia.stopme()
Property changes on: trunk/pywikipedia/match_images.py
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native