zoukankan      html  css  js  c++  java
  • 感知哈希算法 python 3.4

    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-
    #Less than 10 add to list and sort
    import glob  
    import os  
    import sys  
    from functools import reduce
    from PIL import Image  
      
    EXTS = 'jpg', 'jpeg', 'JPG', 'JPEG', 'gif', 'GIF', 'png' 
      
    def avhash(im):  
        if not isinstance(im, Image.Image):  
            im = Image.open(im)  
        if im.mode=='RGBA':
            im=ConvertRBGA(im)
        im = im.resize((8, 8), Image.ANTIALIAS).convert('L')  
        avg = reduce(lambda x, y: x + y, im.getdata()) / 64.0
        return reduce(lambda x, y_z:  x | (y_z[1] << y_z[0]),  enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())), 0)  
      
    def hamming(h1, h2):  
        h, d = 0, h1 ^ h2  
        while d:  
            h += 1  
            d &= d - 1  
        return h 
     
    def ConvertRBGA(img):
        x,y = img.size  
        #   # (alpha band as paste mask).    
        p = Image.new('RGBA', img.size, (255,255,255))   
        p.paste(img, (0, 0, x, y),img)   
        return p
    
    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]  
            im, wd = 'gs6.png', '.' 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))  
      
            seq = []  
            prog = int(len(images) > 50 and sys.stdout.isatty())  
            for f in images:  
                result=avhash(f)
                seq.append((f, hamming(result, h)))  
                if prog:  
                    perc = 100. * prog / len(images)  
                    x = int(2 * perc / 5)  
                    print ('
    Calculating... [' + '#' * x + ' ' * (40 - x) + ']'),  
                    print ('%.2f%%' % perc, '(%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	%s" % (ham, f))  
  • 相关阅读:
    java的类继承(与c++对比)
    java的数据类型、自动拆装箱、字面量
    java中关键字static和final
    JVM之JIT
    java之JIT(Just in time)
    栈和堆
    C++中vector的使用
    canvas
    ajax笔记
    CSS笔记
  • 原文地址:https://www.cnblogs.com/daxiongblog/p/5718213.html
Copyright © 2011-2022 走看看