【图像评价指标以及代码】 PSNR, SSIM, FID,NMSE讲解以及代码

评价指标以及计算

峰值信噪比 (PSNR):

“Peak Signal-to-Noise Ratio”,中文意思即为峰值信噪比,是衡量图像质量的指标之一。用于衡量重构图像与原始图像之间的相似性和失真程度。PSNR只能提供关于图像整体质量的信息,不能捕捉到细节和感知的差异。

根据公式可见:当MSE越小的时候质量越好,则PSNR越大越好。
在这里插入图片描述
在这里插入图片描述
由均方误差得到,MAX1是像素里面最大的值,一般为1或者255。

def psnr(res,gt):
    mse = np.mean((res - gt) ** 2)
    if(mse == 0):
        return 100
    max_pixel = 1
    psnr = 20 * log10(max_pixel / sqrt(mse))
    return psnr

结构相似性 (SSIM):

此方法也称为(Structural Similarity),是一种用来衡量两幅图像相似度的指标。 SSIM 方法是通过将图像看作多个区域,并比较这些区域内的结构、亮度和对比度等统 计量来进行评估的。SSIM 算法考虑了人类对图像感知的特性,更符合人眼视觉特性。 SSIM 算法比较复杂,需要对图像局部结构信息和全局结构信息进行比对。给定两个图 像 x 和 y,两张图像的结构相似性的公式可以表达为公式 2-7。

在这里插入图片描述

" S S I M " ( x , y ) = ( 2 μ x μ y + c 1 ) ( 2 σ x y + c 2 ) / ( μ x 2 + μ y 2 + c 1 ) ( σ x 2 + σ y 2 + c 2 ) "SSIM" (x,y)=(2μ_x μ_y+c_1 )(2σ_xy+c_2 )/(μ_x^2+μ_y^2+c_1 )(σ_x^2+σ_y^2+c_2 ) "SSIM"(x,y)=(2μxμy+c1)(2σxy+c2)/(μx2+μy2+c1)(σx2+σy2+c2)

返回的值是: [0, 1] 范围内的 SSIM 分数,越接近 1 表示两幅图像越相似。

from skimage.metrics import structural_similarity as ssim

def calculate_ssim(img1, img2):
    # 计算 SSIM
    ssim_score = ssim(img1, img2, multichannel=True)
    
    return ssim_score

# 示例用法
img1 = ...  # 第一幅图像数据,类型为numpy数组,范围为0-1
img2 = ...  # 第二幅图像数据,类型为numpy数组,范围为0-1

score = calculate_ssim(img1, img2)
print("SSIM score:", score)

# 或者使用下面代码也可以
#-*- codeing = utf-8 -*-
#@Time : 2023/4/27 0027 14:43
#@Author : Tom
#@File : SSIM.py
#@Software : PyCharm

import torch
import torch.nn.functional as F

