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类的基础入门知识
Nov 24 Python
Python中的with...as用法介绍
May 28 Python
python线程、进程和协程详解
Jul 19 Python
浅谈Python NLP入门教程
Dec 25 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
python实现五子棋游戏
Jun 18 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
python Django 反向访问器的外键冲突解决
May 20 Python
python程序需要编译吗
Jun 19 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 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
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
Python学习资料
2007/02/08 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
对Python 语音识别框架详解
2018/12/24 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
python中selenium库的基本使用详解
2020/07/31 Python
python 如何区分return和yield
2020/09/22 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
移风易俗倡议书
2014/04/15 职场文书
区级文明单位申报材料
2014/05/15 职场文书
宣传标语大全
2014/07/01 职场文书
学校四风对照检查材料
2014/08/28 职场文书
党支部培养考察意见
2015/06/02 职场文书
返乡农民工证明
2015/06/24 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android