目录
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越高,表示图像质量越好。
其中,MAX是图像可能的最大像素值,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)
结构相似性指数是一种更为先进的图像质量评估指标,它不仅考虑像素值的差异,还考虑图像的结构信息。
其中,和分别是图像和的均值,和 是方差,是协方差,和 是用于稳定除法运算的小常数:、是像素值的动态范围,默认值:
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:基于深度学习,能够捕捉复杂的图像特征和感知差异。