Python计算两张图的PSNR值

    本文主要记录如何用python实现求解两张图的PSNR值。

1.PSNR求解公式

    (1)对于三通道的RGB图像 计算MSE的数学表达式是:
在这里插入图片描述
    具体的代码为:

# compute MSE
mse = np.mean((img1/1.0-img2/1.0)**2)

    (2)得到MSE后计算PSNR,具体数学表达式为:
在这里插入图片描述
    具体的代码为:

psnr1=20*math.log10(255/math.sqrt(mse))

    另外一种方式就是将像素值进行归一化处理,然后再进行PSNR值的求解:

mse = np.mean((img1/255.0-img2/255.0)**2)
psnr2=20*math.log10(1/math.sqrt(mse))

2.完整的PSNR求解代码

    完整的代码如下所示:

import cv2
import math
import numpy

def psnr1(img1, img2):
    # compute mse
    # mse = np.mean((img1-img2)**2)
    mse = numpy.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 = numpy.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 = cv2.imread("./image/original_image/Lena.bmp")
print("imag1.shap: {}".format(imag1.shape))
imag2 = cv2.imread("./image/embedded_image/Lena.bmp_embed_image.bmp")
print("imag1.shap: {}".format(imag2.shape))
image_size = [512, 512] #将图像转化为512*512大小的尺寸 
imag1 = cv2.resize(imag1, image_size, interpolation=cv2.INTER_CUBIC)
imag1 = cv2.cvtColor(imag1, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像,不是必须转,也可以使用原始的彩色图像
imag2 = cv2.resize(imag2, image_size, interpolation=cv2.INTER_CUBIC)
imag2 = cv2.cvtColor(imag2, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像,不是必须转,也可以使用原始的彩色图像
res1 = psnr1(imag1, imag2)
print("res1:", res1)
res2 = psnr2(imag1, imag2)
print("res2:", res2)

3.运算结果展示

在这里插入图片描述

4.参考文献

参考链接:用Python计算两图像的峰值信噪比PSNR。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