python 图片相似度算法比较_python 比较2张图片的相似度的方法示例
本文介绍了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张图片的相似度的方法示例相关推荐
- python合并两个有序列表_Python实现合并两个有序链表的方法示例
本文实例讲述了Python实现合并两个有序链表的方法.分享给大家供大家参考,具体如下: 思路:先选出第一个节点,然后遍历两个链表,把小的作为当前节点的下一个节点,一直到其中一个链表遍历完,这时候把另一 ...
- python除法保留两位小数_Python对小数进行除法运算的正确方法示例
Python对小数进行除法运算的正确方法示例 求一个算式 代码如下: a=1 b=2 c=3 print c*(a/b) 运行结果总是0,反复检查拆开以后,发现在Python里,整数初整数,只能得出整 ...
- python图片识别是否p过_Python+Opencv进行识别相似图片
标签:在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在 ...
- python图片直接保存到远端_Python实现获取本地及远程图片大小的方法示例
本文实例讲述了Python实现获取本地及远程图片大小的方法.分享给大家供大家参考,具体如下: 了解过Pillow的都知道,Pillow是一个非常强大的图片处理器,这篇文章主要记录一下Pillow对图片 ...
- python更改图片中物体的颜色_Python实现去除图片中指定颜色的像素功能示例
Python实现去除图片中指定颜色的像素功能示例 本文实例讲述了Python实现去除图片中指定颜色的像素功能.分享给大家供大家参考,具体如下: 这里用python去除图片白色像素 需要python和p ...
- python判断天数_Python计算两个日期相差天数的方法示例
本文实例讲述了Python计算两个日期相差天数的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput() ...
- python把坐标写入文本_Python实现将数据写入netCDF4中的方法示例
本文实例讲述了Python实现将数据写入netCDF4中的方法.分享给大家供大家参考,具体如下: nc文件为处理气象数据文件.用户可以去https://www.lfd.uci.edu/~gohlke/ ...
- python增加一列数据_Python编程给numpy矩阵添加一列方法示例
首先我们有一个数据是一个mn的numpy矩阵现在我们希望能够进行给他加上一列变成一个m(n+1)的矩阵 import numpy as np a = np.array([[1,2,3],[4,5,6] ...
- python socks代理_Python中使用socks5设置全局代理的方法示例
0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...
最新文章
- golang image.image 转文件流_Kuiper 1.0.2 正式发布 超轻量 IoT 边缘流处理
- pandas groupby 分组操作
- Error APICloud iOS null is not an object
- rda8955平台搭建摘要截图
- (第一篇)FFilmation Glossary 术语
- iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理
- c语言结构体在内存中的存储,C语言结构体在内存中的存储情况探究------内存对齐...
- 罗永浩担任“大局官”,小米双十一狂发补贴
- linux下的C语言开发(自动编译工具和config.h文件生成)
- 2019腾讯广告算法大赛 决赛 Rank16解决方案
- vivo手机解锁工具_vivo正式官宣APEX 2020概念手机!或将实现全面屏指纹解锁
- 实时计算之storm
- 基于java小区物业管理系统
- 四 实例 图像的手绘效果
- 普通文档怎么换成php,wps只读文档怎么修改为普通文档
- 基于Node.js的3DTiles三维倾斜摄影模型爬虫
- 【C语言】大厂指针笔试题(1码+1图)详解——程序结果判断题
- 关于大数据,需要你读懂的10个小故事
- win10分屏设置壁纸+获取win10锁屏壁纸
- 计算机操作系统教程 2 操作系统概述
热门文章
- java 鼠标拖动画矩形_java怎么实现鼠标在桌面拖动过程中 画 矩形的 功能?
- api arx autocad_AutoCAD ObjectARX(VC)开发基础与实例教程 此书是利用ObjectARX对AutoCAD二次开发的教程 - 下载 - 搜珍网...
- pdol链接mysql_MySQL5.7.11免安装版的安装和配置:解决MYSQL服务无法启动问题
- Oracle(三)多行函数
- android广播代码汇总一__无序广播
- imageview获取宽高
- php 调用cron jobs,在CentOS 6.4中使用CronJobs执行PHP不起作用?
- 基于JAVA+SpringMVC+Mybatis+MYSQL的政务信息管理系统
- jQuery插件定义
- ant Design表单验证笔记