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中你应该知道的一些内置函数
Mar 31 Python
python实现扫描日志关键字的示例
Apr 28 Python
PYTHON基础-时间日期处理小结
May 05 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
Python class的继承方法代码实例
Feb 14 Python
python如何将两张图片生成为全景图片
Mar 05 Python
python与js主要区别点总结
Sep 13 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 Python
Python基础详解之邮件处理
Apr 28 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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实现JS中escape与unescape的方法
2016/07/11 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
详解python-图像处理(映射变换)
2019/03/22 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
灵泰克Java笔试题
2016/01/09 面试题
大学生求职简历的自我评价
2013/10/14 职场文书
初一体育教学反思
2014/01/29 职场文书
开门红主持词
2014/04/02 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
教师求职自荐信
2015/03/26 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers