python 比较2张图片的相似度的方法示例


Posted in Python onDecember 18, 2019

本文介绍了python 比较2张图片的相似度的方法示例,分享给大家,具体如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
 
#均值哈希算法
def aHash(img):
  #缩放为8*8
  img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
  #转换为灰度图
  gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  #s为像素和初值为0,hash_str为hash值初值为''
  s=0
  hash_str=''
  #遍历累加求像素和
  for i in range(8):
    for j in range(8):
      s=s+gray[i,j]
  #求平均灰度
  avg=s/64
  #灰度大于平均值为1相反为0生成图片的hash值
  for i in range(8):
    for j in range(8):
      if gray[i,j]>avg:
        hash_str=hash_str+'1'
      else:
        hash_str=hash_str+'0'
  return hash_str
 
#差值感知算法
def dHash(img):
  #缩放8*8
  img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
  #转换灰度图
  gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  hash_str=''
  #每行前一个像素大于后一个像素为1,相反为0,生成哈希
  for i in range(8):
    for j in range(8):
      if  gray[i,j]>gray[i,j+1]:
        hash_str=hash_str+'1'
      else:
        hash_str=hash_str+'0'
  return hash_str
 
#Hash值对比
def cmpHash(hash1,hash2):
  n=0
  #hash长度不同则返回-1代表传参出错
  if len(hash1)!=len(hash2):
    return -1
  #遍历判断
  for i in range(len(hash1)):
    #不相等则n计数+1,n最终为相似度
    if hash1[i]!=hash2[i]:
      n=n+1
  return n
 
img1=cv2.imread('A.png')
img2=cv2.imread('B.png')
hash1= aHash(img1)
hash2= aHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print '均值哈希算法相似度:'+ str(n)
 
hash1= dHash(img1)
hash2= dHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print '差值哈希算法相似度:'+ str(n)

讲解

相似图像搜索的哈希算法有三种:

  • 均值哈希算法
  • 差值哈希算法
  • 感知哈希算法
  • 均值哈希算法

步骤

缩放:图片缩放为8*8,保留结构,出去细节。
灰度化:转换为256阶灰度图。
求平均值:计算灰度图所有像素的平均值。
比较:像素值大于平均值记作1,相反记作0,总共64位。
生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。顺序不固定。但是比较时候必须是相同的顺序。
对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样的,不相同位数越少,图片越相似。

代码实现: 

#均值哈希算法
def aHash(img):
  #缩放为8*8
  img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
  #转换为灰度图
  gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  #s为像素和初值为0,hash_str为hash值初值为''
  s=0
  hash_str=''
  #遍历累加求像素和
  for i in range(8):
    for j in range(8):
      s=s+gray[i,j]
  #求平均灰度
  avg=s/64
  #灰度大于平均值为1相反为0生成图片的hash值
  for i in range(8):
    for j in range(8):
      if gray[i,j]>avg:
        hash_str=hash_str+'1'
      else:
        hash_str=hash_str+'0'      
  return hash_str

差值哈希算法

差值哈希算法前期和后期基本相同,只有中间比较hash有变化。

步骤
1. 缩放:图片缩放为8*9,保留结构,出去细节。
2. 灰度化:转换为256阶灰度图。
3. 求平均值:计算灰度图所有像素的平均值。
4. 比较:像素值大于后一个像素值记作1,相反记作0。本行不与下一行对比,每行9个像素,八个差值,有8行,总共64位
5. 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。顺序不固定。但是比较时候必须是相同的顺序。
6. 对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样的,不相同位数越少,图片越相似。

#差值感知算法
def dHash(img):
  #缩放8*8
  img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
  #转换灰度图
  gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  hash_str=''
  #每行前一个像素大于后一个像素为1,相反为0,生成哈希
  for i in range(8):
    for j in range(8):
      if  gray[i,j]>gray[i,j+1]:
        hash_str=hash_str+'1'
      else:
        hash_str=hash_str+'0'
  return hash_str

感知哈希算法

感知哈希算法可以参考
相似性︱python+opencv实现pHash算法+hamming距离(simhash)(三)
讲的很详细了。

Hash值对比

由于返回值为str字符串,所以直接遍历字符串进行比对。

#Hash值对比
def cmpHash(hash1,hash2):
  n=0
  #hash长度不同则返回-1代表传参出错
  if len(hash1)!=len(hash2):
    return -1
  #遍历判断
  for i in range(len(hash1)):
    #不相等则n计数+1,n最终为相似度
    if hash1[i]!=hash2[i]:
      n=n+1
  return n

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中类变量与成员变量的使用注意点总结
Apr 29 Python
python smtplib模块自动收发邮件功能(一)
May 22 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python中zip()函数的简单用法举例
Sep 02 Python
初学者学习Python好还是Java好
May 26 Python
利用python汇总统计多张Excel
Sep 22 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 Python
使用Python的Turtle库绘制森林的实例
Dec 18 #Python
python3 requests库实现多图片爬取教程
Dec 18 #Python
在notepad++中实现直接运行python代码
Dec 18 #Python
简单了解python装饰器原理及使用方法
Dec 18 #Python
修改Pandas的行或列的名字(重命名)
Dec 18 #Python
Python3直接爬取图片URL并保存示例
Dec 18 #Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 #Python
You might like
用PHP读取IMAP邮件
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
js实现碰撞检测
2021/01/29 Javascript
python导入模块交叉引用的方法
2019/01/19 Python
浅谈python3中input输入的使用
2019/08/02 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
搞笑征婚广告词
2014/03/17 职场文书
新年主持词
2014/03/27 职场文书
师德演讲稿范文
2014/05/06 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
后备干部推荐材料
2014/12/24 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
千万级用户系统SQL调优实战分享
2022/03/03 MySQL