PSNR(Peak Signal-to-Noise Ratio)是一种用于衡量图像或信号质量的指标。它通常用于评估一幅图像与原始图像之间的相似度,尤其是在图像压缩和重建领域。PSNR的值越高,表示两幅图像之间的相似度越高,质量越好。
PSNR = 10 ⋅ log 10 ( MAX 2 MSE ) \text{PSNR} = 10 \cdot \log_{10}\left(\frac{{\text{MAX}^2}}{{\text{MSE}}}\right) PSNR=10⋅log10(MSEMAX2)
其中:
MAX
表示图像像素值的最大可能取值(通常为255,对于8位图像)。MSE
表示均方误差(Mean Squared Error),计算方法是将两幅图像逐像素进行差异计算,然后求平方并取平均值。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)为单位表示,数值越高表示图像质量越好。
LPIPS,全称为Learned Perceptual Image Patch Similarity,是一种用于测量两幅图像之间感知相似性的指标。与传统的PSNR和SSIM不同,LPIPS是通过深度学习方法学习得到的,可以更好地模拟人类视觉感知。
LPIPS的计算公式不是简单的数学公式,而是通过深度神经网络来实现的。通常,LPIPS模型使用两幅图像作为输入,然后输出它们之间的感知相似性分数。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模型来计算这两幅图像之间的感知相似性分数。
LMD(Landmark Distance)是用于评估面部图像生成质量的指标,它用于度量生成的面部图像与真实面部图像之间的面部特征点的距离,以评估生成图像的面部特征的准确性。LMD通常用于人脸合成和生成任务中,以衡量生成的面部图像与真实面部图像之间的相似性。
计算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=1∑N(xgi−xri)2+(ygi−yri)2
其中:
以下是一个用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)
结构相似性指数(Structural Similarity Index,简称SSIM)是一种用于衡量两幅图像之间相似度的指标,它不仅考虑了亮度、对比度,还考虑了结构信息。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)
其中:
SSIM的值范围通常在 -1 到 1 之间,值越接近1表示两幅图像越相似,质量越高。
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 之间,值越高表示两幅图像越相似。
FID(Fréchet Inception Distance)是一种用于评估生成模型性能的指标,特别是在生成对抗网络(GANs)中广泛使用。它旨在测量生成图像与真实图像分布之间的差异,即生成图像的质量和多样性。较低的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−μG∣∣2+Tr(ΣP+ΣG−2∗ΣPΣG)
其中:
要计算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