Python比较两个图片相似度的方法


Posted in Python onMarch 13, 2015

本文实例讲述了Python比较两个图片相似度的方法。分享给大家供大家参考。具体分析如下:

这段代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的,前提是图片要大一些,太小的图片不好比较。附件提供完整测试代码和对比用的图片。

#!/usr/bin/python

# Filename: histsimilar.py

# -*- 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, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))

    li.save(lf + '_regalur.png')

    ri.save(rf + '_regalur.png')

    fd = open('stat.csv', 'w')

    fd.write('\n'.join(l + ',' + r for l, r in zip(map(str, li.histogram()), map(str, ri.histogram()))))

#   print >>fd, '\n'

#   fd.write(','.join(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 = '#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 xrange(1, 7):

        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')

完整实例代码点击此处本站下载。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
分析python服务器拒绝服务攻击代码
Jan 16 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
学习python 之编写简单乘法运算题
Feb 27 Python
使用Python对SQLite数据库操作
Apr 06 Python
Python加载带有注释的Json文件实例
May 23 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
浅谈flask源码之请求过程
Jul 26 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
Python如何实现强制数据类型转换
Nov 22 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
python通过urllib2获取带有中文参数url内容的方法
Mar 13 #Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 #Python
python通过正则查找微博@(at)用户的方法
Mar 13 #Python
python使用chardet判断字符串编码的方法
Mar 13 #Python
python根据时间生成mongodb的ObjectId的方法
Mar 13 #Python
python实现根据窗口标题调用窗口的方法
Mar 13 #Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 #Python
You might like
php中变量及部分适用方法
2008/03/27 PHP
PHP分页类集锦
2014/11/18 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
Js动态创建div
2008/09/25 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
js电话号码验证方法
2015/09/28 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
python实现解数独程序代码
2017/04/12 Python
Python 异常处理的实例详解
2017/09/11 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
高中毕业生生活的自我评价
2013/12/08 职场文书
2014年工程师工作总结
2014/11/25 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
工程部部长岗位职责
2015/02/12 职场文书
清洁工岗位职责
2015/02/13 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python
MySQL数据库简介与基本操作
2022/05/30 MySQL