图像质量评价指标计算python代码,PSNR,SSIM,fsim,niqe,lpips,rmse,德尔塔δe

图像质量评价指标计算python,PSNR,SSIM,fsim,niqe,lpips,rmse,德尔塔δe

import numpy as np
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
import os
import torch
import matplotlib.pyplot as plt
import cv2
from fsim import FSIM, FSIMc
from PIL import Image, ImageDraw, ImageFont
import Niqe
import lpips
from sklearn.metrics import mean_squared_error
from colormath.color_objects import LabColor
from colormath.color_diff import delta_e_cie1976
def cal_ssim_psnr(path1,path2):#一次性读一个文件夹
    img_low=os.listdir(path1)
    img_high=os.listdir(path2)

    cal_psnr=[]
    cal_ssim=[]
    for i in range(15):
        # print(path1+'/'+ img_low[i])
        img1 = cv2.imread(path1 +'/'+ img_low[i])
        img2 = cv2.imread(path2 +'/'+ img_high[i])
        cal_psnr.append(psnr(img1, img2))
        cal_ssim.append(ssim(img1, img2, channel_axis=2))
    return np.array(cal_psnr).mean(),np.array(cal_ssim).mean()

def cal_fsim(path1,path2):#一次性读一个文件夹
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)

    cal_fsim = []
    for i in range(15):
        bw = False
        # Size of the batch for training
        batch_size = 1

        # Read reference and distorted images
        img1 = Image.open(path1 +'/'+ img_low[i]).convert('RGB')
        img1 = torch.from_numpy(np.asarray(img1))
        img1 = img1.permute(2, 0, 1)
        img1 = img1.unsqueeze(0).type(torch.FloatTensor)
        img2 = torch.clamp(torch.rand(img1.size()) * 255.0, 0, 255.0)

        # Create fake batch (for testing)
        img1b = torch.cat(batch_size * [img1], 0)
        img2b = torch.cat(batch_size * [img2], 0)

        if torch.cuda.is_available():
            img1b = img1b.cuda()
            img2b = img2b.cuda()

        # Create FSIM loss
        FSIM_loss = FSIMc()
        loss = FSIM_loss(img1b, img2b)
        cal_fsim.append(loss)
    return np.array(cal_fsim).mean()

def cal_niqe(path1,path2):#一次性读一个文件夹
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)

    cal_niqe = []
    for i in range(15):
        ref = np.array(Image.open(path1 +'/'+ img_low[i]).convert('LA'))[:,:,0] # ref
        cal_niqe.append(Niqe.niqe(ref))
    return np.array(cal_niqe).mean()

def cal_lpips(path1,path2):#一次性读一个文件夹
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)
    
    use_gpu = True         # Whether to use GPU
    spatial = True 
    cal_lpips = []
    for i in range(15):
        loss_fn = lpips.LPIPS(net='alex', spatial=spatial)
        if(use_gpu):
	        loss_fn.cuda()
        dummy_img0 = lpips.im2tensor(lpips.load_image(path1 +'/'+ img_low[i]))
        dummy_img1 = lpips.im2tensor(lpips.load_image(path2 +'/'+ img_low[i]))
        dummy_img0 = dummy_img0.cuda()
        dummy_img1 = dummy_img1.cuda()
        dist = loss_fn.forward(dummy_img0, dummy_img1)
        cal_lpips.append(dist.mean().item())
    return np.array(cal_lpips).mean()

def cal_rmse(path1,path2):#一次性读一个文件夹
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)
    cal_rmse = []
    for i in range(15):
        rms = mean_squared_error(path1 +'/'+ img_low[i], path1 +'/'+ img_high[i], squared=False)
        cal_rmse.append(rms)
    return np.array(cal_rmse).mean()

def cal_deltae(path1,path2):#一次性读一个文件夹
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)
    cal_deltae = []
    for i in range(15):
        deltae = skimage.color.deltaE_cie76(path1 +'/'+ img_low[i], path1 +'/'+ img_high[i])
        cal_deltae.append(deltae)
    return np.array(cal_deltae).mean()

def pi(path1,path2):
    img_low = os.listdir(path1)
    img_high = os.listdir(path2)
    cal_pi = []
    for i in range(15):
        
        cal_pi.append(pi)
    return np.array(cal_pi).mean()

def cal_all(path_high,path,txt_path):
    print('computing...')
    file = open(txt_path, 'w', encoding='utf-8')
    file_list=os.listdir(path)
    c_psnr=[]
    c_ssim=[]
    c_fsim=[]
    c_niqe=[]
    c_lpips=[]
    c_rmse=[]
    c_deltae=[]
    for i in file_list:
        print(i)
        a,b=cal_ssim_psnr(path+i,path_high)
        # c=cal_fsim(path+i,path_high)
        c=0
        d=cal_niqe(path+i,path_high)
        e=cal_lpips(path+i,path_high)
        f=cal_rmse(path+i,path_high)
        g=cal_deltae(path+i,path_high)
        c_psnr.append(a)
        c_ssim.append(b)
        c_fsim.append(c)
        c_niqe.append(d)
        c_lpips.append(e)
        c_rmse.append(f)
        c_deltae.append(g)
        print(i+' psnr:'+str(a)+'    '+'    '+' ssim:'+str(b)+'    '+'fsim: '+str(c)+'    '+' niqe:'+str(d)+'    '+'lpips: '+str(e)+'    '+' rmse:'+str(f)+'    '+'deltae: '+str(g)+'\n')
    file.close()
print('sss')
cal_all('G:/pjzb/picture/gt','G:/pjzb/picture/enhance/','G:/pjzb/out_data_outdoor01.txt')#文件放这
#其中:gt是一级文件夹,里面直接是不同的图片
#增强结果是二级文件夹,下一级是不同方法的文件夹,再下一级是不同的图片
#为什么每次循环是15:因为lol的test长度是15

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答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
发出的红包

打赏作者

天天写点代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值