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 15 Python
pymssql数据库操作MSSQL2005实例分析
May 25 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
python验证码识别实例代码
Feb 03 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
使用python的pyplot绘制函数实例
Feb 13 Python
Python 创建TCP服务器的方法
Jul 28 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 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图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
window.location和document.location的区别分析
2008/12/23 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
js 火狐下取本地路径实现思路
2013/04/02 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
骨干教师培训感言
2014/01/16 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
《锄禾》教学反思
2014/04/08 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
Java设计模式之享元模式示例详解
2022/03/03 Java/Android