两张图片相似度匹配算法学习路线

大纲:​​​​​​目标跟踪基础:两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com)

目标跟踪基础:两张图片相似度算法 (qq.com)

一、传统方法

1.欧式距离(用于判断是否完全相同)

[三维重建] [机器学习] 图片相似度_评价两张图片相似度或差异度的指标是-CSDN博客

import numpy as npdef euclidean_distance(image1, image2):# 将图片展平为一维向量vector1 = image1.flatten()vector2 = image2.flatten()# 计算欧式距离distance = np.linalg.norm(vector1 - vector2)return distance# 示例用法
image1 = np.array([[1, 2, 3], [4, 5, 6]])
image2 = np.array([[4, 5, 6], [7, 8, 9]])
distance = euclidean_distance(image1, image2)
print(distance)

缺点:只考虑了像素差异,没有考虑位置和形状。

2.余弦相似度

from PIL import Imagefrom numpy import average, linalg, dotdef get_thumbnail(image, size=(1200, 750), greyscale=False):image = image.resize(size, Image.ANTIALIAS)if greyscale:image = image.convert('L')return imagedef image_similarity_vectors_via_numpy(image1, image2):image1 = get_thumbnail(image1)image2 = get_thumbnail(image2)images = [image1, image2]vectors = []norms = []for image in images:vector = []for pixel_tuple in image.getdata():vector.append(average(pixel_tuple))vectors.append(vector)norms.append(linalg.norm(vector, 2))a, b = vectorsa_norm, b_norm = normsres = dot(a / a_norm, b / b_norm)return resimage1 = Image.open('1.jpg')image2 = Image.open('2.jpg')cosin = image_similarity_vectors_via_numpy(image1, image2)print(cosin)

3.哈希算法/汉明距离

详细步骤 + 代码 :图像相似度中的Hash算法 - Yumeka - 博客园 (cnblogs.com)

(1)ahash(Average Hash,均值哈希算法)

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

一般步骤:

1.缩放图片,一般大小为8*8,64个像素值。

2.转化为灰度图

3.计算平均值:计算进行灰度处理后图片的所有像素点的平均值,直接用numpy中的mean()计算即可。

4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.

5.得到信息指纹:组合64个bit位,顺序随意保持一致性。

6.最后比对两张图片的指纹,获得汉明距离即可。

#均值哈希算法def aHash(img):#缩放为8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#转换为灰度图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素和初值为0,hash_str为hash值初值为''s=0hash_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

(2)phash(Perceptual Hash,感知哈希算法)

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

一般步骤:

1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算

2.转化为灰度图

3.计算DCT:利用Opencv中提供的dct()方法,注意输入的图像必须是32位浮点型,所以先利用numpy中的float32进行转换

4.缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率

5.计算平均值:计算缩小DCT后的所有像素点的平均值。

6.进一步减小DCT:大于平均值记录为1,反之记录为0.

7.得到信息指纹:组合64个信息位,顺序随意保持一致性。

8.最后比对两张图片的指纹,获得汉明距离即可。

import cv2import numpy as npfrom compiler.ast import flattenimport sysdef pHash(imgfile):"""get image pHash value"""#加载并调整图片为32x32灰度图片img=cv2.imread(imgfile, 0)img=cv2.resize(img,(64,64),interpolation=cv2.INTER_CUBIC)#创建二维列表h, w = img.shape[:2]vis0 = np.zeros((h,w), np.float32)vis0[:h,:w] = img       #填充数据#二维Dct变换vis1 = cv2.dct(cv2.dct(vis0))#cv.SaveImage('a.jpg',cv.fromarray(vis0)) #保存图片vis1.resize(32,32)#把二维list变成一维listimg_list=flatten(vis1.tolist())#计算均值avg = sum(img_list)*1./len(img_list)avg_list = ['0' if i<avg else '1' for i in img_list]#得到哈希值return ''.join(['%x' % int(''.join(avg_list[x:x+4]),2) for x in range(0,32*32,4)])'''
cv2.imread
flags>0时表示以彩色方式读入图片
flags=0时表示以灰度图方式读入图片
flags<0时表示以图片的本来的格式读入图片
interpolation - 插值方法。共有5种:
1)INTER_NEAREST - 最近邻插值法
2)INTER_LINEAR - 双线性插值法(默认)
3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

