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字典基本操作实例分析
Jul 11 Python
深入理解python try异常处理机制
Jun 01 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
python与字符编码问题
May 24 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
python django生成迁移文件的实例
Aug 31 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 Python
Python Selenium库的基本使用教程
Jan 04 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
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
php简单实现数组分页的方法
2016/04/30 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
js select option对象小结
2013/12/20 Javascript
js中运算符&& 和 || 的使用记录
2014/08/21 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
python的launcher用法知识点总结
2020/08/07 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
党校自我鉴定范文
2013/10/02 职场文书
如何写你的创业计划书
2014/01/07 职场文书
领导检查欢迎词
2014/01/14 职场文书
庆八一活动方案
2014/01/25 职场文书
刊首寄语大全
2014/04/11 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
党小组意见范文
2015/06/08 职场文书
在职证明格式样本
2015/06/15 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS