简单的按照评价指标公式,计算出待评价图像与标准图像之间的评价指标值,评价公式如下图:
M和N表示图像的尺寸,L表示图像的灰度取值范围,对于8bit的灰度图像而言取L=255
实验数据如下所示:
import glob
import math
import numpy as np
from skimage import io
road1 = glob.glob(".\\data\\*.jpeg") # 获取标准图像的文件路径
standard = io.imread(road1[0]) # 读取标准图像文件
standard = standard.astype(np.int32) # 将 uint8类型的数据转换为int32类型便于后面运算
road2 = glob.glob(".\\data\\*.bmp") # 获取待评价图像的文件路径
m = len(road2) # 获取待评价图像的数量
gray = 255 # 定义灰度范围值,方便后续计算
strname = 'ans.txt' # 定义一个文档名称,用于保存结果
# 定义函数calMSE,计算标准图像std与目标图像aim之间的均方误差(MSE)评价指标
def calMSE(std, aim):
# 利用循环计算两幅影像间相同位置像素的灰度值的差的平方和
num = 0
for i in range(std.shape[0]):
for j in range(std.shape[1]):
num += math.pow(std[i, j] - aim[i, j], 2)
mse = num / (std.shape[0] * std.shape[1])
return mse
# 定义函数calPSNR,计算标准图像std与目标图像aim之间的峰值信噪比(PSNR)评价指标
def calPSNR(std, aim):
num = 0
for i in range(std.shape[0]):
for j in range(std.shape[1]):
num += (std[i, j] - aim[i, j]) * (std[i, j] - aim[i, j])
mse = num / (std.shape[0] * std.shape[1])
psnr = 10 * math.log(gray * gray / mse, 10)
return psnr
f = open(strname, "w") # 打开文件
for i in range(m):
img = io.imread(road2[i]) # 读取一张待评价的图片
img = img.astype(np.int32)
mse = calMSE(standard, img) # 计算MSE指标
psnr = calPSNR(standard, img) # 计算PSNR指标
name = '图像名称: ' + road2[i] + ', MSE指标: ' + str(mse) + ', PSNR指标: ' + str(psnr)
f.write(str(name)) # 将结果字符串写入文件
f.write('\n') # 换行使文件中结果更加清楚
f.close() # 关闭文件