(3)dhash(Difference Hash,差异哈希算法)

def dHash(img):#缩放8*8img=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

总结: 

图像均值(ahash)哈希本质上是对像素(颜色)的比较
图像感知(phash)哈希由于做了离散余弦变换操作,本质上是对频率的比较
图像差异(dhash)哈希本质上是基于变化的感知,更关注图片的像素值的变化 

4.直方图 + 巴氏系数

(1)直方图

直方图是描述一个图片中,颜色出现的次数(或频率)的一种统计图象,因为只关心某个像素值出现的次数,不关注像素值的位置,所以具有旋转、平移、缩放等不变性。且计算代价较小,只需要遍历整个图像就能得到。

直方图的横坐标为某个像素值,纵坐标为像素值在图片内出现的次数,如下图所示的图片矩阵中,像素值“1”出现了两次,所以该图片的直方图中,像素值“1”对应的纵坐标就该是2。

有时候为了避免图片分辨率造成的影响,(分辨率高的图像,像素个数肯定多,出现次数肯定多),会将出现次数除以图片的总像素个数,转化成出现概率。如上图中的图片矩阵的总像素个数是9,像素值“1”的出现次数是2,它的出现概率为 2 / 9。

直方图分为灰度直方图与RGB直方图

灰度直方图:对于灰度直方图,只需要维护一个长度为256的数组Gray[256],遍历图片矩阵,假设矩阵内某个位置的像素值为124,则Gray[124]++。

RGB直方图:如果每种原色都可以取256个值,那么整个颜色空间共有1600万种颜色(256的三次方)。针对这1600万种颜色比较直方图,计算量实在太大了,因此可以通过划分bin的方式进行简化。可以将0~255分成四个区:0~63为第0区,64~127为第1区,128~191为第2区,192~255为第3区。这意味着红绿蓝分别有4个区,总共可以构成64种组合(4的3次方)。再根据图片矩阵中某个位置的RGB值,决定直方图内哪个bin值加一。

直方图最终也可以表示成一个向量的形式,向量维数为直方图横坐标的个数,向量中的值为直方图纵坐标的值。A=(2,3,2,1,0,1)

(2)巴氏系数

5.特征结构

6.互信息 

7. 均方误差(MSE)

 8.SSIM结构相似性

9.特征匹配 

10.传统方法总结代码

opencv 简单的图片相似度匹配_opencv 图片相似度-CSDN博客

图像相似算法最全总结_图片相似度-CSDN博客

二、深度学习方法

1.孪生神经网络

pytorch孪生网络识别面部相似度代码解读_f.pairwise_distance-CSDN博客

 孪生网络:图片相似度对比神器-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DC电源模块的设计与调试技巧

BOSHIDA DC电源模块的设计与调试技巧 DC电源模块的设计与调试是电子工程师在实际项目中常常需要面对的任务。一个稳定可靠的DC电源模块对于电路的正常运行起到至关重要的作用。以下是一些设计与调试的技巧&#xff0c;帮助工程师们更好地完成任务。 第一&#xff0c;正确选择…

如何简化多个 if 的判断结构

多少算太多&#xff1f; 有些人认为数字就是一&#xff0c;你应该总是用至少一个三元运算符来代替任何单个 if 语句。我并不这样认为&#xff0c;但我想强调一些摆脱常见的 if/else 意大利面条代码的方法。 我相信很多开发人员很容易陷入 if/else 陷阱&#xff0c;不是因为其…

git的使用日常习惯规范与一些特殊操作

git的使用日常习惯规范与一些特殊操作 操作习惯规范创建本地新分支&#xff0c;推送新分支到云端仓库1.创建一个本地的login分支2.创建新分支后切换到新分支3.推送新分支到云端 git的特殊操作撤回commit&#xff08;取消提交到本地版本库的动作&#xff0c;本地工作区写的代码不…

鸿蒙开发(七)-UIAbility启动模式

鸿蒙开发(七)-启动模式 根据代码中定义,UIAbility的启动模式有以下几种&#xff1a; "launchType": {"description": "Indicates the boot mode of ability.","type": "string","enum": ["standard",…

