本文介绍了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 比较2张图片的相似度的方法示例

本文地址: http://www.cppcns.com/jiaoben/python/293596.html

python 图片相似度算法比较_python 比较2张图片的相似度的方法示例相关推荐

  1. python合并两个有序列表_Python实现合并两个有序链表的方法示例

    本文实例讲述了Python实现合并两个有序链表的方法.分享给大家供大家参考,具体如下: 思路:先选出第一个节点,然后遍历两个链表,把小的作为当前节点的下一个节点,一直到其中一个链表遍历完,这时候把另一 ...

  2. python除法保留两位小数_Python对小数进行除法运算的正确方法示例

    Python对小数进行除法运算的正确方法示例 求一个算式 代码如下: a=1 b=2 c=3 print c*(a/b) 运行结果总是0,反复检查拆开以后,发现在Python里,整数初整数,只能得出整 ...

  3. python图片识别是否p过_Python+Opencv进行识别相似图片

    标签:在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在 ...

  4. python图片直接保存到远端_Python实现获取本地及远程图片大小的方法示例

    本文实例讲述了Python实现获取本地及远程图片大小的方法.分享给大家供大家参考,具体如下: 了解过Pillow的都知道,Pillow是一个非常强大的图片处理器,这篇文章主要记录一下Pillow对图片 ...

  5. python更改图片中物体的颜色_Python实现去除图片中指定颜色的像素功能示例

    Python实现去除图片中指定颜色的像素功能示例 本文实例讲述了Python实现去除图片中指定颜色的像素功能.分享给大家供大家参考,具体如下: 这里用python去除图片白色像素 需要python和p ...

  6. python判断天数_Python计算两个日期相差天数的方法示例

    本文实例讲述了Python计算两个日期相差天数的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput() ...

  7. python把坐标写入文本_Python实现将数据写入netCDF4中的方法示例

    本文实例讲述了Python实现将数据写入netCDF4中的方法.分享给大家供大家参考,具体如下: nc文件为处理气象数据文件.用户可以去https://www.lfd.uci.edu/~gohlke/ ...

  8. python增加一列数据_Python编程给numpy矩阵添加一列方法示例

    首先我们有一个数据是一个mn的numpy矩阵现在我们希望能够进行给他加上一列变成一个m(n+1)的矩阵 import numpy as np a = np.array([[1,2,3],[4,5,6] ...

  9. python socks代理_Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...

最新文章

  1. golang image.image 转文件流_Kuiper 1.0.2 正式发布 超轻量 IoT 边缘流处理
  2. pandas groupby 分组操作
  3. Error APICloud iOS null is not an object
  4. rda8955平台搭建摘要截图
  5. (第一篇)FFilmation Glossary 术语
  6. iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理
  7. c语言结构体在内存中的存储,C语言结构体在内存中的存储情况探究------内存对齐...
  8. 罗永浩担任“大局官”,小米双十一狂发补贴
  9. linux下的C语言开发(自动编译工具和config.h文件生成)
  10. 2019腾讯广告算法大赛 决赛 Rank16解决方案
  11. vivo手机解锁工具_vivo正式官宣APEX 2020概念手机!或将实现全面屏指纹解锁
  12. 实时计算之storm
  13. 基于java小区物业管理系统
  14. 四 实例 图像的手绘效果
  15. 普通文档怎么换成php,wps只读文档怎么修改为普通文档
  16. 基于Node.js的3DTiles三维倾斜摄影模型爬虫
  17. 【C语言】大厂指针笔试题(1码+1图)详解——程序结果判断题
  18. 关于大数据,需要你读懂的10个小故事
  19. win10分屏设置壁纸+获取win10锁屏壁纸
  20. 计算机操作系统教程 2 操作系统概述

热门文章

  1. java 鼠标拖动画矩形_java怎么实现鼠标在桌面拖动过程中 画 矩形的 功能?
  2. api arx autocad_AutoCAD ObjectARX(VC)开发基础与实例教程 此书是利用ObjectARX对AutoCAD二次开发的教程 - 下载 - 搜珍网...
  3. pdol链接mysql_MySQL5.7.11免安装版的安装和配置:解决MYSQL服务无法启动问题
  4. Oracle(三)多行函数
  5. android广播代码汇总一__无序广播
  6. imageview获取宽高
  7. php 调用cron jobs,在CentOS 6.4中使用CronJobs执行PHP不起作用?
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的政务信息管理系统
  9. jQuery插件定义
  10. ant Design表单验证笔记