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 Django模板的使用方法
Jan 14 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
浅析python递归函数和河内塔问题
Apr 18 Python
python删除某个字符
Mar 19 Python
Python编写一个优美的下载器
Apr 15 Python
python实现可视化动态CPU性能监控
Jun 21 Python
Django框架实现逆向解析url的方法
Jul 04 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
python可视化实现代码
Jan 15 Python
Python秒算24点实现及原理详解
Jul 29 Python
python os.rename实例用法详解
Dec 06 Python
python中的sys模块和os模块
Mar 20 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
一个程序下载的管理程序(一)
2006/10/09 PHP
js代码实现微博导航栏
2015/07/30 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
js选择器全面解析
2016/06/27 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python实现发送email的几种常用方法
2014/08/18 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
python写入已存在的excel数据实例
2018/05/03 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python+mysql实现教务管理系统
2019/02/20 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
建筑文秘专业个人求职信范文
2013/12/28 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang