湖南竞网科技有限公司,南京seo公司,wordpress id 插件,深圳门户网站建设专业1. 引言
在当前到处充满着图像的世界里#xff0c;测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索#xff0c;图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。
幸运的是#xff0c;Python提供了大量的工具和库测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。
幸运的是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, alpha0, beta1, norm_typecv2.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, alpha0, beta1, norm_typecv2.NORM_MINMAX)
# Find the metric value
metric_val cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
print(fSimilarity Score: , round(metric_val, 2))得到结果如下
Similarity Score: 0.944. 基于SSIM的相似性度量
结构相似性指数Structural Similarity Index measure 简称SSIM) 是一种广泛使用的度量标准用于评估两幅图像之间的结构相似性。它考虑了亮度、对比度和结构给出了-1不同和1相同之间的分数。Python中的scikit-image提供了SSIM的相关实现。
在这里我们主要演示使用SSIM和scikit-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, fullTrue)
print(fSSIM 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的预训练模型和torch、open_CLIP和sentence_transformers库来演示一个简单的示例这里采用的样例图像同上
!pip install githttps://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, pretrainedlaion400m_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(fsimilarity Score: , round(generateScore(image1, image2), 2))得到结果如下
similarity Score: 76.77上述图像之间相似性的度量主要的依据是通过计算两幅图像中特征向量的余弦相似性或欧几里得距离来实现的。
7. 应用
图像相似技术的主要应用包括电子商务产品匹配、图像检索、对象识别和人脸识别。例如在图像检索中使用图像相似性来查找与查询图像相似的图像。图像相似性也可以可以用于对象识别以将给定对象与已知数据库相匹配。此外图像相似性算法还可以用于通过将人脸与数据库进行比较来识别不同的对象。
8. 总结
在当今视觉世界中测量图像相似性的能力是众多应用程序的重要组成部分。本博客向大家介绍了各种图像相似性方法从简单的基于直方图的方法到复杂的基于深度学习技术的实现方法。更进一步大家还可以探索Siamese networks这是一类专门为图像相似性任务设计的神经网络。
嗯嗯您学废了吗