zoukankan      html  css  js  c++  java
  • 计算图像相似度——《Python也可以》之一

    声明:本文最初发表于赖勇浩(恋花蝶)的博客http://blog.csdn.net/lanphaday

     先将两张图片转化为直方图,图像的相似度计算就转化为直方图的距离计算了,本文依照如下公式进行直方图相似度的定量度量:

    Sim(G,S)=

    其中G,S为直方图,N 为颜色空间样点数

    转换为相应的 Python 代码如下: 

    #!/usr/bin/env python
    # coding=utf-8
    
    import 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 xrange(0,w,pw) for j in xrange(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(Image.open(lf)),make_regalur_image(Image.open(rf))
        return calc_similar(li,ri)
    
    
    
    def make_doc_data(lf,rf):
        li = make_regalur_image(Image.open(lf))
        ri = make_regalur_image(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(map(str,li.histogram()),map(str,ri.histogram()))))
        fd.close()
    
        import ImageDraw
        li = li.convert('RGB')
        draw = ImageDraw.Draw(li)
        for i in xrange(0,256,64):
            draw.line((0,i,256,i),fill ='#F00')
            draw.line((i,0,i,256),fill='#F00')
        li.save(lf+'_lines.png')
    
    if __name__=='__main__':
        path = r'test/TEST%d/%d.JPG'
        for i in xrange(1,7):
            print 'test_case_%d: %.3f%%'%(i,calc_similar_by_path('test/TEST%d/%d.JPG'%(i,1),'test/TEST%d/%d.JPG'%(i,2))*100)
    
        make_doc_data('test/TEST4/1.JPG','test/TEST4/2.JPG')

    参考:

    用Python做图像处理

    计算图像相似度——《Python也可以》之一

    每天一小步,人生一大步!Good luck~
  • 相关阅读:
    SpringBoot 创建 console程序
    SpringBoot 参数检查 Controller中检查参数是否合法
    SpringBoot 使用maven创建springboot项目
    idea 社区版本创建javaweb项目 使用jetty
    idea 社区版本创建javaweb项目 使用tomcat
    mysql 主从 设置
    windows 使用nginx
    Linux 安装Nginx
    闭包小应用
    js小程序写法优化
  • 原文地址:https://www.cnblogs.com/jkmiao/p/4492057.html
Copyright © 2011-2022 走看看