【图像评价指标】PSNR LPIPS LMD SSIM FID

文章目录

  • 评价指标
    • 1. PSNR
      • 1.1 计算公式
      • 1.2 计算 PSNR 代码
    • 2. LPIPS
      • 2.1 LPIPS 计算公式
      • 2.2 计算 LPIPS 代码
    • 3. LMD
      • 3.1 LMD的计算方法
      • 3.2 计算 LMD 代码
    • 4. SSIM
      • 4.1 SSIM 的计算公式
      • 4.1 计算 SSIM 的代码
    • 5. FID
      • 5.1 FID 计算公式
      • 5.2 计算FID的代码

评价指标

1. PSNR

PSNR(Peak Signal-to-Noise Ratio)是一种用于衡量图像或信号质量的指标。它通常用于评估一幅图像与原始图像之间的相似度,尤其是在图像压缩和重建领域。PSNR的值越高,表示两幅图像之间的相似度越高,质量越好

1.1 计算公式

PSNR = 10 ⋅ log ⁡ 10 ( MAX 2 MSE ) \text{PSNR} = 10 \cdot \log_{10}\left(\frac{{\text{MAX}^2}}{{\text{MSE}}}\right) PSNR=10log10(MSEMAX2)
其中:

  • MAX 表示图像像素值的最大可能取值(通常为255,对于8位图像)。
  • MSE 表示均方误差(Mean Squared Error),计算方法是将两幅图像逐像素进行差异计算,然后求平方并取平均值。

1.2 计算 PSNR 代码

import cv2
import numpy as np

# 读取原始图像和重建图像
original_image = cv2.imread('original_image.jpg')
reconstructed_image = cv2.imread('reconstructed_image.jpg')

# 计算均方误差(MSE)
mse = np.mean((original_image - reconstructed_image) ** 2)

# 计算PSNR
max_pixel_value = 255  # 对于8位图像,最大像素值为255
psnr = 10 * np.log10((max_pixel_value ** 2) / mse)

print(f"PSNR: {psnr} dB")

在上面的示例中,假设您有一幅原始图像和一幅重建图像,并且使用OpenCV库来读取图像。计算PSNR的关键是计算MSE,然后使用PSNR的公式来计算PSNR值。通常,PSNR以分贝(dB)为单位表示,数值越高表示图像质量越好。

2. LPIPS

LPIPS,全称为Learned Perceptual Image Patch Similarity,是一种用于测量两幅图像之间感知相似性的指标。与传统的PSNR和SSIM不同,LPIPS是通过深度学习方法学习得到的,可以更好地模拟人类视觉感知。

2.1 LPIPS 计算公式

LPIPS的计算公式不是简单的数学公式,而是通过深度神经网络来实现的。通常,LPIPS模型使用两幅图像作为输入,然后输出它们之间的感知相似性分数。LPIPS模型的具体架构和参数是经过大规模训练得到的,用于捕捉图像的感知信息。

2.2 计算 LPIPS 代码

import torch
import torchvision.transforms as transforms
import torchvision.models as models
from PIL import Image

# 加载预训练的LPIPS模型
lpips_model = models.lpips.LPIPS(net='alex')

# 加载两幅图像
image1 = Image.open('image1.jpg').convert('RGB')
image2 = Image.open('image2.jpg').convert('RGB')

# 对图像进行预处理
preprocess = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor(),
])

image1 = preprocess(image1).unsqueeze(0)
image2 = preprocess(image2).unsqueeze(0)

# 使用LPIPS模型计算相似性
similarity_score = lpips_model(image1, image2)

print(f"LPIPS Similarity: {similarity_score.item()}")

首先加载了一个预训练的LPIPS模型(这里使用了alex模型)。然后加载了两幅图像,并对它们进行了必要的预处理,以使它们与LPIPS模型的输入格式匹配。最后,我们使用LPIPS模型来计算这两幅图像之间的感知相似性分数。

3. LMD

LMD(Landmark Distance)是用于评估面部图像生成质量的指标,它用于度量生成的面部图像与真实面部图像之间的面部特征点的距离,以评估生成图像的面部特征的准确性。LMD通常用于人脸合成和生成任务中,以衡量生成的面部图像与真实面部图像之间的相似性。

计算LMD的一般步骤如下:

  1. 从生成的面部图像和真实面部图像中检测面部特征点(例如,眼睛、鼻子、嘴巴等)的位置。
  2. 计算每个特征点之间的欧几里得距离。
  3. 汇总或平均这些距离,以获得LMD的最终值。

3.1 LMD的计算方法

以下是LMD的计算公式(假设有N个特征点):

L M D = 1 N ∑ i = 1 N ( x g i − x r i ) 2 + ( y g i − y r i ) 2 LMD = \frac{1}{N} \sum_{i=1}^{N} \sqrt{(x_{g_i} - x_{r_i})^2 + (y_{g_i} - y_{r_i})^2} LMD=N1i=1N(xgixri)2+(ygiyri)2

其中:

  • L M D LMD LMD 是Landmark Distance的值。
  • N N N是特征点的数量。
  • x g i x_{g_i} xgi y g i y_{g_i} ygi 分别是生成图像上第i个特征点的x和y坐标。
  • x r i x_{r_i} xri y r i y_{r_i} yri 分别是真实图像上第i个特征点的x和y坐标。

3.2 计算 LMD 代码

以下是一个用Python计算LMD的简单示例代码,假设有两个图像和它们的特征点坐标列表:

import numpy as np

