一、相关概念

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

但是图像是一个个像素点组成的,我们就可以通过不同图像之间这些差异性就判断两个图的相似度了。其中颜色特征是最常用的,(其余常用的特征还有纹理特征、形状特征和空间关系特征等) 其中又分为 直方图 颜色集 颜色矩 聚合向量 相关图 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)

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 复杂数据相似度计算_Opencv python图像处理-图像相似度计算相关推荐

  1. python实现数据可视化_使用Matplotib python实现数据可视化

    python实现数据可视化 I Feel: 我觉得: In today's digital world data has become as important as air. Machines &a ...

  2. python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  3. python matplotlib数据可视化教程_matplotlib的Python数据可视化和探索——入门指南

    matplotlib--最受欢迎的Python库,用于数据可视化和探索 我喜欢在Python中使用matplotlib.这是我学会掌握的第一个可视化库,此后一直存在.matplotlib是最受欢迎的用 ...

  4. 【蓝桥杯选拔赛真题22】python输出数据 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

    目录 python输出数据 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  5. 深入学习图像处理——图像相似度算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  6. matlab图片差异度的比较,Matlab进行图像相似度比较,使用欧式距离

    实验内容在网上或者提前准备10张(或以上)图像,使用matlab提取图像直方图特征并进行显示:将图像特征进行保存(保存为矩阵形式.mat格式),并进行图像相似度比较(使用欧式距离).clear,clc ...

  7. 23、python对数据进行求和、方差、平均值等基本统计指标计算

    基本统计分析:描述性统计分析,用来概括失误整体状况以及事物间联系,以便发现其内在的规律的统计分析方法 常用的统计指标: 计数 求和 平均值 方差 标准差 1  函数 描述性统计函数: describe ...

  8. python分析数据的相关性_使用Python进行相关性分析

    在数据分析时,经常会针对两个变量进行相关性分析.在 Python 中主要用到的方法是pandas中的corr()方法. corr():如果由数据框调用corr函数,那么将会计算每个列两两之间的相似度, ...

  9. python将数据做直方图_用python 制作直方图

    利用jupyter notebook 软件制作 一.导入文件 方法1: 打开电脑命令符,直接输入jupyter notebook 电脑在浏览器下直接打开 jupyter notebook界面 点击up ...

最新文章

  1. Android 应用性能优化-StrictMode(严格模式)
  2. iOS之UI--涂鸦画板实例
  3. 手动脱Mole Box壳实战总结
  4. 首发:徐亦达老师的机器学习课件及下载(中文目录)
  5. BeanPostProcessor使用心得
  6. accept标头 php,解决PHP中缺少“授权”请求标头的问题
  7. 103_Power Pivot 透视表中空白标签处理及百分比
  8. nginx配置文件结构
  9. Linux根目录下的各个子目录的作用
  10. 《DOOM启示录》读书感
  11. npstion实现通过手机扫描二维码向电脑录入信息
  12. python爬虫之bs4解析和xpath解析
  13. u大师u盘装系统win7_U盘启动联想ThinkPad E450 20DCA026CD重装win7系统教程分享
  14. PloneBook中文版
  15. java 相关论坛或网站
  16. 小强升职记:时间管理故事书
  17. 微型计算机接口与技术期末,北邮《微机原理与接口技术》期末复习题(含答案).doc...
  18. 2019.08.20【NOIP提高组】模拟 B 组 排序、DP+递推、矩阵乘法+数位DP/类欧
  19. 数据挖掘:R语言关联规则挖掘
  20. IT专业人士的可靠远程桌面软件丨Radmin功能简介

热门文章

  1. Android图形之HWC(二十四)
  2. VMware虚拟机(Ubuntu)添加物理串口
  3. Android 开机优化
  4. 应该怎样学习新知识?
  5. Linux的i2c驱动详解
  6. OpenLayers之官网实例
  7. 树莓派之Ubuntu安装远程桌面
  8. go语言学习之helloword
  9. CVPR学习(一):CVPR2019-人脸方向
  10. 34个省级行政区简图_全国23个省中,为什么广东要分为21个地级市?今天总算知道了...