SSIM和PSNR

SSIM

Structural Similarity(SSIM)结构相似性

Matlab版定义

MatLab版见官方介绍
基于三个项的计算,即亮度项、对比度项和结构项。
SSIM ⁡ ( x , y ) = [ l ( x , y ) ] α ⋅ [ c ( x , y ) ] β ⋅ [ s ( x , y ) ] γ \operatorname{SSIM}(x, y)=[l(x, y)]^{\alpha} \cdot[c(x, y)]^{\beta} \cdot[s(x, y)]^{\gamma} SSIM(x,y)=[l(x,y)]α[c(x,y)]β[s(x,y)]γ
l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 c ( x , y ) = 2 σ x σ y + C 2 σ x 2 + σ y 2 + C 2 s ( x , y ) = σ x y + C 3 σ x σ y + C 3 \begin{aligned} l(x, y) &=\frac{2 \mu_{x} \mu_{y}+C_{1}}{\mu_{x}^{2}+\mu_{y}^{2}+C_{1}} \\ c(x, y) &=\frac{2 \sigma_{x}{\sigma_{y}}+C_{2}}{\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}} \\ s(x, y) &=\frac{\sigma_{x y}+C_{3}}{\sigma_{x} \sigma_{y}+C_{3}} \end{aligned} l(x,y)c(x,y)s(x,y)=μx2+μy2+C12μxμy+C1=σx2+σy2+C22σxσy+C2=σxσy+C3σxy+C3

其中 μ \mu μ σ \sigma σ表示均值和方差。

如果 α = β = γ = 1(Exponents 的默认值),且 C3 = C2/2(C 3 的默认选择),则索引简化为:

SSIM ⁡ ( x , y ) = ( 2 μ x μ y + C 1 ) ( 2 σ x y + C 2 ) ( μ x 2 + μ y 2 + C 1 ) ( σ x 2 + σ y 2 + C 2 ) \operatorname{SSIM}(x, y)=\frac{\left(2 \mu_{x} \mu_{y}+C_{1}\right)\left(2 \sigma_{x y}+C_{2}\right)}{\left(\mu_{x}^{2}+\mu_{y}^{2}+C_{1}\right)\left(\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}\right)} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)

性质:

  1. Symmetry: S ( x , y ) = S ( y , x ) S(\mathbf{x}, \mathbf{y})=S(\mathbf{y}, \mathbf{x}) S(x,y)=S(y,x);
  2. Boundedness: S ( x , y ) ≤ 1 S(\mathbf{x}, \mathbf{y}) \leq 1 S(x,y)1;
  3. Unique maximum: S ( x , y ) = 1 S(\mathbf{x}, \mathbf{y})=1 S(x,y)=1 if and only if x = y \mathbf{x}=\mathbf{y} x=y (in discrete representations, x i = y i x_{i}=y_{i} xi=yi for all i = 1 , 2 , ⋯   , N i=1,2, \cdots, N i=1,2,,N );

使用方式

ssimval = ssim(A,ref)

Python版实现

官方解释 :MSE不能很好的考虑到纹理,因此引入SSIM。

使用方式

from skimage.metrics import structural_similarity as ssim
import matplotlib.pyplot as plt
# 针对多通道图像,默认最后一维度为通道,每个通道进行单独计算,然后平均
a = plt.imread('a.jpg')
b = plt.imread('b.jpg')
result = ssim(a,b,multichannel=True) 

采用公式为
SSIM ⁡ ( x , y ) = ( 2 μ x μ y + C 1 ) ( 2 σ x y + C 2 ) ( μ x 2 + μ y 2 + C 1 ) ( σ x 2 + σ y 2 + C 2 ) \operatorname{SSIM}(x, y)=\frac{\left(2 \mu_{x} \mu_{y}+C_{1}\right)\left(2 \sigma_{x y}+C_{2}\right)}{\left(\mu_{x}^{2}+\mu_{y}^{2}+C_{1}\right)\left(\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}\right)} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)
其中,
C 1 = ( K 1 L ) 2 C_{1}=\left(K_{1} L\right)^{2} C1=(K1L)2 C 2 = ( K 2 L ) 2 C_{2}=\left(K_{2} L\right)^{2} C2=(K2L)2 K 1 = 0.01 K_{1}=0.01 K1=0.01, K 1 = 0.03 K_{1}=0.03 K1=0.03 L L L是动态范围:若像素值为[0,255],则 L = 255 L=255 L=255

PSNR

峰值信噪比Peak signal-to-noise ratio,单位是dB

M S E = 1 m n ∑ i = 0 m − 1 ∑ j = 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 M S E=\frac{1}{m n} \sum_{i=0}^{m-1} \sum_{j=0}^{n-1}[I(i, j)-K(i, j)]^{2} MSE=mn1i=0m1j=0n1[I(i,j)K(i,j)]2
P S N R = 10 log ⁡ 10 ( ( 2 n − 1 ) 2 M S E ) P S N R=10 \log _{10}\left(\frac{\left(2^{n}-1\right)^{2}}{M S E}\right) PSNR=10log10(MSE(2n1)2)

