结构相似性指数(Structural Similarity Index, SSIM)

结构相似性指数(Structural Similarity Index, SSIM)是一个用于衡量两幅图像之间相似度的指标,它由周海翔等人在2004年提出。SSIM旨在改进传统的均方误差(MSE)和峰值信噪比(PSNR),因为这些传统方法往往不能很好地反映人类视觉系统(HVS, Human Visual System)对图像质量变化的感知。

SSIM考虑了三个方面的信息:亮度(luminance)、对比度(contrast)以及结构信息(structure)。这三个因素是基于人类视觉系统的特性而选取的,因为人类对于图像的感知主要取决于这些特征。SSIM公式可以表示为:

SSIM ( x , y ) = [ l ( x , y ) ] α ⋅ [ c ( x , y ) ] β ⋅ [ s ( x , y ) ] γ \text{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)]γ

其中 ( x ) 和 ( y ) 分别代表参考图像和待比较图像; l ( x , y ) l(x,y) l(x,y) c ( x , y ) c(x,y) c(x,y) s ( x , y ) s(x,y) s(x,y)分别是亮度、对比度和结构的相似性度量; α \alpha α, β \beta β, γ \gamma γ是非负的加权参数,默认情况下都设置为1。

亮度相似度 l ( x , y ) l(x,y) l(x,y)通常定义为两个图像平均亮度的相似度,对比度相似度 c ( x , y ) c(x,y) c(x,y) 定义为两个图像对比度的相似度,而结构相似度 s ( x , y ) s(x,y) s(x,y)则衡量的是两个图像之间的结构信息的一致性。

为了计算方便,实际应用中的SSIM值通常简化为如下形式:

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 ) \text{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)} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)

这里:

  • μ x \mu_x μx μ y \mu_y μy分别是图像 x x x y y y 的平均亮度;
  • σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2分别是图像 x x x y y y的方差,即对比度;
  • σ x y \sigma_{xy} σxy是图像 x x x y y y 的协方差,反映了它们之间的结构相似性;
  • C 1 C_1 C1 C 2 C_2 C2 是用来稳定除法运算的小常数,防止分母为零的情况发生。

SSIM的取值范围一般是在 -1 到 1 之间,其中 1 表示完全相同,0 表示没有线性相关,-1 表示完全负相关。然而,在实际应用中,SSIM的值很少会达到 -1 或者低于 0,因此更常见的取值范围是 0 到 1 之间,值越大表示两张图片越相似。

SSIM已经被广泛应用于图像处理和计算机视觉领域,如图像压缩、图像恢复、图像融合等任务中,作为评估图像质量的一个重要标准。

### MATLAB 中 SSIM 的实现 #### 定义亮度、对比度和结构相似性 SSIM 是一种用于评估两个图像之间相似性的指标,其计算基于三个因素:亮度(luminance)、对比度(contrast)以及结构(structure)。这些因子通过特定公式组合来得出最终的 SSIM 值。 对于任意一对像素点 \( (x, y) \),分别来自两张待比较的图像 I 和 J,在局部窗口 w 内: - **亮度相似性** L(x,y)=\frac{2μ_x μ_y+C_1}{μ_x^2+μ_y^2+C_1}[^1] - **对比度相似性** C(x,y)=\frac{2σ_x σ_y+C_2}{σ_x^2+σ_y^2+C_2} - **结构相似性** S(x,y)=\frac{σ_{xy}+C_3}{σ_x σ_y+C_3} 其中, - \( μ_x \),\( μ_y \) 分别表示图像I,J在位置(x,y)处均值; - \( σ_{xy} \) 表示协方差; - \( C_1=(K_1L)^2 \),\( C_2=(K_2L)^2 \),\( C_3=C_2/2 \); - K1,K2 为常量系数;L 代表动态范围(通常等于最大灰度级减去最小灰度级加一) 最后得到的整体 SSIM 可以表达如下: \[ mssim=\prod _{(i,j)\in W}\left[l(i,j)^{\alpha }\cdot c(i,j)^{\beta }\cdot s(i,j)^{\gamma }\right]\][^1] 这里 α,β,γ ≥0 并且默认情况下都设为 1. #### MATLAB 实现代码 下面给出一段简单的MATLAB代码片段用于计算给定两幅图间的SSIM: ```matlab function ssim_value = compute_ssim(I1,I2) % 将输入图像转换成双精度浮点型并归一化至[0,1]区间内 I1 = double(normalize01(I1)); I2 = double(normalize01(I2)); % 设置参数 k1=0.01; k2=0.03; l=255; % 动态范围 win_size = 11;% 滤波器大小 sigma = 1.5; % 创建高斯滤波核 gaussian_window = fspecial('gaussian',win_size,sigma); % 计算平均值 mu_I1 = imfilter(I1,gaussian_window,'replicate'); mu_I2 = imfilter(I2,gaussian_window,'replicate'); % 计算平方项 mu_I1_sq = mu_I1.^2; mu_I2_sq = mu_I2.^2; mu_I1_I2 = mu_I1 .*mu_I2 ; % 计算方差与协方差 sigma_I1_sq = imfilter(I1.*I1,gaussian_window,'replicate') - mu_I1_sq ; sigma_I2_sq = imfilter(I2.*I2,gaussian_window,'replicate') - mu_I2_sq ; sigma_I1_I2 = imfilter(I1.*I2,gaussian_window,'replicate') - mu_I1_I2 ; % 参数设置 c1 = (k1*l)^2; c2 = (k2*l)^2; % 计算分母分子部分 numerator = (2*mu_I1_I2+c1).*(2*sigma_I1_I2+c2); denominator =(mu_I1_sq + mu_I2_sq +c1 ).*(sigma_I1_sq + sigma_I2_sq +c2 ); % 计算SSIM map ssim_map=numerator./denominator; % 返回整体SSIM得分 ssim_value = mean(ssim_map(:)); end % 归一化辅助函数 function re = normalize01(img) a = min(min(img)); b = max(max(img)); re = (img-a)./(b-a); end ``` 此段程序实现了基本版的SSIM算法,并考虑到了边界填充等问题。需要注意的是实际应用中可能还需要针对具体场景调整一些细节配置比如窗口尺寸等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值