常用图像评价指标以及代码 :PSNR、SSIM、 LPIPS

目录

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

2. 结构相似性指数SSIM(Structural Similarity Index)

3. 学习感知图像块相似性LPIPS(Learned Perceptual Image Patch Similarity)


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

峰值信噪比是一种常用的图像质量评估指标,它基于MSE(均方误差)来衡量图像的重建质量。PSNR越高,表示图像质量越好。

$ \text{MSE} = \frac{1}{mn} \sum_{i=1}^{m} \sum_{j=1}^{n} [I(i, j) - K(i, j)]^2 $

$\text{PSNR} = 10 \cdot \log_{10} \left( \frac{\text{MAX}^2}{\text{MSE}} \right)$

其中,MAX是图像可能的最大像素值,MSE是原始图像与重建图像之间的均方误差。

  • mn分别是图像的行数和列数。

  • I(i,j)是原始图像在位置 (i,j)的像素值。

  • K(i,j) 是比较图像在位置 (i,j)的像素值。

  • 分子$\text{MAX}^2$是图像可能的最大像素值的平方。这是在没有噪声的理想情况下,图像可以达到的最大值。

  • 分母$\text{MSE}$是实际图像与参考图像之间差异的度量。MSE越小,表示两幅图像越相似。

  • 对数部分:使用对数转换是为了将误差的量级压缩,使得PSNR值更易于理解和比较。

1)特点

  •  PSNR是基于像素值的全局评估,不考虑图像的结构信息。
  • 通常,PSNR值在30dB以上表示较好的图像质量,40dB以上则很难用肉眼区分差异。
  • PSNR接近50dB:表示压缩后的图像质量非常高,仅有非常小的误差。在这种情况下,原始图像和压缩后的图像之间的差异几乎不可察觉。

  • PSNR大于30dB:通常认为,人眼很难察觉到这种压缩水平下图像的失真。这意味着压缩后的图像在视觉上与原始图像非常接近。

  • PSNR介于20dB到30dB之间:在这个范围内,人眼可以开始察觉到图像的一些差异,但这些差异通常不会太显著。

  • PSNR介于10dB到20dB之间:在这个范围内,人眼可以较为明显地看出图像的差异,但仍然可以辨识出图像的基本结构。尽管存在失真,但人们可能仍然会认为两张图像是相似的。

  • PSNR低于10dB:当PSNR值非常低时,图像的质量会显著下降,以至于人眼很难判断两个图像是否为同一场景的图像,或者一个图像是否为另一个图像的有效压缩版本。

2)代码实现

使用Python和kornia库来计算图像的峰值信噪比(PSNR),kornia是一个开源的库,它提供了一系列用于计算机视觉的神经网络工具,包括图像质量评估指标的计算。

import torch
import kornia.losses

# 假设 images 和 encoded_images 是已经加载或处理的图像张量
# images = ...
# encoded_images = ...

# 计算 PSNR
psnr_value = - kornia.losses.psnr_loss(encoded_images.detach(), images, 2)
print(f"PSNR: {psnr_value.item()}")
  • kornia.losses.psnr_loss 计算预测图像(encoded_images)和目标图像(images)之间的PSNR。
  • encoded_images.detach() 表示在计算PSNR时不计算梯度,这通常在验证或测试阶段使用,以避免不必要的计算。
  • 2 是PSNR公式中的最大像素值,对于8位图像通常是255,这里使用了归一化的值(255/255 = 1,所以使用2作为分母)。

2. 结构相似性指数SSIM(Structural Similarity Index)

结构相似性指数是一种更为先进的图像质量评估指标,它不仅考虑像素值的差异,还考虑图像的结构信息。

$\text{SSIM}(x, y) = \frac{(2\mu_x \mu_y + C_1)(2\sigma_{xy} + C_2)}{(\mu_x^2 + \mu_y^2 + C_1)(\sigma_x^2 + \sigma_y^2 + C_2)}$

其中,$\mu_x$$\mu_y$分别是图像xy的均值,$\sigma_x^2$$\sigma_y^2$是方差,$\sigma_{xy}$是协方差,$C_1$$C_2$ 是用于稳定除法运算的小常数:C_1=(k_1L)^2;C_2=(k_2L)^2L是像素值的动态范围,默认值:k_1=0.01, k_2=0.03

1)特点

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

2)代码实现

import torch
import kornia.losses

# 假设 images 和 encoded_images 是已经加载或处理的图像张量
# images = ...
# encoded_images = ...


# 计算 SSIM
ssim_value = 1 - 2 * kornia.losses.ssim_loss(encoded_images.detach(), images, window_size=11, reduction="mean")
print(f"SSIM: {ssim_value.item()}")
  • kornia.losses.ssim_loss 计算预测图像和目标图像之间的SSIM。
  • encoded_images.detach() 同样表示在计算SSIM时不计算梯度。
  • window_size=11 定义了用于计算SSIM的窗口大小。
  • reduction="mean" 表示损失将在所有元素上平均。
  • 1 - 2 * ... 是因为kornia的ssim_loss返回的是1减去SSIM的值,所以这里通过乘以2并减去1来得到正的SSIM值。

3. 学习感知图像块相似性LPIPS(Learned Perceptual Image Patch Similarity)

学习感知图像块相似性是一种基于深度学习的图像质量评估方法,它使用预训练的卷积神经网络来学习图像特征的感知差异。

1)原理

  • LPIPS通过训练一个深度网络来学习图像块之间的感知差异。
  • 它通常使用预训练的CNN(如VGG或AlexNet)作为特征提取器,然后训练一个额外的层来预测图像对的相似性。

2)特点

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

3)代码实现

import lpips
import torch
from PIL import Image
from torchvision import transforms

# 加载图像并转换为张量
image1 = Image.open("path_to_image1.jpg").convert('RGB')
image2 = Image.open("path_to_image2.jpg").convert('RGB')

# 定义图像预处理步骤
preprocess = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

image1_tensor = preprocess(image1).unsqueeze(0)  # 添加批次维度
image2_tensor = preprocess(image2).unsqueeze(0)

# 确保图像张量在正确的设备上
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
image1_tensor = image1_tensor.to(device)
image2_tensor = image2_tensor.to(device)

# 初始化LPIPS模型
lpips_model = lpips.LPIPS(net='vgg').to(device)

# 计算LPIPS
lpips_value = lpips_model(image1_tensor, image2_tensor).item()

print(f"LPIPS: {lpips_value}")

总结

  • PSNR:简单直观,但可能与人类视觉感知不完全一致。
  • SSIM:考虑图像结构,更符合人眼视觉特性。
  • LPIPS:基于深度学习,能够捕捉复杂的图像特征和感知差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值