我有一个参考图像A和2个目标图像B和C,我尝试如下测量SSIM:
(从人类视觉感知A和B来自同一类)而A和C来自不同类。
result1 = SSIM(A , B) = 4.71027%;
result2 = SSIM(A , C) = 7.95047%;
我使用了opencv中的代码:SSIM代码
我也尝试过通过计算两个直方图的KL散度来对整个图像进行LBP归一化直方图,但结果最差。
有没有一种无需训练就能衡量相似度的方法?
编辑:
经过 @Cris Luengo 建议,这些是 Circular 和 Variance-based 的 2 个 LBP 版本的结果。看来方法(特征描述符)的选择至关重要: (结果 = 0 表示相同)
result1 = LPB_CIRCULAR_HIST_KL(A , B) = 0.66;
result2 = LPB_CIRCULAR_HIST_KL(A , C) = 0.64;
result1 = LPB_VAR_HIST_KL(A , B) = 0.49;
result2 = LPB_VAR_HIST_KL(A , C) = 3.74;
正如评论所暗示的,如果两个图像未像素对齐,SSIM 将无法工作。您可以通过多种方式找到两个未对齐图像之间的相似性。如今最流行的方法之一是使用 CLIP。 CLIP 是稳定扩散等生成式 AI 的基础。
我建议你看看 this repo 它告诉你如何为 python 安装 CLIP 并提取特征和相似之处。他们中的示例是图像-文本相似性,但您可以通过执行以下操作来提取图像-图像相似性:
import torch
import clip
from PIL import Image
import torch.nn.functional as F
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image1 = preprocess(Image.open("Image1.png")).unsqueeze(0).to(device)
image2 = preprocess(Image.open("Image2.png")).unsqueeze(0).to(device)
with torch.no_grad():
image1_features = model.encode_image(image1)
image2_features = model.encode_image(image2)
sim = F.cosine_similarity(image1_features, image2_features)
print("Cosine similarity: ", sim)
请注意,这可能会很慢,具体取决于您拥有多少样本或如何