当前位置: 首页 > news >正文

Python中图像相似性度量方法汇总

1. 引言

在当前到处充满着图像的世界里,测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索,图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。

幸运的是,Python提供了大量的工具和库,使开发人员和研究人员都可以快速探索和实现这些功能。在本文中,我们将深入研究各种图像相似性技术,并演示如何使用Python来实现它们。

2. 图像相似性概念

图像相似性可以被认为是两幅图像在视觉内容方面的相似程度的数字表示。图像可以在几个维度上来进行相似性的计算,例如颜色、形状、纹理等。各种数学和计算方法被用来量化这些相似性,使我们能够有效地进行图像分类。

3. 基于直方图的相似性度量

直方图一般用于捕捉图像中像素值的分布。通过比较两幅图像的直方图,可以测量它们的相似性。这里我们主要使用Python的OpenCV库,来实现计算和比较直方图的功能。

样例图像如下:

在这里插入图片描述

举例代码如下:

import cv2
# Load images
image1 = cv2.imread(image1)
image2 = cv2.imread(image2)
hist_img1 = cv2.calcHist([image1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_img1[255, 255, 255] = 0 #ignore all white pixels
cv2.normalize(hist_img1, hist_img1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
hist_img2 = cv2.calcHist([image2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_img2[255, 255, 255] = 0  #ignore all white pixels
cv2.normalize(hist_img2, hist_img2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# Find the metric value
metric_val = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
print(f"Similarity Score: ", round(metric_val, 2))

得到结果如下:

Similarity Score: 0.94

4. 基于SSIM的相似性度量

结构相似性指数(Structural Similarity Index measure 简称SSIM) 是一种广泛使用的度量标准,用于评估两幅图像之间的结构相似性。它考虑了亮度、对比度和结构,给出了-1(不同)和1(相同)之间的分数。Python中的scikit-image提供了SSIM的相关实现。

在这里,我们主要演示使用SSIMscikit-image库的简单示例:(这里采用的样例图像同上)

import cv2
from skimage import metrics
# Load images
image1 = cv2.imread(image1)
image2 = cv2.imread(image2)
image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]), interpolation = cv2.INTER_AREA)
print(image1.shape, image2.shape)
# Convert images to grayscale
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# Calculate SSIM
ssim_score = metrics.structural_similarity(image1_gray, image2_gray, full=True)
print(f"SSIM Score: ", round(ssim_score[0], 2))

相应的相似性度量结果如下:

SSIM Score: 0.38

与直方图方法相比,SSIM方法的主要缺点是图像必须具有相同的维度。甚至相似性得分也很低。我们可以从图像中进行背景减法去除,以提高相似性得分。

5. 基于特征相似性的度量

这类方法从图像中提取显著特征,例如边缘、角或关键点。像尺度不变特征变换(SIFT)和加SURF特征这样的技术可以识别图像中的不同的关键点,进而可以实现两幅图像之间的对比。

opencv-python库可以用于提取相应图像的SIFT和SURF特征。

6. 基于深度学习的方法

深度学习的出现已经彻底改变了图像相似性任务。使用预训练的卷积神经网络(CNNs),如ResNet、VGG和Inception,我们可以方便地从图像中提取深层特征。

来自openAI的 contrastive Language-Image Pre-Training (CLIP) 是一种多模式零样本图像分类器,它在没有微调的情况下,在广泛的领域中达到了出色的效果。我们可以使用开源的训练代码在自己图像和文本数据集上对上述模型进行微调。

在本文中,我们将使用基于CLIP的预训练模型和torchopen_CLIPsentence_transformers库来演示一个简单的示例:(这里采用的样例图像同上)

!pip install git+https://github.com/openai/CLIP.git
!pip install open_clip_torch
!pip install sentence_transformersimport torch
import open_clip
import cv2
from sentence_transformers import util
from PIL import Image
# image processing model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-16-plus-240', pretrained="laion400m_e32")
model.to(device)
def imageEncoder(img):img1 = Image.fromarray(img).convert('RGB')img1 = preprocess(img1).unsqueeze(0).to(device)img1 = model.encode_image(img1)return img1
def generateScore(image1, image2):test_img = cv2.imread(image1, cv2.IMREAD_UNCHANGED)data_img = cv2.imread(image2, cv2.IMREAD_UNCHANGED)img1 = imageEncoder(test_img)img2 = imageEncoder(data_img)cos_scores = util.pytorch_cos_sim(img1, img2)score = round(float(cos_scores[0][0])*100, 2)return score
print(f"similarity Score: ", round(generateScore(image1, image2), 2))

得到结果如下:

similarity Score: 76.77

上述图像之间相似性的度量主要的依据是通过计算两幅图像中特征向量的余弦相似性或欧几里得距离来实现的。

7. 应用

图像相似技术的主要应用包括电子商务产品匹配、图像检索、对象识别和人脸识别。例如,在图像检索中使用图像相似性来查找与查询图像相似的图像。图像相似性也可以可以用于对象识别,以将给定对象与已知数据库相匹配。此外,图像相似性算法还可以用于通过将人脸与数据库进行比较来识别不同的对象。

8. 总结

在当今视觉世界中,测量图像相似性的能力是众多应用程序的重要组成部分。本博客向大家介绍了各种图像相似性方法,从简单的基于直方图的方法到复杂的基于深度学习技术的实现方法。更进一步,大家还可以探索Siamese networks,这是一类专门为图像相似性任务设计的神经网络。

嗯嗯,您学废了吗?

相关文章:

Python中图像相似性度量方法汇总

1. 引言 在当前到处充满着图像的世界里,测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索,图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。 幸运的是,Python提供了大量的工具和库&am…...

pycharm中快速对比两个.py文件

在学习一个算法的时候,就想着自己再敲一遍代码,结果最后出现了一个莫名其妙的错误,想跟源文件对比一下到底是在哪除了错,之前我都是大致定位一个一个对比,想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…...

C++程序结束

在C程序任意位置结束程序需要return 0,如果只return的话会发生生成错误...

嵌入式学习-核心板、开发板和单片机

目录 核心板开发板单片机三者关系 核心板 核心板是一种电路板,它集成了微处理器、存储器和一些必要的接口电路。它通常用于嵌入式系统或物联网设备中,作为整个系统的核心组件。它的主要功能是将微处理器的指令和数据总线转换为各种外设的接口&#xff0…...

【pycharm】控制台报错:终端无法加载文件\venv\Scripts\activate.ps1

目录 一、在pycharm控制台输入 二、在windows的power shell (以管理员方式打开) 三、 在pycharm控制台输入 四、重新打开pycharm即可 前言:安装pycharm2022-03版本出现的终端打开报错 一、在pycharm控制台输入 get-executionpolicy …...

Python算术运算符:加减乘除 整除 取余 幂指数 小括号

运算案例 需求:用户手工输入梯形的上底、下底以及高,能直接通过Python打印出梯形的面积为多少。 做这个需求前,首先要知道Python的算数运算符有哪些。 2、算术运算符 所谓的算数运算符就是我们日常生活中的加减乘除等待。 运算符描述实例…...

访问者模式:对象结构的元素处理

欢迎来到设计模式系列的第十九篇文章,本篇将介绍访问者模式。访问者模式是一种行为型设计模式,它用于处理对象结构中不同类型的元素,而不需要修改这些元素的类。 什么是访问者模式? 访问者模式是一种将数据结构与数据操作分离的…...

ChatGPT快速入门

ChatGPT快速入门 一、什么是ChatGPT二、ChatGPT底层逻辑2.1 实现原理2.2 IO流程 三、ChatGPT应用场景3.1 知心好友3.2 文案助理3.3 创意助理3.4 角色扮演 一、什么是ChatGPT ChatGPT指的是基于GPT(Generative Pre-trained Transformer)模型的对话生成系…...

链表的实现(c语言)

链表分为单链表、双链表和循环链表&#xff0c;这些理论知识在笔记中自然写了&#xff0c;这里我只写出其中的实现&#xff1a; 单链表的实现 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Book {char bookname[20];char a…...

【Redis】渐进式遍历

scan命令渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&#xff0c;需要执⾏多次scan。 SCAN 以渐进式的⽅式进⾏键的遍历。 SCAN…...

uni-app开发微信小程序的报错[渲染层错误]排查及解决

一、报错信息 [渲染层错误] Framework nner error (expect FLOW INITIALCREATION end but get FLOW CREATE-NODE) 二、原因分析及解决方案 第一种 原因&#xff1a;基础库版本的原因导致的。 解决&#xff1a; 1.修改调试基础库版本 2.详情—>本地设置—>调试基础库…...

三、C语言常用运算符

1、算术运算符 符号说明加号-减号*乘号/除号%取余符号&#xff0c;相除以后余数是几自增运算符&#xff0c;整数值增加 1--自减运算符&#xff0c;整数值减少1 2、关系运算符 符号说明检查两个操作数的值是否相等&#xff0c;如果相等则条件为真。!检查两个操作数的值是否相…...

ubuntu联网图标消失

sudo service NetworkManager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo service NetworkManager start执行 sudo rm /var/lib/NetworkManager/NetworkManager.state 命令将删除位于 /var/lib/NetworkManager 目录下的 NetworkManager.state 文件。...

中华人民共和国网络安全法

中华人民共和国网络安全法 《中华人民共和国网络安全法》已由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议于2016年11月7日通过&#xff0c;现予公布&#xff0c;自2017年6月1日起施行。2022年9月12日&#xff0c;国家互联网信息办公室发布关于公开征求《…...

Java并发面试题:(二)线程池参数和使用

线程池参数 线程池工作过程 当提交一个新任务到线程池时&#xff0c;具体的执行流程如下&#xff1a; 当我们提交任务&#xff0c;线程池会根据corePoolSize大小创建若干任务数量线程执行任务 当任务的数量超过corePoolSize数量&#xff0c;后续的任务将会进入阻塞队列阻塞排…...

Python机器学习零基础理解AffinityPropagation亲和力传播聚类

如何解决社交媒体上的好友推荐问题? 想象一下,一个社交媒体平台希望提供更加精准的好友推荐功能,让用户能更容易地找到可能成为好友的人。这个问题看似简单,但当面对数百万甚至数千万的用户时,手动进行好友推荐就变得几乎不可能。 解决这个问题的一个方案就是使用机器学…...

Open3D 进阶(12)PCA拟合空间直线

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 见:Open3D 最小二乘拟合空间直线(方法一) 二、代码实现 import numpy as np import open3d as o...

4种实现JS深拷贝的方法

浅拷贝与深拷贝 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的是内存地址 。 如果不进行深拷贝&#xff0c;其中一个对象改变了对象的值&am…...

六、RocketMQ发送事务消息

事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 Apache RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 以电商交易场景为例&#xff0c;用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统的…...

Node.js初体验

Node.js简介 node.js的运行环境 1.V8引擎对js代码进行解析与执行 2.内置API&#xff1a;fs、path、http...等&#xff0c;提供了一些能力&#xff0c;能够使得js调用这些API去做一些后端的事情 流程&#xff1a;我们在node.js的运行环境中编写待执行的JavaScript代码&#…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...