批量测试图像的LPIPS、SSIM、PSNR指标,并生成CSV文件结果

目录

背景:

代码:

结果


背景:

由于论文需要,我将测试代码进行了修改,融入了LPIPS等指标,关于LPIPS介绍,可以查看博客:

LPIPS图像相似性度量标准:The Unreasonable Effectiveness of Deep Features as a Perceptual Metric_Alocus的博客-CSDN博客_lpips度量

代码:

代码中有两大部分需要进行修改,我在代码中进行了标注。

需要安装一些包,如pip install lpips

有疑问欢迎联系交流。

# -*- coding:utf-8 _*-
import argparse
import os
import cv2
import pandas as pd
import lpips
import torch
import torchvision.transforms as transforms
from skimage.metrics import peak_signal_noise_ratio
from skimage.metrics import structural_similarity

"""
author&wechat:Alocus
QQ:1913434222
data:2022.02.27
"""
#########################需要修改的部分(1)#######################
#abs_path = r'C:\Users\Administrator\Desktop\test\metric'         #绝对路径,存放csv文件位置
abs_path = os.getcwd()
test_set_name = r'Result'                                         #用于生成csv结果文件名字

#result_dir = r'C:\Users\Administrator\Desktop\test\metric\haze'  #存放结果的文件夹路径及名字
result_dir = os.path.join(abs_path,'EPDN_result' )
#GT_dir = r'C:\Users\Administrator\Desktop\test\metric\GT'        #存放GT的文件夹路径及名字
GT_dir = os.path.join(abs_path,'test-label' )
split = '_'                                                      #从result中分割出GT名字的符号,如10222_01_0.8411.png 中第一个符号为_,分割后GT为10222.png。 如何实际二者相同,请选择GT中没有的符号。
###########################################################

#存储列表
result_images =[] #结果图片名字列表
GT_image = []     #GT图片名字列表
image_number = [] #图片读取求指标的id
image_name = []   #图片读取求指标的id 对应的图片名
psnr_number = []  #psnr值列表
ssim_number = []  #ssim值列表
lpips_number = [] #lpips值列表
for root, _, fnames in sorted(os.walk(result_dir)):
    for fname in fnames:
        #path = os.path.join(root, fname)
        result_images.append(fname)                       ##结果图片名字列表

for root, _, fnames in sorted(os.walk(GT_dir)):
    for fname in fnames:
        #path = os.path.join(root, fname)
        GT_image.append(fname)                            #GT图片名字列表

for i in range(len(result_images)):
    print("now"+str(i))
    name_extension = result_images[i]                     #result图片全名
    (name, extension) = os.path.splitext(name_extension)  #分离名字和后缀

    ###########拼接出对应的GT中的全名###需要修改的部分(2)#########################
    index = name.find(split)                              #根据编名方式,提取出GT部分名字结束下标
    if index == -1:                                       #没有找到。则直接按照结果的名字拼接成GT名字
        index = len(name)
    find_name = name[:index]                              #提取出在GT中对应的图片名
    GT_name = 'label'+find_name[7:11]+".png"                     #拼接结果

    result_name_path =os.path.join(result_dir,name_extension)#拼接result 路径和名字
    GT_name_path =os.path.join(GT_dir,GT_name)            #拼接GT路径和名字
    # print(result_name_path)
    # print(GT_name_path)

    #开始计算指标
    result = cv2.imread(result_name_path)
    GT = cv2.imread(GT_name_path)
    psnr = peak_signal_noise_ratio(GT,result)
    ssim= structural_similarity(GT,result, multichannel=True)

    loss_fn_alex = lpips.LPIPS(net='alex',version=0.1) # best forward scores
    loss_fn_vgg = lpips.LPIPS(net='vgg',version=0.1) # closer to "traditional" perceptual loss, when used for optimization
    test1_res = result
    test1_label = GT
    transf = transforms.ToTensor()
    test1_label = transf(test1_label)
    test1_res = transf(test1_res)
    test1_ress = test1_res.to(torch.float32).unsqueeze(0)
    test1_labell = test1_label.to(torch.float32).unsqueeze(0)
    lpips_loss = loss_fn_alex(test1_ress, test1_labell)

    #计算结果存入列表
    image_number.append(str(i))
    image_name.append(name)
    psnr_number.append(psnr)
    ssim_number.append(ssim)
    lpips_number.append(lpips_loss)
#计算列表中指标值的平均值函数
def ave(lis):
    s = 0
    total_num = len(lis)
    for i in lis:
        s = s + i
    return s/total_num
#计算列表中指标值的平均值,并加入列表
total = 'total(' + str(len(image_number)) + ')'
image_number.append(total)
image_name.append('average')
psnr_ave = ave(psnr_number)
ssim_ave = ave(ssim_number)
lpips_ave = ave(lpips_number)
psnr_number.append(psnr_ave)
ssim_number.append(ssim_ave)
lpips_number.append(lpips_ave)
#生成csv文件
dit = {'image_number':image_number, 'result_name':image_name, 'psnr':psnr_number,'ssim':ssim_number,'lpips':lpips_number}
df = pd.DataFrame(dit)
csv_name = test_set_name + '_ssim&psnr&lpips.csv'    #拼接csv名字
csv_path = os.path.join(abs_path,csv_name)     #csv全路径
df.to_csv(csv_path,columns=['image_number','result_name','psnr','ssim','lpips'],index=False,sep=',')

print('————————————————————————————finish————————————————————————————')
print('csv_save_path:',csv_path)               ##csv全路径
print('result_photos_num:',len(result_images)) #result_photos_num
print('GT_photos_num:',len(GT_image))          #GT_photos_num
print('psnr_ave:',psnr_ave)                    #psnr_ave
print('ssim_ave:',ssim_ave)                    #ssim_ave
print('lpips_ave:',lpips_ave)                    #ssim_ave

结果:

注:有小伙伴测试时还是出现问题 ,我打包了个测试文件,图片可以按其命名放入对应文件夹,或者修改对应代码。

链接:https://pan.baidu.com/s/1xcScdzQofvQPkuVPy1FAVw?pwd=LUCK 
提取码:LUCK

  • 13
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
### 回答1: 在Matlab中,可以使用`psnr()`函数来计算彩色图像的峰值信噪比(PSNR)。该函数的使用方法如下: ```matlab psnr_value = psnr(I1, I2); ``` 其中,`I1`是原始图像,`I2`是经过处理或压缩后的图像。函数将返回计算得到的PSNR值。 另外,可以使用`ssim()`函数来计算彩色图像的结构相似性指数(SSIM)。该函数的使用方法如下: ```matlab ssim_value = ssim(I1, I2); ``` 其中,`I1`为原始图像,`I2`为经过处理或压缩后的图像。函数将返回计算得到的SSIM值。 需要注意的是,`psnr()`和`ssim()`函数只能用于灰度图像,不能直接用于彩色图像。因此,对于彩色图像,通常需要将其转换为亮度(Y)和色度(Cb和Cr)分量,然后分别计算PSNRSSIM值。具体步骤如下: 1. 使用`rgb2ycbcr()`函数将彩色图像转换为YCbCr颜色空间,得到亮度(Y)和色度(Cb和Cr)分量。 2. 分别取出Y通道,在Y通道上计算PSNRSSIM值。 3. 将原始图像和经过处理或压缩后的图像的Cb和Cr通道分别重采样为与Y通道相同的分辨率。 4. 在重采样后的Cb和Cr通道上计算PSNRSSIM值。 5. 将Y通道和CbCr通道的PSNRSSIM值加权平均,得到最终的PSNRSSIM值。 以上是通过Matlab实现彩色图像PSNRSSIM计算的基本步骤。具体的实现细节可以根据实际需求进行调整和优化。 ### 回答2: 在Matlab中,可以使用以下步骤来测试彩色图像PSNR(峰值信噪比)和SSIM(结构相似性)。 1. 导入所需的图像处理包:首先,需要导入Image Processing Toolbox包,可以使用以下命令导入该包: ```matlab addpath(genpath('toolbox_location')); ``` 这里,`toolbox_location`是Image Processing Toolbox所在的路径。 2. 读取图像:使用`imread`函数读取原始图像测试图像。例如: ```matlab original_image = imread('original_image.jpg'); test_image = imread('test_image.jpg'); ``` 3. 转换图像类型:确保原始图像测试图像的数据类型为double类型,可以使用以下命令: ```matlab original_image = im2double(original_image); test_image = im2double(test_image); ``` 4. 计算PSNR:通过调用`psnr`函数来计算PSNR值。该函数需要原始图像测试图像作为输入参数。例如: ```matlab psnr_value = psnr(test_image, original_image); ``` 5. 计算SSIM:通过调用`ssim`函数来计算SSIM值。该函数需要原始图像测试图像作为输入参数。例如: ```matlab ssim_value = ssim(test_image, original_image); ``` 6. 显示结果:打印PSNR值和SSIM值。可以使用以下命令显示结果: ```matlab disp(['PSNR value: ', num2str(psnr_value)]); disp(['SSIM value: ', num2str(ssim_value)]); ``` 以上是使用Matlab测试彩色图像PSNRSSIM的基本步骤。根据需要可以添加其他的图像处理操作。 ### 回答3: 使用MATLAB测试彩色图像PSNRSSIM可以按照以下步骤进行: 1. 首先,读取原始图像和经过处理的图像。可以使用imread函数读取图像文件。 2. 将图像数据转换为浮点数据类型,以便进行计算。可以使用im2double函数将图像数据转换为[0,1]之间的浮点数。 3. 使用psnr函数计算图像的峰值信噪比(PSNR)。该函数的参数包括原始图像和处理后的图像。例如,可以使用以下代码计算PSNRpsnr_value = psnr(original_image, processed_image); 其中,original_image代表原始图像数据,processed_image代表处理后的图像数据,psnr_value代表计算得到的PSNR值。 4. 使用ssim函数计算图像的结构相似度指标SSIM)。与PSNR类似,ssim函数的参数也是原始图像和处理后的图像。例如,可以使用以下代码计算SSIM: ssim_value = ssim(original_image, processed_image); 其中,original_image代表原始图像数据,processed_image代表处理后的图像数据,ssim_value代表计算得到的SSIM值。 5. 最后,根据实际需求将PSNRSSIM值进行输出或保存。 需要注意的是,使用psnrssim函数计算PSNRSSIM值时,处理前后的图像需要是相同大小的彩色图像。否则,可能需要对图像进行缩放或裁剪,以使其大小一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

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

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

打赏作者

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

抵扣说明:

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

余额充值