PSNR ssim代码
时间: 2025-03-25 16:28:21 浏览: 57
### 计算PSNR和SSIM的Python实现
以下是通过 Python 实现 PSNR 和 SSIM 的代码示例:
#### 峰值信噪比 (PSNR)
峰值信噪比是一种衡量图像质量的方法,其定义如下公式所示[^2]。对于两个相同大小的图像 `img1` 和 `img2`,可以按照以下方式计算。
```python
import numpy as np
def calculate_psnr(img1, img2):
mse = np.mean((img1 / 255.0 - img2 / 255.0) ** 2)
if mse == 0:
return float('inf')
PIXEL_MAX = 1.0
psnr_value = 20 * np.log10(PIXEL_MAX / np.sqrt(mse))
return psnr_value
```
此函数适用于 uint8 格式的输入图像数据,并将其转换为浮点数范围 `[0, 1]` 进行处理。
---
#### 结构相似性指数 (SSIM)
结构相似性指数用于评估两幅图像之间的感知差异。可以通过 SciPy 或 skimage 库来简化实现过程[^1]。
```python
from sklearn.metrics import structural_similarity as ssim
import cv2
def calculate_ssim(img1, img2):
gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
score, _ = ssim(gray_img1, gray_img2, full=True)
return score
```
上述代码利用 OpenCV 将 RGB 图像转换为灰度图后再调用 `skimage.measure.compare_ssim()` 函数完成 SSIM 的计算。
如果需要支持彩色图像,则需扩展到多通道版本:
```python
from skimage.metrics import structural_similarity as ssim_metric
def calculate_rgb_ssim(img1, img2):
scores = []
for channel in range(3): # 对于RGB三个通道分别计算
single_channel_score = ssim_metric(
img1[:, :, channel],
img2[:, :, channel],
data_range=img2.max() - img2.min()
)
scores.append(single_channel_score)
mean_ssim = np.mean(scores)
return mean_ssim
```
该方法逐一对每个颜色通道执行 SSIM 测量并取平均值得到最终结果。
---
### 总结
以上提供了两种主要算法——PSNR 和 SSIM 的具体实现方案。其中 PSNR 更加简单直接,而 SSIM 则更贴近人类视觉系统的特性,在实际应用中可能更具参考价值。
阅读全文
相关推荐

















