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 13 Python
Python的gevent框架的入门教程
Apr 29 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
python中while和for的区别总结
Jun 28 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
Python os库常用操作代码汇总
Nov 03 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
django注册用邮箱发送验证码的实现
Apr 18 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python按钮的响应事件详解
2019/03/04 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
考博自荐信
2013/10/25 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
体操比赛口号
2014/06/10 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
花木兰观后感
2015/06/10 职场文书
golang内置函数len的小技巧
2021/07/25 Golang