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

pythonserver side programmingprogramming

峰值信噪比 (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 - 显示结果。

示例

# 导入 cv2 以及 numpy 库
import cv2
import numpy as np
# 创建一个以两幅图像的路径作为参数的函数
def calculate_psnr(firstImage, secondImage):
    # 计算相应像素之间的差异
    diff = np.subtract(firstImage, secondImage)
    # 获取差异的平方
    squared_diff = np.square(diff)
    
    # 计算均方误差
    mse = np.mean(squared_diff)
    
    # 计算 PSNR
    max_pixel = 255
    psnr = 20 * np.log10(max_pixel) - 10 * np.log10(mse)
    
    return psnr

# 将图像调整为通用大小
rHeight = 256
rWidth = 256

# 读取原始图像和失真图像
firstI = cv2.imread('image1.jpg')
secondI = cv2.imread('image2.jpg')

# 检查图像是否已成功加载
if firstI is None or secondI is None:
   print("Failed to load one or both images.")
else:
    # 调整第一幅图像的大小
    firstI = cv2.resize(firstI, (rWidth, rHeight))
    # 调整第二幅图像的细节大小
    secondI = cv2.resize(secondI, (rWidth, rHeight))
    
    # 调用上述函数并执行计算
    psnr_score = calculate_psnr(firstI, secondI)
    # 显示结果
    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 值。

示例

# 导入必要的模块
from skimage import io, metrics
import cv2
# 创建以图像路径为参数的函数
def psnr_calculate(image1, image2):
    # 读取原始图像和失真图像
    fimage1 = cv2.imread(image1)
    fimage2 = cv2.imread(image2)
    
    # 检查图像是否已成功加载
    if fimage1 is None or fimage2 is None:
        print("无法加载一张或两张图像。")
        return None
    
    # 将图像调整为通用大小
    fimage1 = cv2.resize(fimage1, (resized_width, resized_height))
    fimage2 = cv2.resize(fimage2, (resized_width, resized_height))
    
    # 使用 skimage 计算 PSNR
    psnr = metrics.peak_signal_noise_ratio(fimage1, fimage2)
    
    return psnr

# 将图像调整为通用大小
resized_width = 256
resized_height = 256

# 调用上述函数并传递两个图像路径
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 分数并评估数字信号的质量。


相关文章