当前位置: 首页 > 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代码&#…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...