Wote用python语言写的imgHash.py

Wote用python语言写的imgHash.py



#!/usr/bin/python
#encoding:utf-8
import sys
import glob
import os
from PIL import Image

EXTS = 'jpg','jpeg','JPG','JPEG','gif','GIF','png','PNG'

def avhash(im):
	if not isinstance(im,Image.Image):
		im = Image.open(im)
	im = im.resize((8,8),Image.ANTIALIAS) #resize image with high-quality
	im = im.convert('L') #L表示灰度
	ida = im.getdata() #return the contents of an image as a sequence objectcontaining pixel values
	#for index,item in enumerate(ida):  
	#	print index,item
	avg = reduce(lambda x,y:x+y,ida)/64 #遍历ida序列求平均数
	mp = map(lambda i:0 if i<avg else 1,im.getdata())
	'''
	reduce函数
	reduce函数,reduce函数会对参数序列中元素进行累积。
	reduce函数的定义:
	reduce(function, sequence[, initial]) -> value
	function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。
	第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。
	reduce(lambda x, y: x + y, [2, 3, 4, 5, 6], 1)
	结果为21(  (((((1+2)+3)+4)+5)+6)  )
	reduce(lambda x, y: x + y, [2, 3, 4, 5, 6])
	结果为20

	注意function函数不能为None。
	'''
	#ret = reduce(lambda x,(y,z):x|(z<<y),enumerate(mp),0)
	print ret
	return ret
	#im.save("aaa.jpg")
#	im = im.resize
'''
11011   i=0
11010 &  
------
11010   i=1
11001 &
------
11000   i=2
10111 &
------
10000   i=3
01111 &
-------
0		i=4

11010 i=0
11001 &
-----
11000 i=1
10111 &
-----
10000 i=2
01111 &
-----
0     i=3


'''
def hamming(h1,h2): 
	h,d = 0,h1^h2
	while d:    #判断h里面有几个1 也就是判断h1,h2中有多少位是不同的
		h+=1
		d&=d-1
	return h

if __name__=='__main__':
	if len(sys.argv)<=1 or len(sys.argv) >3:
		print "Usage: %s image.jpg [dir]" % sys.argv[0]
	else:
		im,wd = sys.argv[1],'.' if len(sys.argv) <3 else sys.argv[2]
		h = avhash(im)
		os.chdir(wd)
		images = []
		for ext in EXTS:
			images.extend(glob.glob('*.%s'%ext))  
		#print images
		seq = []
		prog = int (len(images)>50 and sys.stdout.isatty())
		print prog
		for f in images:
			seq.append((f,hamming(avhash(f),h)))
			if prog:
				perc=100. *prog/len(images)
				x=int(2*prec/5)
				print '\rcalculating...['+'#'*x+' ' *(40-x)+']'
				print '%.2f%%'%prec,'(%d/%d)'%(prog,len(images))
				sys.stdout.flush
				prog+=1
		if prog:print
		for f,ham in sorted(seq,key=lambda i:i[1]):
			print "%d\t%s" %(ham,f)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值