springboot点餐平台网站

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

Django(二)-搭建第一个应用(1)

一、项目环境和结构 1、项目环境 2、项目结构 二、编写项目 1、创建模型 代码示例: import datetimefrom django.db import models from django.utils import timezone# Create your models here.class Question(models.Model):question_text models.CharField(max_length2…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了&#xff0c;搞了一天&#xff0c;特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3&#xff1a; 目的 为了适配旧代码&#xff0c…

【Monero】Wallet RPC | Wallet CLI | 门罗币命令行查询余额、种子、地址等命令方法教程

ubuntu22.04 首先在运行daemon&#xff0c;详细安装运行教程可参考&#xff1a;The Monero daemon (monerod) ./monerodWallet CLI run ./monero-wallet-cli如果还没有钱包就根据提示创建钱包即可 输入密码 查询余额 balance查询种子 seed其他可执行命令操作&#xff1…

跳槽多次未成功,问题源自何处?

众所周知&#xff0c;2023年市场很难&#xff01;看着企业们纷纷裁员&#xff0c;甚至连内推这个后门都走不通&#xff01;哪怕有面试&#xff0c;都是屡屡碰壁&#xff0c;你想清楚问题出在哪了吗&#xff1f;&#x1f62d;“求职不得&#xff0c;夜不能寐&#xff1b;三更半夜…

GEE土地分类——基于遥感影像数据的不同作物的分类

简介 这里我们首先要更改原始代码的中的影像和研究区矢量的问题,这个为了防止我们计算的过程超限,建议先将我们的研究区影像和样本点先存在自己的assets中,然后导入到新的脚本中。然周本文就是对其进行影像进行归一化处理,然后进行样本点值提取至点,然后训练样本点,进行…

学习刷题-14

3.29 贪心算法 跳跃游戏 II 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 贪心的思路&#xff0c;局部最优&#xff1a;当前可移动距离尽可能多…

【4】单链表(有虚拟头节点)

【4】单链表&#xff08;有虚拟头节点&#xff09; 1、虚拟头节点2、构造方法3、node(int index) 返回索引位置的节点4、添加5、删除6、ArrayList 复杂度分析(1) 复杂度分析(2) 数组的随机访问(3) 动态数组 add(E element) 复杂度分析(4) 动态数组的缩容(5) 复杂度震荡 7、单链…

3.两数相加 - 链表

文章目录 题目简介题目解答代码&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 两数相加 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 通过题目给的第一个示例来解析 图解如下&#xff1a; l1的2和l2的5首先相加变为7 这里相加结果为7…

Ubuntu18.04安装wireshark

安装wireshark 环境Ubuntu18.04 1.使用root用户进行安装 2.将 wireshark-dev/stable PPA 添加到系统的软件源列表中。系统就可以从该PPA获取Wireshark软件包及其更新了。 apt-add-repository ppa:wireshark-dev/stable3.确保你系统上的软件包信息是最新的&#xff0c;这样在…

Yarn - macOS 上安装使用

文章目录 关于 YarnYarn 工作流程安装检查安装、查看版本 常用命令 关于 Yarn Yarn 是一款成熟的开源软件包管理器&#xff0c;用于管理 JavaScript 项目中的依赖关系。 官网&#xff1a;https://yarnpkg.comgithub : https://github.com/yarnpkg官方文档&#xff1a;https:/…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…

数据结构——lesson13排序之计数排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Java 中的单例模式

引言&#xff1a; 在 Java 编程中&#xff0c;单例模式是一种常见的设计模式&#xff0c;它保证一个类只能创建一个实例&#xff0c;并提供一个全局访问点。单例模式在很多场景下都非常有用&#xff0c;比如线程池、日志系统、数据库连接池等。本文将详细介绍 Java 中单例模式的…

操作教程|在MeterSphere中通过SSH登录服务器的两种方法

MeterSphere开源持续测试平台拥有非常强大的插件集成机制&#xff0c;用户可以通过插件实现平台能力的拓展&#xff0c;借助插件或脚本实现多种功能。在测试过程中&#xff0c;测试人员有时需要通过SSH协议登录至服务器&#xff0c;以获取某些配置文件和日志文件&#xff0c;或…