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中数据解析
May 05 Python
python实现的简单FTP上传下载文件实例
Jun 30 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Python实现注册登录系统
Aug 08 Python
python如何实现反向迭代
Mar 20 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
Python对excel文档的操作方法详解
Dec 10 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python实现批量命名照片
Jun 18 Python
python实现定时发送邮件
Dec 23 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 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版(2)
2006/10/09 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
地震发生中逃生十大法则
2008/05/12 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
PHP实现发送和接收JSON请求
2018/06/07 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
详解python 爬取12306验证码
2019/05/10 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
python suds访问webservice服务实现
2020/06/26 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
文员个人求职自荐信
2013/09/21 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
2014年国庆标语
2014/06/30 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
利用Python实现Picgo图床工具
2021/11/23 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers