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)
结果,分别更改一下两个文件夹内的图片命名(结果和原来的位置一致),就可以进行前面的计算。