zoukankan      html  css  js  c++  java
  • 使用Python的PIL库做的图像相似度对比源码备份

    #!/usr/bin/python
    # Filename: histsimilar.py
    # -*- coding: utf-8 -*-
    
    import PIL.Image
    
    def make_regalur_image(img, size = (256, 256)):
        return img.resize(size).convert('RGB')
    
    def split_image(img, part_size = (64, 64)):
        w, h = img.size
        pw, ph = part_size
        
        assert w % pw == h % ph == 0
        
        return [img.crop((i, j, i+pw, j+ph)).copy() 
                    for i in range(0, w, pw) 
                    for j in range(0, h, ph)]
    
    def hist_similar(lh, rh):
        assert len(lh) == len(rh)
        return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
    
    def calc_similar(li, ri):
    #    return hist_similar(li.histogram(), ri.histogram())
        return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
                
    
    def calc_similar_by_path(lf, rf):
        li, ri = make_regalur_image(PIL.Image.open(lf)), make_regalur_image(PIL.Image.open(rf))
        return calc_similar(li, ri)
    
    def make_doc_data(lf, rf):
        li, ri = make_regalur_image(PIL.Image.open(lf)), make_regalur_image(PIL.Image.open(rf))
        li.save(lf + '_regalur.png')
        ri.save(rf + '_regalur.png')
        fd = open('stat.csv', 'w')
        fd.write('
    '.join(l + ',' + r for l, r in zip(list(map(str, li.histogram())), list(map(str, ri.histogram())))))
    #    print >>fd, '
    '
    #    fd.write(','.join(map(str, ri.histogram())))
        fd.close()
        import ImageDraw
        li = li.convert('RGB')
        draw = ImageDraw.Draw(li)
        for i in range(0, 256, 64):
            draw.line((0, i, 256, i), fill = '#ff0000')
            draw.line((i, 0, i, 256), fill = '#ff0000')
        li.save(lf + '_lines.png')
        
    
    if __name__ == '__main__':
        path = r'testpic/TEST%d/%d.JPG'
        for i in range(1, 8):
            print('test_case_%d: %.3f%%'%(i, 
                calc_similar_by_path('testpic/TEST%d/%d.JPG'%(i, 1), 'testpic/TEST%d/%d.JPG'%(i, 2))*100))
        
    #    make_doc_data('test/TEST4/1.JPG', 'test/TEST4/2.JPG')
  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/zyb2016/p/11090082.html
Copyright © 2011-2022 走看看