用Python计算两图像的峰值信噪比PSNR

我只是一个虾纸丫 提交于 2020-01-12 19:25:31

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)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!