批量计算PSNR,SSIM,MSE

批量计算PSNR,SSIM,MSE

这里有几点要注意的:

1.对比两张图片的函数SSIM具体是structural_similarity:

      Ⅰ:第一个参数和第二个参数是要对比的两张图片;

      Ⅱ:参数中有个full,默认为True,如果为True会把两张图的相似部分返回,如果为False就不返回了;

      Ⅳ:返回值full为False的时候有2个,一个是mssim浮点型的相似度,1代表2张图一模一样。0代表完全不一样,grad返回两张图片不同的地方类型为ndarray;

2.SSIM返回的ndarray里面的值为[0, 1]的float型,而OpenCV的[0, 255]为uint8型,可以通过这样的方式转换:

      Ⅰ:diff = (diff * 255).astype("uint8")

3.cv2.threshold函数,设置一个阈值和一个颜色,将传入的图片没有达到这个阈值的,转换为这个颜色。

import os
import cv2
import math
import time
import numpy as np
from PIL import Image
import torch.nn.functional as F
from skimage.metrics import structural_similarity

start = time.time()

def psnr(img1, img2):  # 但是其值不能很好地反映人眼主观感受。一般取值范围:20-40.值越大,视频质量越好
    mse = np.mean((img1 / 1. - img2 / 1.) ** 2)
    if mse < 1.0e-10:
        return 100 * 1.0
    return 10 * math.log10(255.0 * 255.0 / mse)


def mse(img1, img2):  # 指参数估计值与参数真值之差平方的期望值,在图像处理算法中就是处理后图像像素值与原始像素值之差平方和的均值,越小越好
    mse = np.mean((img1 / 1. - img2 / 1.) ** 2)
    return mse


def ssim(y_true, y_pred):  # 其值可以较好地反映人眼主观感受。一般取值范围:0-1.值越大,视频质量越好
    ssim = structural_similarity(y_true, y_pred, multichannel=True, full=False)  # 如果输入是多通道(彩色)图像,设置 multichannel=True
    return ssim


path1 = './images/test1/'  # 指定输出结果文件夹
path2 = './images/test2/'  # 指定原图文件夹
f_nums = len(os.listdir(path1)) - 2
list_psnr = []
list_ssim = []
list_mse = []
file = open(r'psnr-ssim-scene3-70-100.txt', mode='w',encoding='utf-8')
for i in range(1, f_nums):
    print('第%s张图片' % i)
    img_a = Image.open(path1 + str(i) + '.png')
    img_b = Image.open(path2 + str(i) + '.png')
    img_a = np.array(img_a)
    img_b = np.array(img_b)

    psnr_num = psnr(img_a, img_b)
    ssim_num = ssim(img_a, img_b)
    mse_num = mse(img_a, img_b)
    print('psnr_num', psnr_num)
    print('ssim_num', ssim_num)
    print('mse_num', mse_num)
    list_ssim.append(ssim_num)
    list_psnr.append(psnr_num)
    list_mse.append(mse_num)
    file.write('第%s张图片:' % i + '\n')
    file.write('psnr_num, {:.5f}'.format(psnr_num) + '\n')
    file.write('ssim_num, {:.5f}'.format(ssim_num) + '\n')
    file.write('mse_num, {:.5f}'.format(mse_num) + '\n')


print("平均PSNR:", np.mean(list_psnr))  # ,list_psnr)
print("平均SSIM:", np.mean(list_ssim))  # ,list_ssim)
print("平均MSE:", np.mean(list_mse))  # ,list_mse)

elapsed = (time.time() - start)
print("Time used:", elapsed)
file.write("\n")
file.write("汇总:\n")
file.write('平均PSNR, {:.5f}'.format(np.mean(list_psnr)) + '\n')
file.write('平均SSIM, {:.5f}'.format(np.mean(list_ssim)) + '\n')
file.write('平均MSE, {:.5f}'.format(np.mean(list_mse)) + '\n')
file.write('Time used, {:.5f}'.format(elapsed) + '\n')
file.close()






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值