图像相似度评价指标

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. PSNR(Peak Signal-to-Noise Ratio,峰值信噪比) 

1.1. 界说

PSNR是一种常用的评价图像质量的指标,它通过比较失真图像和原始图像来衡量图像恢复质量的优劣。PSNR是基于MSE(均方误差)计算得出的,用于衡量图像重建的误差。

1.2. 阐明

PSNR是基于像素值的全局评估,不思量图像的结构信息。
   

  • PSNR接近50dB:表示压缩后的图像质量非常高,仅有非常小的误差。在这种环境下,原始图像和压缩后的图像之间的差别几乎不可察觉。
  • PSNR大于30dB:通常认为,人眼很难察觉到这种压缩水平下图像的失真。这意味着压缩后的图像在视觉上与原始图像非常接近。
  • PSNR介于20dB到30dB之间:在这个范围内,人眼可以开始察觉到图像的一些差别,但这些差别通常不会太显著。
  • PSNR介于10dB到20dB之间:在这个范围内,人眼可以较为明显地看出图像的差别,但仍然可以辨识出图像的根本结构。只管存在失真,但人们大概仍然会认为两张图像是相似的。
  • PSNR低于10dB:当PSNR值非常低时,图像的质量会显著下降,以至于人眼很难判定两个图像是否为同一场景的图像,或者一个图像是否为另一个图像的有用压缩版本。
  1.3. 代码

利用Python和kornia库来计算图像的峰值信噪比(PSNR),kornia是一个开源的库,它提供了一系列用于计算机视觉的神经网络工具,包括图像质量评估指标的计算。 
  1. import torch
  2. import kornia.losses
  3. # 假设 images 和 encoded_images 是已经加载或处理的图像张量
  4. # images = ...
  5. # encoded_images = ...
  6. # 计算 PSNR
  7. psnr_value = - kornia.losses.psnr_loss(encoded_images.detach(), images, 2)
  8. print(f"PSNR: {psnr_value.item()}")
复制代码
2. SSIM(Structural Similarity Index,结构相似性指数)

2.1. 界说

结构相似性指数是一种更为先辈的图像质量评估指标,它不但思量像素值的差别,还思量图像的结构信息。

2.2. 阐明

SSIM在0到1之间,值越接近1表示图像质量越好。
SSIM思量了图像的亮度、对比度和结构信息,因此比PSNR更符合人眼视觉特性。
2.3. 代码

  1. import torch
  2. import kornia.losses
  3. # 假设 images 和 encoded_images 是已经加载或处理的图像张量
  4. # images = ...
  5. # encoded_images = ...
  6. # 计算 SSIM
  7. ssim_value = 1 - 2 * kornia.losses.ssim_loss(encoded_images.detach(), images, window_size=11, reduction="mean")
  8. print(f"SSIM: {ssim_value.item()}")
复制代码
3. LPIPS(Learned Perceptual Image Patch Similarity,学习感知图像块相似性)

3.1. 界说

LPIPS利用一个预练习的深度网络(如VGG网络)来提取图像的特性,然后计算这些特性之间的间隔。具体来说,它计算了两幅图像在多个层的特性之间的欧氏间隔,并将这些间隔聚合起来得到终极的相似度分数。
3.2. 阐明

LPIPS的取值范围是[0, 1],值越小表示图像质量越好。
由于LPIPS基于深度学习,它可以捕捉到更复杂的图像特性和感知差别,因此在许多环境下比PSNR和SSIM更准确。
3.3. 代码

  1. import lpips
  2. import torch
  3. from PIL import Image
  4. from torchvision import transforms
  5. # 加载图像并转换为张量
  6. image1 = Image.open("path_to_image1.jpg").convert('RGB')
  7. image2 = Image.open("path_to_image2.jpg").convert('RGB')
  8. # 定义图像预处理步骤
  9. preprocess = transforms.Compose([
  10.     transforms.Resize((256, 256)),
  11.     transforms.ToTensor(),
  12.     transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
  13. ])
  14. image1_tensor = preprocess(image1).unsqueeze(0)  # 添加批次维度
  15. image2_tensor = preprocess(image2).unsqueeze(0)
  16. # 确保图像张量在正确的设备上
  17. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  18. image1_tensor = image1_tensor.to(device)
  19. image2_tensor = image2_tensor.to(device)
  20. # 初始化LPIPS模型
  21. lpips_model = lpips.LPIPS(net='vgg').to(device)
  22. # 计算LPIPS
  23. lpips_value = lpips_model(image1_tensor, image2_tensor).item()
  24. print(f"LPIPS: {lpips_value}")
复制代码
4. FID(Fréchet Inception Distance)

4.1. 界说

FID的计算是基于两个图像分布之间的特性向量空间的Fréchet间隔。以下是FID的计算公式:
 
4.2. 阐明

较小的 FID 值表示天生的图像与真实图像在特性空间中的分布更为接近,意味着天生模型可以或许天生更逼真、更接近真实数据分布的样本,表明天生模型的性能更好。
而较大的 FID 值则意味着天生的图像与真实图像的差别较大,天生模型的性能相对较差。
4.3. 代码

  1. import numpy as np
  2. from scipy
  3. .linalg import sqrtm
  4. # 两个示例特征向量集合的均值和协方差矩阵
  5. mu_P = np.array([0.5, 0.5])
  6. sigma_P = np.array([[1.0, 0.5], [0.5, 1.0]])
  7. mu_G = np.array([0.8, 0.7])
  8. sigma_G = np.array([[1.2, 0.4], [0.4, 1.3]])
  9. # 计算FID
  10. diff = mu_P - mu_G
  11. covar_trace = np.trace(sigma_P + sigma_G - 2.0 * sqrtm(sigma_P @ sigma_G))
  12. fid = np.dot(diff, diff) + covar_trace
  13. print(f"FID Value: {fid}")
复制代码
参考文献

常用图像评价指标以及代码 :PSNR、SSIM、 LPIPS_psnr ssim lpips-CSDN博客
3DGS中图像质量评估三板斧——PSNR/SSIM/LPIPS_psnr ssim lpips-CSDN博客 
https://zhuanlan.zhihu.com/p/658827245 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表