python Opencv计算图像相似度过程解析


Posted in Python onDecember 03, 2019

这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、相关概念

一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直、大白腿、樱桃唇、瓜子脸。王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你儿子。
还有其他物品、什么桌子带腿、镜子反光能在里面倒影出东西,各种各样的特征,我们通过学习、归纳,自然而然能够很快识别分类出新物品。

而没有学习训练过的机器就没办法了。

但是图像是一个个像素点组成的,我们就可以通过不同图像之间这些差异性就判断两个图的相似度了。其中颜色特征是最常用的,(其余常用的特征还有纹理特征、形状特征和空间关系特征等)
其中又分为

  • 直方图
  • 颜色集
  • 颜色矩
  • 聚合向量
  • 相关图

1、直方图

在Python中利用opencv中的calcHist()方法获取其直方图数据,返回的结果是一个列表,使用matplotlib,画出了这两张图的直方图数据图

import cv2
import numpy
from matplotlib import pyplot
if __name__ == '__main__':
  imgobj1 = cv2.imread('pho.jpg')
  imgobj2 = cv2.imread('ph1.jpg')
  hist1 = cv2.calcHist([imgobj1], [0], None, [256], [0.0, 255.0])
  hist2 = cv2.calcHist([imgobj2], [0], None, [256], [0.0, 255.0])
  pyplot.plot(range(256), hist1, 'r')
  pyplot.plot(range(256), hist2, 'b')
  pyplot.show()
  cv2.imshow('img1',imgobj1)
  cv2.imshow('img2',imgobj2)
  cv2.waitKey(0)

python Opencv计算图像相似度过程解析

1.2 灰度图及作用

灰度图是只含有黑白颜色,和0~255亮度等级的图片。灰度图具有存储小,其亮度值就是256色调色板索引号,从整幅图像的整体和局部的色彩以及亮度等级分布特征来看,灰度图描述与彩色图的描述是一致的特点。因此很多真彩色图片的分析,第一步就是转换为灰度图,然后再进行分析。

真彩色,因为是24位,2(^8) * 2(^8)* 2(^8) = 16777216种颜色,需要调色板16777216 * 4byte字节的空间也就是64MB的调色板空间,所以真彩色是不用调色板的。

例如视频目标跟踪和识别时,第一步就是要转换为灰度图。现有的成熟分析算法多是基于灰度图像的,灰度图像综合了真彩色位图的RGB各通道的信息。

(一):单通道图,

俗称灰度图,每个像素点只能有有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色。(也有3通道的灰度图,3通道灰度图只有一个通道有值,其他两个通道的值都是零)。

(二):三通道图,每个像素点都有3个值表示 ,所以就是3通道。也有4通道的图。例如RGB图片即为三通道图片,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。总之,每一个点由三个值表示。

直方图判断相似度,如上图,就算重合度即可

1.3 图像指纹和汉明距离

图像指纹:

和人的指纹一样,是身份的象征,而图像指纹简单点来讲,就是将图像按照一定的哈希算法,经过运算后得出的一组二进制数字。

汉明距离:

假如一组二进制数据为101,另外一组为111,那么显然把第一组的第二位数据0改成1就可以变成第二组数据111,所以两组数据的汉明距离就为1

简单点说,汉明距离就是一组二进制数据变成另一组数据所需的步骤数,显然,这个数值可以衡量两张图片的差异,汉明距离越小,则代表相似度越高。汉明距离为0,即代表两张图片完全一样。

1.3.1 平均哈希

此算法是基于比较灰度图每个像素与平均值来实现的

一般步骤:

  • 缩放图片,一般大小为8*8,64个像素值。
  • 转化为灰度图
  • 计算平均值:计算进行灰度处理后图片的所有像素点的平均值,直接用numpy中的mean()计算即可。
  • 比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
  • 得到信息指纹:组合64个bit位,顺序随意保持一致性。
  • 最后比对两张图片的指纹,获得汉明距离即可。
import cv2
import numpy as np

img1 = cv2.imread("/absPath.png")
img2 = cv2.imread("./x.png")

#调整到8*8
img1 = cv2.resize(img1,(8,8))
img2 = cv2.resize(img2,(8,8))

#转化为灰度图
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

#获取哈希
hash1 = getHash(gray1)
hash2 = getHash(gray2)

ret = Hamming_distance(hash1,hash2)


# 输入灰度图,返回hash
def getHash(image):
  avreage = np.mean(image) #计算像素平均值
  hash = []
  for i in range(image.shape[0]):
    for j in range(image.shape[1]):
      if image[i, j] > avreage:
        hash.append(1)
      else:
        hash.append(0)
  return hash
# 计算汉明距离
def Hamming_distance(hash1, hash2):
  num = 0
  for index in range(len(hash1)):
    if hash1[index] != hash2[index]:
      num += 1
  return num

1.3.2 感知哈希及d哈希

感知哈希算法(pHash)

平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法

一般步骤:

  • 缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
  • 转化为灰度图
  • 计算DCT:利用Opencv中提供的dct()方法,注意输入的图像必须是32位浮点型,所以先利用numpy中的float32进行转换
  • 缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率
  • 计算平均值:计算缩小DCT后的所有像素点的平均值。
  • 进一步减小DCT:大于平均值记录为1,反之记录为0.
  • 得到信息指纹:组合64个信息位,顺序随意保持一致性。
  • 最后比对两张图片的指纹,获得汉明距离即可。

dHash算法

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。

步骤:

缩小图片:收缩到9*8的大小,以便它有72的像素点

转化为灰度图

计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.
最后比对两张图片的指纹,获得汉明距离即可。

dHash:

#差值感知算法
def dhash(image1,image2):
  image1 = cv2.resize(image1,(9,8))
  image2 = cv2.resize(image2,(9,8))
  gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) #切换至灰度图
  gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
  hash1 = dhashcaulate(gray1)
  hash2 = dhashcaulate(gray2)
  return Hamming_distance(hash1,hash2)
 
def dhashcaulate(gray):
  hash_str = ''
  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 相关文章推荐
python 正则表达式 概述及常用字符
May 04 Python
利用python获取Ping结果示例代码
Jul 06 Python
TensorFlow实现MLP多层感知机模型
Mar 09 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
python实现银联支付和支付宝支付接入
May 07 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
keras多显卡训练方式
Jun 10 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
详解python的xlwings库读写excel操作总结
Feb 26 Python
Python matplotlib绘制雷达图
Apr 13 Python
django 中使用DateTime常用的时间查询方式
Dec 03 #Python
在django中自定义字段Field详解
Dec 03 #Python
python 实现单通道转3通道
Dec 03 #Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 #Python
python3实现elasticsearch批量更新数据
Dec 03 #Python
python实现从wind导入数据
Dec 03 #Python
python 导入数据及作图的实现
Dec 03 #Python
You might like
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
js切换div css注意的细节
2012/12/10 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
安装dbus-python的简要教程
2015/05/05 Python
python语言使用技巧分享
2016/05/31 Python
python如何获取服务器硬件信息
2017/05/11 Python
举例讲解Python常用模块
2019/03/08 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
NumPy排序的实现
2020/01/21 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
如何用python处理excel表格
2020/06/09 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
火山动力Java笔试题
2014/06/26 面试题
境外导游求职信
2014/02/27 职场文书
动员大会主持词
2014/03/20 职场文书
2014年德育工作总结
2014/11/20 职场文书
2014年民政工作总结
2014/11/26 职场文书
员工离职感谢信
2015/01/22 职场文书
关于环保的宣传稿
2015/07/23 职场文书