其中,n表示图像位数,比如n=8。

多通道图像如RGB图像,在计算MSE时就进行了进行了平均,最终MSE是标量。

Python的使用方式

from skimage.metrics import peak_signal_noise_ratio as psnr
a = plt.imread('a.jpg')
b = plt.imread('b.jpg')
psnr_ = psnr(a,b)

注意:数据类型不同会导致psnr值不同。

参考文献

  1. Image quality assessment: From error visibility to structural similarity. IEEE Transactions on Image Processing, https://ece.uwaterloo.ca/~z70wang/publications/ssim.pdf
  2. https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio

遗留问题

SSIM是怎么考虑纹理等信息的

### SSIM PSNR 的定义、计算方法及比较 #### 定义 SSIM (Structural Similarity Index Measure) 是一种用于衡量两幅图像之间相似性的指标[^2]。它通过考虑亮度、对比度以及结构信息来反映图像的质量变化,更加贴近人类视觉系统的特性。 PSNR (Peak Signal-to-Noise Ratio) 则是一种基于均方误差的图像质量评价标准[^4]。它的核心思想是比较原始图像与失真图像之间的像素差值,并将其转化为信噪比的形式。 --- #### 计算方法 ##### SSIM 的计算 SSIM 的公式如下: \[ SSIM(x, y) = \frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy} + C_2)}{(\mu_x^2+\mu_y^2+C_1)(\sigma_x^2+\sigma_y^2+C_2)} \] 其中: - \(x\) \(y\) 表示待比较的两幅图像; - \(\mu_x\) \(\mu_y\) 分别为图像 \(x\) \(y\) 的平均亮度; - \(\sigma_x\) \(\sigma_y\) 分别为图像 \(x\) \(y\) 的局部对比度; - \(\sigma_{xy}\) 为图像 \(x\) \(y\) 的联合对比度; - \(C_1\) \(C_2\) 为稳定系数,防止分母为零。 此公式的目的是综合评估图像的亮度、对比度结构信息的变化。 ##### PSNR 的计算 PSNR 的公式为: \[ PSNR = 10 \cdot \log_{10}{\left( \frac{{MAX_I}^2}{MSE} \right)} \] 其中: - \(MAX_I\) 是图像的最大可能像素值(对于8位灰度图像是255); - MSE (Mean Squared Error) 是均方误差,计算方式如下: \[ MSE = \frac{1}{mn} \sum_{i=0}^{m-1} \sum_{j=0}^{n-1}[I(i,j)-K(i,j)]^2 \] 这里 \(I(i,j)\) \(K(i,j)\) 分别代表原图像失真图像在同一位置上的像素值。 --- #### 应用场景 ##### SSIM 的应用场景 由于 SSIM 更能体现人类视觉系统的特点,因此适用于需要关注图像结构性变化的任务,例如图像压缩、去雾处理、超分辨率重建等。这些任务通常涉及较大的纹理或边缘变化,而 SSIM 能够很好地捕捉这种变化并给出合理的评分。 ##### PSNR 的应用场景 PSNR 主要应用于传统信号处理领域中的图像质量评估,尤其是在视频编码传输过程中。尽管其结果有时无法完全匹配人类主观感受,但由于其实现简单且具有较高的可重复性,在工业界仍然被广泛采用作为初步质量检测工具。 --- #### 比较分析 | 特性 | SSIM | PSNR | |---------------------|------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | **基础原理** | 结合亮度、对比度结构信息 | 基于像素间误差 | | **适用范围** | 需要考虑图像结构信息的应用,如图像增强、压缩 | 对象是简单的像素级差异测量,适合早期阶段的质量控制 | | **优缺点** | 符合人眼视觉特性;计算复杂度稍高 | 实现简便快速;未充分考虑人眼感知机制 | 综上所述,虽然两者都可以用来评估图像质量,但在具体选择时应根据实际需求决定。如果希望得到更接近人类观感的结果,则优先选用 SSIM 或者进一步引入 LPIPS 进行补充评估[^3]。 ```python import numpy as np from skimage.metrics import structural_similarity as ssim from math import log10 def calculate_psnr(image_true, image_test): mse_value = np.mean((image_true.astype(float) - image_test.astype(float)) ** 2) max_pixel = float(np.max(image_true)) psnr_result = 10 * log10(max_pixel**2 / mse_value) return psnr_result # Example usage of SSIM and PSNR functions with dummy data. img1 = np.random.randint(0, 256, size=(100, 100), dtype=np.uint8) img2 = img1.copy() + np.random.normal(loc=0, scale=10, size=img1.shape).astype(np.int8) ssim_score = ssim(img1, img2, data_range=img2.max() - img2.min()) psnr_score = calculate_psnr(img1, img2) print(f'SSIM Score: {ssim_score}') print(f'PSNR Score: {psnr_score}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值