def ssim(img1, img2, window_size=11, size_average=True, full=False):
    # 常量,用于计算均值和方差
    C1 = (0.01 * 255) ** 2
    C2 = (0.03 * 255) ** 2

    # 平均池化滤波器
    window = torch.ones(3, 1, window_size, window_size).float().cuda()
    mu1 = F.conv2d(img1, window, padding=window_size//2, groups=3)
    mu2 = F.conv2d(img2, window, padding=window_size//2, groups=3)

    # 平均值和方差
    mu1_sq, mu2_sq, mu1_mu2 = mu1 ** 2, mu2 ** 2, mu1 * mu2
    sigma1_sq = F.conv2d(img1 ** 2, window, padding=window_size//2, groups=3) - mu1_sq
    sigma2_sq = F.conv2d(img2 ** 2, window, padding=window_size//2, groups=3) - mu2_sq
    sigma12 = F.conv2d(img1 * img2, window, padding=window_size//2, groups=3) - mu1_mu2

    # SSIM 的计算公式
    ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
    if size_average:
        ssim_value = torch.mean(ssim_map)
    else:
        ssim_value = torch.mean(ssim_map, dim=(1, 2, 3))

    # 如果设置了 full=True,返回 SSIM 的值和 SSIM 图像的各通道值
    if full:
        return ssim_value, ssim_map
    else:
        return ssim_value


img1 = torch.ones(1, 3, 256, 256).cuda()
img2 = torch.ones(1, 3, 256, 256).cuda()

ssim_value = ssim(img1, img2, window_size=11)
print(ssim_value)

归一化均方误差(NMSE):

归一化均方误差(Normalized Mean Squared Error)

NMSE的值总是在0和1之间(包括0和1),值越小表示模型的性能越好。

def nmse(res,gt):
    Norm = np.linalg.norm((gt * gt),ord=2) # 计算 'gt' 的平方的2-范数(也就是欧几里得长度),存储在变量 'Norm' 中。这一步是为了避免在分母中出现零,从而导致除零错误
    if np.all(Norm == 0): # 如果 'Norm' 等于零(也就是说,如果 'gt' 是全零向量),那么函数直接返回0。这是因为对于全零向量,任何误差都会得到无穷大的NMSE。
        return 0 
    else:
        nmse = np.linalg.norm(((res - gt) * (res - gt)),ord=2) / Norm # 算 'res' 和 'gt' 的差的平方的2-范数,然后除以 'Norm'。这就是NMSE的定义:误差的平方和除以目标值的平方和。
    return nmse

弗雷歇距离(FID)

Fréchet Inception Distance(FID) 是用于衡量生成模型生成图像与真实图像之间差异的指标,是通过比较它们在Inception v3[32]模型的特征空间中的分布距离来计算的。FID使用的特征向量是Inception v3模型的倒数第二个全连接层输出的高维向量,这个向量可以捕捉到图像的视觉特征信息。FID值可以用来度量生成模型生成的图像与真实图像的相似程度,FID值越小表示两图像在特征空间中分布越接近,相似度越高。当两幅图像完全相同时,它们的FID值为0。

在这里插入图片描述

F I D = ∣ ∣ μ r − μ g ∣ ∣ 2 + T r ( Σ r + Σ g − 2 〖 ( Σ r Σ g ) 〗 ( 1 / 2 ) ) FID=∣∣μ_r-μ_g∣∣^2+Tr(Σ_r+Σ_g-2〖(Σ_r Σ_g)〗^(1/2)) FID=∣∣μrμg2+Tr(Σr+Σg2(ΣrΣg)(1/2))
公式中, 为真实图片的特征均值, 为生成图片的特征均值, 为真实图片的协方差矩阵, 为生成图片的协方差矩阵, 为迹。

import torch
import torchvision
import torchvision.transforms as transforms
from pytorch_fid import fid_score

# 准备真实数据分布和生成模型的图像数据
real_images_folder = '/path/to/real/images/folder'
generated_images_folder = '/path/to/generated/images/folder'

# 加载预训练的Inception-v3模型
inception_model = torchvision.models.inception_v3(pretrained=True)

# 定义图像变换
transform = transforms.Compose([
    transforms.Resize(299),
    transforms.CenterCrop(299),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

# 计算FID距离值
fid_value = fid_score.calculate_fid_given_paths([real_images_folder, generated_images_folder],
                                                 inception_model,
                                                 transform=transform)
print('FID value:', fid_value)


pytorch_fid版本不同,使用方式不同,需要注意一下。
两个文件夹里面图片数量需要一样,大小尽量也一样,名字最好对应,这样才会将对应图片进行计算。

最后的使用

    PSNR = []
    NMSE = []
    SSIM = []

    for i, (img, gt) in enumerate(data_loader):
        batch_size = img.size()[0]
        img = img.to(device, dtype=torch.float)
        gt = gt.to(device, dtype=torch.float)

        with torch.no_grad():
            pred = model(img)

        for j in range(batch_size):
            a = pred[j]
            # save_image([pred[j]], images_save + str(i * batch_size + j + 1) + '.png', normalize=False)
            print(images_save + str(i * batch_size + j + 1) + '.png')

        pred, gt = pred.cpu().detach().numpy().squeeze(), gt.cpu().detach().numpy().squeeze()

        for j in range(batch_size):
            PSNR.append(psnr(pred[j], gt[j]))
            NMSE.append(nmse(pred[j], gt[j]))
            SSIM.append(ssim(pred[j], gt[j]))

    PSNR = np.asarray(PSNR)
    NMSE = np.asarray(NMSE)
    SSIM = np.asarray(SSIM)

    PSNR = PSNR.reshape(-1, slice_num)
    NMSE = NMSE.reshape(-1, slice_num)
    SSIM = SSIM.reshape(-1, slice_num)

    PSNR = np.mean(PSNR, axis=1)
    NMSE = np.mean(NMSE, axis=1)
    SSIM = np.mean(SSIM, axis=1) 

    print("PSNR mean:", np.mean(PSNR), "PSNR std:", np.std(PSNR))
    print("NMSE mean:", np.mean(NMSE), "NMSE std:", np.std(NMSE))
    print("SSIM mean:", np.mean(SSIM), "SSIM std:", np.std(SSIM))

通过对每个切片进行求平均,可以得到更详细的评估结果,并且能够观察不同切片之间的差异。如果直接对整个数据进行求平均,可能无法获取到切片级别的信息。因此,进行切片并分别计算每个切片上的指标平均值是一种常见的做法。

### 回答1: PSNR(峰值信噪比)和SSIM(结构相似性)是图像质量评价的两个重要指标。 PSNR是一种用于度量图像质量的指标,通过计算原始图像与经过压缩或处理后的图像之间的峰值信噪比来评估图像的失真程度。峰值信噪比是指信号的最大可能功率与表示这个信号的系统的噪声功率之比。PSNR的计算公式为: PSNR = 10 * log10((最大可能像素值)² / MSE) 其中最大可能像素值是指原始图像中像素的最大值,MSE是均方差,用于度量两个图像之间的差异程度。 SSIM是一种统计方法,用于比较两个图像的结构相似性。它不仅考虑图像的亮度信息,还考虑图像的对比度和结构信息。SSIM计算过程中引入了三个关键的组成部分:亮度相似性、对比度相似性和结构相似性。SSIM的计算公式为: SSIM(x, y) =(2μxμy + C1)(2σxy + C2)/(μx² + μy² + C1)(σx² + σy² + C2) 其中,x和y分别代表两个图像,μx和μy分别代表x和y的平均值,σx²和σy²分别代表x和y的方差,σxy代表x和y的协方差,C1和C2是常数用来稳定计算。 PSNRSSIM是常用的图像质量评价指标PSNR主要用于比较两个图像之间的失真程度,数值越大表示失真越小;而SSIM主要用于比较两个图像之间的结构相似性,数值越接近1表示结构相似性越高。综合应用这两个指标可以更全面地评价图像质量。 ### 回答2: PSNR(Peak Signal-to-Noise Ratio)是一种用于评估图像质量的指标,它通过比较原始图像与经过压缩或失真处理后的图像之间的均方误差,来衡量图像的失真程度。PSNR的计算公式为: PSNR = 10 * log10 (MAX^2 / MSE) 其中 MAX 表示像素数据的最大可能取值,MSE 表示均方误差,即原始图像与失真图像之间每个像素值差的平方的均值。PSNR的值通常以分贝(dB)为单位,数值越大表示图像质量越好。 而 SSIM(Structural Similarity Index)是一种比较图像结构相似性的指标,它主要关注图像的亮度、对比度和结构等方面。SSIM的计算公式为: SSIM = (2 * μx * μy + C1) * (2 * σxy + C2) / (μx^2 + μy^2 + C1) * (σx^2 + σy^2 + C2) 其中 μx 和 μy 表示原始图像和失真图像的亮度平均值,σx 和 σy 表示原始图像和失真图像的方差,σxy 表示原始图像和失真图像的协方差,C1 和 C2 是常数,用于避免分母为零。SSIM的取值范围为[-1, 1],值越接近1表示图像质量越好。 PSNRSSIM是两种常用的图像质量评价指标PSNR主要关注图像的失真程度,适用于需要精确度和灵敏度的场景;而SSIM则关注图像的结构相似性,适用于需要保留图像细节和结构的场景。综合使用PSNRSSIM可以更全面地评价图像的质量。 ### 回答3: 图像质量评价指标是衡量图像质量好坏的方法,其中PSNRSSIM是两个常用的评价指标PSNR(Peak Signal-to-Noise Ratio)是一种用于测量图像失真程度的指标。它计算图像与原始图像之间的峰值信噪比,即原始图像中最大像素值与重建图像与原始图像之间的均方误差的比值。PSNR值越高,表示失真越小,图像质量越好。常用PSNR评价图像压缩算法的效果,如JPEG压缩等。 SSIM(Structural Similarity Index)是一种用于测量图像结构相似性的指标。它考虑了亮度、对比度和结构三个因素间的差异,并综合这些因素计算相似性指数。SSIM值越接近1,表示两幅图像越相似,图像质量越好。SSIM主要用于评价图像处理算法的效果,如去噪、增强等。 PSNRSSIM都是客观评价指标,对失真图像与原始图像之间的差异进行量化。它们都有各自的使用范围和场景,没有绝对优劣之分。在评价图像质量时,可以综合考虑PSNRSSIM,以及其他评价指标,综合评估图像的视觉感知质量。 需要注意的是,PSNRSSIM仅能从一定程度上反映图像质量,对于某些特殊场景或者人眼难以察觉的差异可能会存在局限性。因此,在实际应用中,还需要结合人眼主观评价、其他更多的评价指标以及具体的应用需求来全面评价图像的质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值