首页 > 编程语言 >Python中图像相似性度量方法汇总

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

时间:2023-10-14 13:32:27浏览次数:28  
标签:Python cv2 图像 相似性 image2 image1 img1 度量

1. 引言

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

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

2. 图像相似性概念

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

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

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

样例图像如下:

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

举例代码如下:

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_transformers

import 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,cv2,图像,相似性,image2,image1,img1,度量
From: https://blog.51cto.com/u_15506603/7860960

相关文章

  • PythonNotes_Basic1
    基本数据类型标准数据类型常见数据类型:Number(数字)String(字符串)bool(布尔类型)List(列表)Tuple(元组)Set(集合)Dictionary(字典)六个标准数据类型中:不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组);可变数据(3个):List(列表)、Set(集合)、Dict......
  • PythonNote
    Python的编程模式分为两种:交互式,脚本式。(1)交互式:交互式编程,需要我们打开cmd窗口(命令提示符窗口),在窗口中键入python,回车,这样就进入了交互式编程。此时我们直接输入python语句,就可以得到运行的结果:(2)脚本式:是我们先把python语句写好,保存在后缀为.py的文件里,然后从外......
  • PythonNotes_Basic
    Python3基础目录1基本数据类型2数据类型转换3算术运算符4条件控制5条件控制6条件控制......
  • 10-14|Python处理脏话
    处理脏话通常是一个复杂的任务,涉及到文本处理、正则表达式、自然语言处理等领域。以下是一种简单的方法,但需要注意,任何自动化的系统都不可能完美,可能会有误判或遗漏。1.**脏话词汇表**:首先,你可以创建一个脏话词汇表,这是最简单也最直接的方法。```pythonbad_words=["badword1......
  • Anaconda虚拟环境配置Python库与Spyder编译器
      本文介绍在Anaconda中,为Python的虚拟环境安装第三方库与Spyder等配套软件的方法。  在文章创建Anaconda虚拟Python环境的方法中,我们介绍了在Anaconda环境下,创建、使用与删除Python虚拟环境的方法;而创建虚拟环境后,就需要在对应的环境内配置各类库与软件,本文就对这些操作加以......
  • python字符串的定义和表示
    在Python中,字符串是一种表示文本数据的数据类型。你可以使用单引号(')或双引号(")来定义字符串,如下所示:str1='HelloWorld!'str2="Pythonisawesome."Python中的字符串可以包含任何字符,包括字母、数字、标点符号和特殊字符。你还可以使用转义字符(\)来表示一些特殊字符,如换行符......
  • Python第一课
    一、安装python、pycharm或vscodepython+pycharm安装教程 https://www.bilibili.com/video/BV1xW4y117ww/?spm_id_from=333.337.search-card.all.click&vd_source=85a59106edfe2831df69042969f00cd3python相当于媒婆,pycharm是写代码的文本编辑器,pycharm的代码通过python翻译后才......
  • 【华为OD统一考试B卷 | 100分】 报数问题 (1到3报数)(C++ Java Python javaScript)
    华为OD在线刷题平台平台涵盖了华为OD机试A卷+B卷的真题。平台的题库不断更新,确保能够涵盖华为OD机试的所有真题。点击链接注册并开始你的刷题之旅:点击立即刷题华为OD统一考试A卷+B卷新题库说明2023年5月份,华为官方已经将的2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统......
  • Working with Regular Expression in Python.
    #正则表达式正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。一个正则表达式是一种从左到右匹配主体字符串的模式,常使用缩写的术语“regex”或“regexp”。实验网站:regex101参考:菜鸟正则语法元字符正则表达式起作用主要依赖......
  • python实现根据序列ID从fasta文件中删除指定的序列
     001、[root@pc1test1]#lsa.farm.listtest.py[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggjjjcccjjjjjj>chr3ccc>chr4aaaaatt[root@pc1test1]#catrm.list##删除列表chr2chr4[root@p......