目录
峰值信噪比PSNR(Peak Signal-to-Noise Ratio)
结构相似度SSlM(Structural Similarity Index Measurement)
FID(Fréchet Inception Distance)
代码实践:计算两张图片之间的PSNR和SSIM
代码实践:计算两个文件夹图片之间的PSNR和SSIM
基于Python计算两张图片/两个文件夹图片之间的PSNR和SSIM参考另一篇博客:IQA-PyTorch快速使用教程
峰值信噪比PSNR(Peak Signal-to-Noise Ratio)
PSNR是最常用的图像质量评价指标之一。它衡量修复图像与原始图像之间的均方根误差,并将其转化为分贝单位。PSNR值越高,表示修复图像与原始图像越接近。PSNR的单位为dB。
PSNR的计算公式如下:
式中:为图像可取到的最大像素值,为修复图像和对应真实图像的均方误差。
结构相似度SSlM(Structural Similarity Index Measurement)
SSIM是另一个衡量图像质量的指标,它考虑了亮度、对比度和结构信息之间的相似性。SSIM的值在-1到1之间,越接近1表示修复图像与原始图像越相似。
SSIM基于滑动窗口实现计算,即每次计算时从图片上取一个尺寸为N×N的窗口,基于窗口计算SSIM的值,遍历整张图像后再对所有窗口的值取平均,得出整张图像的SSIM值。
SSIM的计算公式如下:
FID(Fréchet Inception Distance)
FID是一种常用于评估图像生成模型和修复算法性能的指标,是目前广泛使用的评估指标之一。它结合了图像质量和多样性,可以用来计算真实图像与生成图像的特征向量之间距离的一种度量。FID值越小,则相似程度越高。最好的情况是FID=0,表示两个图像完全相同。
代码实践:计算两张图片之间的PSNR和SSIM
import pyiqa
import torchprint(pyiqa.list_models())
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")# psnr
# iqa_metric = pyiqa.create_metric('psnr', test_y_channel=True, color_space='ycbcr').to(device)
# ssim
iqa_metric = pyiqa.create_metric('ssim', test_y_channel=True, color_space='ycbcr').to(device)score_fr = iqa_metric('./111/图片1.png', './222/图片2.png')
value = score_fr.cpu().item() # 将张量移动到 CPU,再获取数值
print(value)
代码实践:计算两个文件夹图片之间的PSNR和SSIM
import os
import cv2
import numpy as np
import pyiqa
import torch# Device setup
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
iqa_metric = pyiqa.create_metric('psnr', test_y_channel=True, color_space='ycbcr').to(device)
# iqa_metric = pyiqa.create_metric('ssim', test_y_channel=True, color_space='ycbcr').to(device)# Path to ground truth and results
gt_path = './111'
results_path = './222'# Function to compute PSNR values
def calculate_psnr(gt_path, results_path):psnr_values = []# List all images in the ground truth and results directoriesgt_images = sorted(os.listdir(gt_path))result_images = sorted(os.listdir(results_path))for gt_image, result_image in zip(gt_images, result_images):gt_image_path = os.path.join(gt_path, gt_image)result_image_path = os.path.join(results_path, result_image)# Read the imagesgt_img = cv2.imread(gt_image_path, cv2.IMREAD_COLOR).astype(np.float32) / 255.0result_img = cv2.imread(result_image_path, cv2.IMREAD_COLOR).astype(np.float32) / 255.0# Check if images have the same shapeif gt_img.shape != result_img.shape:print(f'Skipping {gt_image} and {result_image} due to mismatched dimensions.')continue# Move images to the device and compute PSNRgt_tensor = torch.tensor(gt_img).permute(2, 0, 1).unsqueeze(0).to(device) # (1, C, H, W)result_tensor = torch.tensor(result_img).permute(2, 0, 1).unsqueeze(0).to(device) # (1, C, H, W)psnr_value = iqa_metric(result_tensor, gt_tensor).item()psnr_values.append(psnr_value)print(f'PSNR between {gt_image} and {result_image}: {psnr_value:.2f} dB')return psnr_values# Call the function
psnr_results = calculate_psnr(gt_path, results_path)
average_psnr = np.mean(psnr_results) if psnr_results else 0
print(f'Average PSNR: {average_psnr:.2f} dB')
以上代码如有错误,欢迎各位读者大大在评论区指出!
参考链接:
1、图像处理之图像质量评价指标PSNR(峰值信噪比)-CSDN博客
2、图像质量评估指标——SSIM介绍及计算方法-CSDN博客
3、【pytorch】FID讲解以及pytorch实现