SSIM(结构相似性指数衡量)性能

问题描述 投票:0回答:1

我有一个参考图像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归一化直方图,但结果最差。

有没有一种无需训练就能衡量相似度的方法?

图片A:

图片B:

图像C:

编辑:

经过 @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;
image-processing similarity ssim
1个回答
0
投票

正如评论所暗示的,如果两个图像未像素对齐,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)  

请注意,这可能会很慢,具体取决于您拥有多少样本或如何

© www.soinside.com 2019 - 2024. All rights reserved.