1.首先计算mse。
对于三通道的RGB图像 计算mse的数学表达式是:
转换成代码来写:
2.得到mse后计算PSNR。
转换为代码来写:
或者将像素归一化:
理论上(数学意义上讲两个式子是相等的),但实际结果是:
两种计算方式的结果不同。原因是如果中img1-img2的结果为负,那么得到的结果将是ASCII的补码,也就是,如果img1-img2是-2,那么输出将是256-2=254所以导致mse增大,如果img1某个点的像素比img2小,而两者差别又比较大,这个绝对值比较大的负值就会变成一个比较小的正值,mse的结果也会偏小,那么PSNR的值就会偏大。把上面的式子用下面的式子代替即可解决问题
完整的代码如下:
import cv2 as cv
import math
import numpy as np
def psnr1(img1,img2):
#compute mse
# mse = np.mean((img1-img2)**2)
mse = np.mean((img1/1.0-img2/1.0)**2)
#compute psnr
if mse < 1e-10:
return 100
psnr1 = 20*math.log10(255/math.sqrt(mse))
return psnr1
def psnr2(img1,img2):
mse = np.mean((img1/255.0-img2/255.0)**2)
if mse < 1e-10:
return 100
psnr2 = 20*math.log10(1/math.sqrt(mse))
return psnr2
imag1 = cv.imread("/home/lpy/tmpdata/heart/ImageFileName085.jpg")
print (imag1.shape)
imag2 = cv.imread("/home/lpy/tmpdata/heart/ImageFileName087.jpg")
#print(imag2.shape)
# imag2 = imag2.reshape(352,352,3)
#print(imag2.shape)
res1 = psnr1(imag1,imag2)
print("res1:",res1)
res2 = psnr2(imag1,imag2)
print("res2:",res2)
来源:CSDN
作者:Cassie_pyLu
链接:https://blog.csdn.net/weixin_40607008/article/details/103931832