Python PSNR计算结果不正确

Python PSNR计算结果不正确,python,opencv,image-processing,Python,Opencv,Image Processing,我从维基百科的文章中下载了两幅图像(原始未压缩PNG和压缩JPG,报告的PSNR为45.53 dB)。然后,我跑: import cv2 img1 = cv2.imread('PSNR-example-base.png') img2 = cv2.imread('PSNR-example-comp-90.jpg') cv2.PSNR(img1, img2) 但是我得到的输出值是29.436334461883582,而不是45.53 我还尝试了Ryan SH的建议,来自: 再次获取29.4363

我从维基百科的文章中下载了两幅图像(原始未压缩PNG和压缩JPG,报告的PSNR为45.53 dB)。然后,我跑:

import cv2

img1 = cv2.imread('PSNR-example-base.png')
img2 = cv2.imread('PSNR-example-comp-90.jpg')
cv2.PSNR(img1, img2)
但是我得到的输出值是
29.436334461883582
,而不是
45.53

我还尝试了Ryan SH的建议,来自:

再次获取
29.43633446188358


我做错了什么?

差异的原因很可能在参考图像的标题中暗示(我强调):

示例luma不同质量级别的cjpeg压缩图像的PSNR值

PSNR不是像您那样为整个RGB图像计算的,而是仅为图像的(“亮度”)

而且,我甚至无法从你的问题中重现
29.4363…
。下面是我的比较代码:

导入cv2
将numpy作为np导入
从skimage import io(仅用于网络抓取图像),使用cv2.imread(用于本地图像)
def psnr(图像1、图像2):
#OpenCV
打印('OpenCV PSNR:',cv2.PSNR(图像1,图像2))
#自己实现
mse=np.平均值((image1.astype(np.float64)/255-image2.astype(np.float64)/255)**2)
打印('自己的实现:',10*np.log10(1./mse))
def luma(图像):
返回(0.299*图像[:,:,2]+0.587*图像[:,:,1]+0.114*图像[:,:,0])。aType(np.uint8)
#返回值(0.2126*图像[:,:,2]+0.7152*图像[:,:,1]+0.0722*图像[:,:,0])。aType(np.uint8)
#返回(0.212*图像[:,:,2]+0.701*图像[:,:,1]+0.087*图像[:,:,0])。aType(np.uint8)
#计算参考图像的峰值信噪比
img1=cv2.CVT颜色(io.imread('https://upload.wikimedia.org/wikipedia/commons/d/d3/PSNR-example-base.png”),cv2.颜色(RGB2BGR)
img2=cv2.CVT颜色(io.imread('https://upload.wikimedia.org/wikipedia/commons/2/2a/PSNR-example-comp-90.jpg”),cv2.颜色(RGB2BGR)
峰值信噪比(img1、img2)
#计算参考图像上的亮度峰值信噪比
峰值信噪比(卢马(img1)、卢马(img2))
输出:

OpenCV PSNR:39.021537956442224
自身实现:39.02153795644222
OpenCV PSNR:44.79892614734474
自身实现:44.79892614734474
对我来说,RGB图像的峰值信噪比远高于您报告的图像。但是,luma的峰值信噪比确实与给定值非常匹配,尽管它并不完全相同。我测试了几个luma计算,没有一个给出准确的结果——但因为在参考示例中没有提到,luma是如何计算的,所以试图重现准确的值是毫无意义的


希望有帮助

你确定维基百科在你下载之前没有压缩它吗?
import numpy as np
import math

img1 = img1.astype(np.float64) / 255.
img2 = img2.astype(np.float64) / 255.
mse = np.mean((img1 - img2) ** 2)
10 * math.log10(1. / mse)