使用Python查找峰值信噪比 (PSNR)


峰值信噪比 (PSNR) 是一种常用的统计量,用于计算数字信号(图像和视频)的质量。它计算原始信号和失真信号之间的差异,并衡量通过压缩、传输和处理添加的噪声量。PSNR 广泛应用于多媒体、视频压缩和图像处理等各种应用中。在本文中,我们将学习两种在Python中计算PSNR的方法。本方法将提供算法、代码实现和解释,使任何人都能够高效准确地计算PSNR。

峰值信噪比

它是一个常用的指标,用于表示图像或任何视频流的质量。在图像和视频压缩技术中,经常使用PSNR来比较压缩输出与原始输入的质量。它有助于确定压缩造成的信 息丢失或退化的程度。随着PSNR值的增加,压缩图像或视频的感知质量也会提高,因为失真变得不那么明显。

PSNR 使用原始图像和失真图像之间的均方误差 (MSE) 计算,并以分贝 (dB) 为单位表示。PSNR公式如下:

PSNR = 20*log10(MAX)-10*log10(MSE)

其中:

MAX 表示图像可以表示的最高像素值(对于 8 位图像,此值为 255)。

均方误差 (MSE) 使用原始图像和失真图像之间对应像素的平方偏差的平均值来计算。

方法

要使用Python查找峰值信噪比 (PSNR),我们可以遵循以下两种方法:

  • 使用均方误差 (MSE) 计算PSNR。

  • 使用skimage库计算PSNR。

让我们来看看这两种方法:

使用均方误差 (MSE) 计算PSNR

第一种方法使用原始图像和失真图像之间的均方误差 (MSE) 来计算PSNR。这种方法提供了一种简单的方法来计算PSNR分数,并衡量两幅图像的相似程度。按照算法和代码中的说明,可以使用MSE方法找到PSNR。

算法

使用Python查找峰值信噪比 (PSNR) 的算法如下:

  • 步骤1 - 导入cv2和numpy模块。

  • 步骤2 - 创建一个函数,该函数以两张图像路径作为参数。

  • 步骤3 - 计算图像之间像素的差异。

  • 步骤4 - 获取差异的平方。并找到均方误差。

  • 步骤5 - 计算psnr值并返回。

  • 步骤6 - 获取两张图像,调整图像大小,并调用函数“calculate_psr”来计算psnr。

  • 步骤7 - 显示结果。

示例

# import the cv2 as well as numpy library
import cv2
import numpy as np
# Create a function that takes two images’ paths as a parameter
def calculate_psnr(firstImage, secondImage):
   # Compute the difference between corresponding pixels
   diff = np.subtract(firstImage, secondImage)
   # Get the square of the difference
   squared_diff = np.square(diff)

   # Compute the mean squared error
   mse = np.mean(squared_diff)

   # Compute the PSNR
   max_pixel = 255
   psnr = 20 * np.log10(max_pixel) - 10 * np.log10(mse)
    
   return psnr

# Resize images to a common size
rHeight = 256
rWidth = 256

# Read the original and distorted images
firstI = cv2.imread('image1.jpg')
secondI = cv2.imread('image2.jpg')

# Check if images are loaded successfully
if firstI is None or secondI is None:
   print("Failed to load one or both images.")
else:
   # Resize images for first image
   firstI = cv2.resize(firstI, (rWidth, rHeight))
   # Resize the details for second image
   secondI = cv2.resize(secondI, (rWidth, rHeight))
    
   # Call the above function and perform the calculation
   psnr_score = calculate_psnr(firstI, secondI)
   # Display the result
   print("PSNR:", psnr_score)

输出

PSNR: 36.74928217740045

使用Skimage库计算PSNR

第二种方法利用scikit-image (skimage)库的功能,该库具有一个简单的函数可以直接计算PSNR。上述方法允许使用skimage库提供的专用函数,而不是执行MSE的显式计算。此方法中描述的算法和代码可用于快速准确地计算PSNR。

算法

使用Python查找峰值信噪比 (PSNR) 的算法如下:

  • 步骤1 - 导入必要的模块。

  • 步骤2 - 创建一个函数,该函数以两个值作为参数。

  • 步骤3 - 读取两张图像。

  • 步骤4 - 调整图像大小,并使用skimage计算psnr。返回psnr的值。

  • 步骤5 - 调用上述函数并传递两张图像路径。

  • 步骤6 - 显示psnr值。

示例

# import the necessary module
from skimage import io, metrics
import cv2
#Create the function having image paths as a parameter
def psnr_calculate(image1, image2):
   # Read the original as well as distorted images
   fimage1 = cv2.imread(image1)
   fimage2 = cv2.imread(image2)

   # Check if images are loaded successfully
   if fimage1 is None or fimage2 is None:
      print("Failed to load one or both images.")
      return None
    
   # Resize images to a common size
   fimage1 = cv2.resize(fimage1, (resized_width, resized_height))
   fimage2 = cv2.resize(fimage2, (resized_width, resized_height))

   # Compute the PSNR using skimage
   psnr = metrics.peak_signal_noise_ratio(fimage1, fimage2)
    
   return psnr

# Resize images to a common size
resized_width = 256
resized_height = 256

# Call the above function and pass the two image paths
psnr_score = psnr_calculate(image1.jpg', 'image2.jpg')
if psnr_score is not None:
   print("PSNR:", psnr_score)

输出

PSNR: 16.045797513039695

结论

在本文中,我们研究了两种计算Python PSNR(峰值信噪比)的方法。在图像和视频处理的背景下,PSNR是评估数字数据质量的关键统计量。使用均方误差 (MSE) 方法或skimage库,可以确定精确的PSNR分数并评估数字信号的质量。

更新于:2023年10月18日

2K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告