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

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)

 

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值