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中的cookielib模拟登录网站
Apr 09 Python
python复制文件的方法实例详解
May 22 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Python3实现的画图及加载图片动画效果示例
Jan 19 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python中的枚举类型示例介绍
Jan 09 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
python实现计算图形面积
Feb 22 Python
python库sklearn常用操作
Aug 23 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
Vue实现简易计算器
2020/02/25 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
给Python初学者的一些编程技巧
2015/04/03 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
对python:print打印时加u的含义详解
2018/12/15 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python实现文法左递归的消除方法
2020/05/22 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
化学相关工作求职信
2013/10/02 职场文书
幼师专业求职推荐信
2013/11/08 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
Python OpenCV 图像平移的实现示例
2021/06/04 Python
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers