Python计算峰值信噪比PSNR以及相似性度量SSIM,并批量输出保存为txt格式文件

1.PSNR以及SSIM

  • 自行了解基本知识(多用于图像之间的相似程度);
  • 例如 生成对抗网络GAN输出的图像与原始图像之间的度量指标。
  • PSNR (值越大越接近真实原始图像) (无穷);
  • SSIM(值越大,与真实图像之间的相似(亮度、色彩、对比度等方面)越接近),其值位于(0,1)之间。

2.实现批量图像对PSNR、SSIM的计算

  • 之前查阅很多文章,很多在计算PSNR以及SSIM时,要么只能单张图像进行测试,要么就不能保存。
  • 在借鉴很多文章 代码片(不一一列举出来)后,文章能够进行输入原始图像文件夹、生成图像的文件夹之后,运行计算两个度量的指标。
  • 在terminal展示出来的同时,计算每个图像对(原始与生成图像对)的PSNR以及SSIM,保存到txt,便于后续转为Excel格式进行可视化等操作作铺垫。
  • 事先安装好代码中涉及的‘计算包‘’。
  • 前提:需要同样的图像文件名,例如(原始文件夹)0001.jpg,对应(生成文图像件夹)0001.jpg,图像位置错位以及别的原因,只会让结果有问题,或者计算的结果值很低。
#conding utf-8
# -*- codingen: utf-8 -*-
#文章参考的博客
# https://www.runoob.com/python/python-func-open.html
# https://blog.csdn.net/weixin_42630613/article/details/106808632
import argparse
import glob
import os
import cv2
from skimage.measure import compare_psnr, compare_ssim

txt_file = open(r'F:\ESRGAN-att\data\inference','a')

def calc_measures(hr_path, calc_psnr=True, calc_ssim=True):
	HR_files = glob.glob(hr_path + '/*')
    mean_psnr = 0
    mean_ssim = 0

    for file in HR_files:
        hr_img = cv2.imread(file)
        filename = file.rsplit('/', 1)[-1]
        path = os.path.join(args.inference_result, filename)

        if not os.path.isfile(path):
            raise FileNotFoundError('')

        inf_img = cv2.imread(path)

        print('-' * 10)
        if calc_psnr:
            psnr = compare_psnr(hr_img, inf_img)
            print('{0} : PSNR {1:.3f} dB'.format(filename, psnr))
            mean_psnr += psnr
        if calc_ssim:
            ssim = compare_ssim(hr_img, inf_img, multichannel=True)  # 单个SSIM比较值
            print('{0} : SSIM {1:.3f}'.format(filename, ssim))
            mean_ssim += ssim
        txt_file.write('PSNR,{:.3f} , SSIM, {:.3f}'.format(psnr , ssim))
        txt_file.write('\n')

    print('-' * 10)
    if calc_psnr:
        M_psnr = mean_psnr / len(HR_files)
        print('mean-PSNR {:.3f} dB'.format(M_psnr))
    if calc_ssim:
        M_ssim = mean_ssim / len(HR_files)
        print('mean-SSIM {:.3f}'.format(M_ssim))
    txt_file.write('mean-PSNR, {:.3f} , mean-SSIM, {:.3f}'.format(M_psnr,M_ssim))
    txt_file.write('\n'*2)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument('--HR_data_dir', default=r'data/HR_file', type=str)  #原始图像路径
    parser.add_argument('--inference_result', default=r'data/SR_file', type=str)  #生成图像路径

    args = parser.parse_args()
    calc_measures(args.HR_data_dir, calc_psnr=True, calc_ssim=True)

更改路径即可

  • 结果 TXT文件中:(单个图片,以及最终的平均得分)
    在这里插入图片描述

链接自己的其他可能用得上的博客

1) 图片格式互换

1.python3 ,批量的jpg图片与同名png格式一一互换

2)修改数据同名,方能测试

对于事先更改文件按顺序同名的代码,网上有不少,事先准备好。
之前看见一篇文章的同名更改文件代码忘记收藏链接了,自己保存了。如下:

#coding=utf-8
import os
path = 'data/test_rename/'  #原始文件夹,可以覆盖其中原来的文件
files=os.listdir(path)

#文件名进行排序,
files.sort()

n=0
s=str(n+1) #int转str,1开始
s = s.zfill(15) #不足补零,按自己需求设置

#遍历
for i in files:
    old_name=path+files[n]

    #设置新文件名
    new_name=path+'Evaluate'+s+'.jpg'   #图片格式,按照自己的来
    os.rename(old_name,new_name)
    print(old_name,'==>',new_name)
   
    #更新
    n+=1
    s = str(n+1)
    s = s.zfill(15)

结果,分别更改一下两个文件夹内的图片命名(结果和原来的位置一致),就可以进行前面的计算。
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值