def calculate_lmd(landmarks_generated, landmarks_real):
    num_landmarks = len(landmarks_generated)
    lmd = 0.0
    
    for i in range(num_landmarks):
        x_g, y_g = landmarks_generated[i]
        x_r, y_r = landmarks_real[i]
        distance = np.sqrt((x_g - x_r)**2 + (y_g - y_r)**2)
        lmd += distance
    
    lmd /= num_landmarks  # 平均距离
    return lmd

# 示例用法
landmarks_generated = [(10, 20), (30, 40), (50, 60)]  # 生成图像上的特征点坐标
landmarks_real = [(15, 25), (35, 45), (55, 65)]  # 真实图像上的特征点坐标

lmd_score = calculate_lmd(landmarks_generated, landmarks_real)
print("LMD Score:", lmd_score)

4. SSIM

结构相似性指数(Structural Similarity Index,简称SSIM)是一种用于衡量两幅图像之间相似度的指标,它不仅考虑了亮度、对比度,还考虑了结构信息。SSIM通常用于图像质量评估,图像压缩和图像增强等领域。

4.1 SSIM 的计算公式

SSIM ( x , y ) = ( 2 μ x μ y + C 1 ) ( 2 σ x y + C 2 ) ( μ x 2 + μ y 2 + C 1 ) ( σ x 2 + σ y 2 + C 2 ) \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)}} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)

其中:

  • x x x y y y 是要比较的两幅图像。
  • μ x \mu_x μx μ y \mu_y μy 分别是图像 x x x y y y的亮度均值。
  • σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2 分别是图像 x x x y y y 的亮度方差。
  • σ x y \sigma_{xy} σxy是图像 x x x y y y 之间的亮度协方差。
  • C 1 C_1 C1 C 2 C_2 C2 是常数,用于稳定计算,通常设置一个较小的正数值。

SSIM的值范围通常在 -1 到 1 之间,值越接近1表示两幅图像越相似,质量越高。

4.1 计算 SSIM 的代码

from skimage.metrics import structural_similarity as ssim
from skimage import io

# 读取两幅图像
image1 = io.imread('image1.jpg', as_gray=True)
image2 = io.imread('image2.jpg', as_gray=True)

# 计算SSIM
ssim_score = ssim(image1, image2)

print(f"SSIM: {ssim_score}")

有两幅要比较的灰度图像(也可以使用彩色图像),然后使用Scikit-Image库的structural_similarity函数来计算它们之间的SSIM。结果将为一个浮点数,范围在 -1 到 1 之间,值越高表示两幅图像越相似。

5. FID

FID(Fréchet Inception Distance)是一种用于评估生成模型性能的指标,特别是在生成对抗网络(GANs)中广泛使用。它旨在测量生成图像与真实图像分布之间的差异,即生成图像的质量和多样性。较低的FID值表示生成图像更接近真实图像分布,因此通常被认为是更好的生成模型。

5.1 FID 计算公式

FID的计算是基于两个图像分布之间的特征向量空间的Fréchet距离。以下是FID的计算公式:
F I D ( P , G ) = ∣ ∣ μ P − μ G ∣ ∣ 2 + T r ( Σ P + Σ G − 2 ∗ Σ P Σ G ) FID(P, G) = ||μ_P - μ_G||^2 + Tr(Σ_P + Σ_G - 2*\sqrt{Σ_PΣ_G}) FID(P,G)=∣∣μPμG2+Tr(ΣP+ΣG2ΣPΣG )
其中:

  • P P P表示真实图像分布的特征向量集合,通常使用Inception网络的中间层的输出来表示。
  • G G G表示生成图像分布的特征向量集合,也使用相同的方式表示。
  • μ P μ_P μP μ G μ_G μG分别是 P P P G G G的特征向量集合的均值。
  • Σ P Σ_P ΣP Σ G Σ_G ΣG分别是 P P P G G G的特征向量集合的协方差矩阵。
  • T r ( Σ P + Σ G − 2 ∗ Σ P Σ G ) Tr(Σ_P + Σ_G - 2*\sqrt{Σ_PΣ_G}) Tr(ΣP+ΣG2ΣPΣG )表示协方差矩阵的迹的平方根。

5.2 计算FID的代码

要计算FID,需要首先提取真实图像和生成图像的特征向量,然后计算上述公式。通常,特征向量是通过在Inception网络上进行前向传播来提取的。以下是使用Python和NumPy计算FID的示例代码:

import numpy as np
from scipy.linalg import sqrtm

# 两个示例特征向量集合的均值和协方差矩阵
mu_P = np.array([0.5, 0.5])
sigma_P = np.array([[1.0, 0.5], [0.5, 1.0]])

mu_G = np.array([0.8, 0.7])
sigma_G = np.array([[1.2, 0.4], [0.4, 1.3]])

# 计算FID
diff = mu_P - mu_G
covar_trace = np.trace(sigma_P + sigma_G - 2.0 * sqrtm(sigma_P @ sigma_G))
fid = np.dot(diff, diff) + covar_trace

print(f"FID Value: {fid}")

提供了两个示例特征向量集合的均值和协方差矩阵,然后计算了它们之间的FID值。请注意,实际应用中,需要使用真实图像和生成图像的特征向量来进行计算,通常可以使用深度学习框架(如PyTorch或TensorFlow)中的预训练模型来提取这些特征向量。

首发于:https://zhuanlan.zhihu.com/p/658827245

你可能感兴趣的:(计算机视觉,图像质量评价指标)