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通过yield实现数组全排列的方法
Mar 18 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
详解Python 函数如何重载?
Apr 23 Python
详解python 爬取12306验证码
May 10 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
Python Pandas常用函数方法总结
Jun 15 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学习之数据类型之间的转换代码
2011/05/29 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
js对象的复制继承实例
2015/01/10 Javascript
初识Javascript小结
2015/07/16 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
python实现周期方波信号频谱图
2018/07/21 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
python psutil监控进程实例
2019/12/17 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
基于Python测试程序是否有错误
2020/05/16 Python
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
小班评语大全
2014/05/04 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL