SSIM

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了SSIM脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1. Abstract

传统上,评估感知图像质量的客观方法试图利用人类视觉系统的各种已知属性来量化扭曲图像和参考图像之间的误差的可见性(差异)。在假设人类视觉感知高度适应于从场景中提取结构信息的情况下,我们引入了另一种基于结构信息退化的质量评估补充框架。作为这个概念的一个具体例子,我们开发了一个结构相似性指数,并通过一组直观的例子来展示它的前景,以及在一个用JPEG和JPEG2000压缩的图像数据库上与主观评分和最先进的目标方法进行比较。

2. INTRODUCTION

数字图像在采集、处理、压缩、存储、传输和复制过程中存在各种失真,其中任何一种都可能导致视觉质量的下降。对于图像最终将被人类看到的应用程序,量化视觉图像质量的唯一“正确”的方法是通过主观评价。然而,在实际应用中,主观评价往往太不方便、太耗时和太昂贵。客观图像质量评估研究的目标是开发能够自动预测感知图像质量的定量测量方法。

图像质量评价作用:

  • 首先,它可以用于动态监控和调整图像质量。举个例子,数字视频服务器可以检查视频传输的质量,以控制和分配流媒体资源。
  • 其次,可用于优化图像处理系统的算法和参数设置。例如,在视觉通信系统中,质量度量可以帮助编码器的预滤波和位分配算法的优化设计,以及解码器上的最优重建、错误隐藏和后滤波算法。
  • 第三,它可以用于对图像处理系统和算法进行基准测试。

最简单和最广泛使用的全参考质量度量是均方误差(MSE),它是通过平均失真和参考图像像素的平方强度差以及相关的峰值信噪比(PSNR)来计算的。它们很吸引人,因为它们计算简单,有明确的物理意义,在优化的数学上方便。

3. 基于结构相似性的图像质量评估

自然图像信号是高度结构化的:它们的像素表现出很强的依赖性,特别是当它们在空间上接近时,这些依赖性携带着关于视觉场景中物体结构的重要信息。闵可夫斯基误差度量是基于点态信号差,这是独立于底层信号结构。尽管大多数基于误差敏感度的质量度量使用线性变换分解图像信号,但这些并没有消除强依赖性。新方法的动机是找到一种更直接的方法来比较参考信号和扭曲信号的结构。

A.

基于人类视觉系统高度适应于从视野中提取结构信息的假设,提出了一种新的图像质量测量设计框架。由此可见,结构信息变化的度量可以提供一个很好的近似感知图像失真。

SSIM

图中显示了一个激励人心的例子。上图其中原始的“船”图像被改变为不同的失真,每个调整,以产生相对于原始图像几乎相同的MSE。尽管如此,我们可以看到这些图像具有完全不同的感知质量。根据误差敏感性哲学,考虑到对比拉伸图像的视觉差异很容易识别,很难解释为什么对比拉伸图像具有非常高的质量。但它很容易理解的新哲学因为几乎所有的结构信息保存,在某种意义上,原始信息几乎可以完全恢复通过一个简单的点态逆线性亮度变换(除了非常明亮和黑暗的地区饱和发生)。另一方面,来自原始图像的一些结构信息在JPEG压缩图像和模糊图像中永久丢失,因此它们的质量分数应该低于对比度拉伸图像和平均位移图像。

其次,误差敏感性范式是一种自下而上的方法,模拟HVS中相关早期组件的功能。新的范式是一种自上而下的方法,模拟了整个HVS的假设功能。一方面,这避免了前一节中提到的阈值上问题,因为它不依赖于阈值心理物理学来量化感知到的扭曲。另一方面,认知互动问题也在一定程度上减少了,因为探索被观察对象的结构被认为是整个视觉观察过程的目的,包括高水平的和互动过程。

第三,在一定程度上也避免了自然图像的复杂性和去相关性的问题,因为新的哲学并没有试图通过积累与心理物理学上理解的简单模式相关的错误来预测图像的质量。相反,新的哲学提出了直接评估两个复杂结构信号之间的结构变化。

B. The SSIM Index

我们从图像形成的角度构建了一个SSIM质量度量的具体例子.本文对该算法进行了推广,并提供了更广泛的验证结果。被观察物体表面的亮度是光照和反射率的乘积,但场景中物体的结构与光照无关。因此,为了探索图像中的结构信息,我们希望分离出亮度的影响。我们将图像中的结构信息定义为那些代表场景中物体结构的属性,与平均亮度和对比度无关。亮度和对比度可以在不同的场景中发生变化,我们使用局部亮度和对比度来进行定义。所提出的质量评价体系的系统图如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wozWo4Ci-1641405039687)

SSIM

假设和是两个非负性的图像信号,它们已经彼此对齐(例如,从每个图像中提取的空间斑块)。如果我们认为其中一个信号具有完美的质量,那么相似度度量可以作为第二个信号质量的定量测量。该系统将相似度测量的任务分为亮度、对比度和结构三个比较项。首先,比较每个信号的亮度。假设离散信号,这被估计为平均强度(2):

[mu_x=frac{1}{N}sum limits_{i=1}^{N}x_i tag 2 ]

亮度比较函数(l(x,y))(mu_x)(mu_y)的函数。

其次,我们从信号中去除平均强度。在离散形式中,所得到的信号(x-mu_x)对应于向量(x_{new})在由所定义的超平面上的投影:

[sum limits_{i=1}^{N}x_{newi}=0 tag 3 ]

我们使用标准差(方差的平方根)作为信号对比度的估计。本文给出了一个离散形式的无偏估计方法:

[sigma_x=(frac{1}{N-1}sum limits_{i=1}^{N}(x_i-mu_x)^2)^{1/2} ]

对比度(c(x,y))比较是(sigma_x)(sigma_y)的比较。

第三,信号归一化(除)其自己的标准差,使被比较的两个信号具有单位标准差。对这些归一化信号((x-mu_x)/sigma_x)和信号((y-mu_y)/sigma_y)结合得到了结构比较(s(x,y))

最后,将这三个成分组合起来,得到一个整体的相似性度量

[S(x,y)=f(l(x,y),c(x,y),s(x,y)) tag 5 ]

很重要的一点是,这三个组成部分是相对独立的。例如,亮度和/或对比度的变化不会影响图像的结构。例如,亮度和/或对比度的变化不会影响图像的结构。

为了完成(5)中相似度度量的定义,我们需要定义三个函数(l(x,y),c(x,y),s(x,y))以及组合函数(f())。我们还希望相似度度量能够满足以下条件:

  • 对称性:(S(x,y)=S(y,x))
  • 有界性:(S(x,y)le 1)
  • 唯一最大值:(S(x,y)=1)只有在(x=y)时才成立

1. 亮度度量函数

[l(x,y)=frac{2mu_xmu_y+C_1}{mu_x^2+mu_y^2+C_1} tag 6 ]

其中常数(C_1)(mu_x^2+mu_y^2)非常接近于零时避免不稳定。具体来说,我们选择

[C_1=(K_1L)^2 tag 7 ]

其中为L像素值的动态范围(8位灰度图像为255),(K_1)是一个小常数

方程(6)在定性上也符合韦伯定律,该定律已被广泛用于模拟HVS中的光适应(也称为亮度掩蔽)。根据韦伯定律,在很大的亮度值范围内,一个刚刚明显的亮度变化(Delta I)的大小与背景亮度近似成正比。换句话说,HVS对相对亮度的变化很敏感,而不是绝对亮度的变化。

我们用R表示亮度的相对变化,重写(6)式:

[l(x,y)=frac{2(1+R)}{1+(1+R)^2+frac{C_1}{mu_x^2}} tag 8 ]

我们假设(C_1)足够小(相对于)可以被忽略,那么(l(x,y))只是关于(R)的一个函数,在定性上符合韦伯定律

2. 对比度度量函数

对比度比较函数也采用了类似的形式:

[c(x,y)=frac{2sigma_xsigma_y+C_2}{sigma_x^2+sigma_u^2+C_2} tag 9 ]

其中(C_2=(K_2L)^2)(K_2<<1)。这个定义再次满足上面列出的三个属性。该函数的一个重要特征是,在相同的对比度变化下(Delta sigma=sigma_y-sigma_x),人的视觉感觉在较大的(sigma_x)的情况不如在较小的(sigma_x)上敏感。这与HVS的对比度掩蔽特性是一致的.

3. 结构对比度函数

[s(x,y)=frac{sigma_{xy}+C_3}{sigma_xsigma_y+C_3} tag {10} ]

在亮度和对比度测量中,我们在分母和分子中都引入了一个小常数。以离散的形式,(sigma_{xy})可以估计为:

[sigma_{xy}=frac{1}{N}sum limits_{i=1}^{N}(x_i-mu_i)(y_i-mu_y) tag {11} ]

几何上,相关系数对应于向量与之间的夹角的余弦。还要注意,这也可以是负的。

最后,我们结合(6)、(9)和(10)的三种比较,将得到的相似度量命名为信号(x)(y)之间的SSIM指数:

[SSIM(x,y)=[l(x,y)]^alpha cdot[c(x,y)]^beta cdot[s(x,y)]^gamma tag{12} ]

其中,(alpha>0,beta>0,gamma>0)是用于调整这三个组件的相对重要性的参数。我们很容易验证这个定义是否满足上述三个条件。为了简化表达式,我们对本文进行了设置,(alpha=beta=gamma=1, C_3=C_2/2)。这就导致了一种特定形式的SSIM指数:

[SSIM(x,y)=frac{(2mu_x mu_y+C_1)(2sigma_{xy}+C_2)}{(mu_x^2+mu_y^2+C_1)(sigma_x^2+sigma_y^2+C_2)} tag {13} ]

SSIM指数和更传统的质量度量之间的关系可以在图像分量的向量空间中以几何方式加以说明。

4. 各个度量与SSIM的关系

这些图像成分可以是像素强度或其他提取的特征,如变换后的线性系数。图4显示了围绕三个不同的示例参考向量绘制的等失真轮廓,每个参考向量代表一个参考图像的局部内容。为了说明,我们只展示一个二维空间,但通常维度应该与被比较的图像组件的数量相匹配。每个轮廓代表一组相对于封闭的参考图像具有相同畸变的图像。图4(a)显示了一个简单的闵可夫斯基度规的结果。每个轮廓都有相同的大小和形状(这里是一个圆,因为我们假设其指数为2)。也就是说,感知距离对应于欧氏距离。图4(b)显示了一个闵可夫斯基度量,其中不同的图像分量是不同的。例如,这可能是根据脑脊液进行加权,这在许多模型中很常见。这里的轮廓是椭圆,但仍然是相同的大小。这些显示与轴对齐,但通常可以倾斜到任何固定的方向

SSIM

在实践中,人们通常需要对整个图像进行单一的整体质量测量。我们使用一个平均SSIM(MSSIM)指数来评估整体图像质量:

[MSSIM(pmb X,pmb Y)=frac{1}{M}sum limits_{j=1}^{M}SSIM(x_j,y_j) tag 7 ]

其中(pmb X)(pmb Y)分别为参考图像和失真图像,(x_j,y_j)为局部窗口(j)的图像内容,(M)为图像的局部窗口数。

SSIM 代码实现:http://www.cns.nyu.edu/~lcv/ssim/

function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L)
if (nargin < 2 || nargin > 5)
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end

if (size(img1) ~= size(img2))
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end

% 获取图片的大小
[M N] = size(img1);

% 选用默认参数
if (nargin == 2)
    % 输入图像的大小要小于Window的大小
   if ((M < 11) || (N < 11))
	   ssim_index = -Inf;
	   ssim_map = -Inf;
      return
   end
   % 产生11*11 的服从高斯分布的矩阵
   window = fspecial('gaussian', 11, 1.5);	%
   K(1) = 0.01;								      % default settings
   K(2) = 0.03;								      %
   L = 255;                                  %
end

if (nargin == 3)
   if ((M < 11) || (N < 11))
	   ssim_index = -Inf;
	   ssim_map = -Inf;
      return
   end
   window = fspecial('gaussian', 11, 1.5);
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   ssim_index = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   ssim_index = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

if (nargin == 4)
   [H W] = size(window);
   % 产生的要为方阵
   if ((H*W) < 4 || (H > M) || (W > N))
	   ssim_index = -Inf;
	   ssim_map = -Inf;
      return
   end
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   ssim_index = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   ssim_index = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

if (nargin == 5)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
	   ssim_index = -Inf;
	   ssim_map = -Inf;
      return
   end
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   ssim_index = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   ssim_index = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
img1 = double(img1);
img2 = double(img2);

mu1   = filter2(window, img1, 'valid');
mu2   = filter2(window, img2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2;

if (C1 > 0 & C2 > 0)
   ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
else
    
    % 考虑到C2可能为0,使得分母出现零的情况
   numerator1 = 2*mu1_mu2 + C1;
   numerator2 = 2*sigma12 + C2;
	denominator1 = mu1_sq + mu2_sq + C1;
   denominator2 = sigma1_sq + sigma2_sq + C2;
   ssim_map = ones(size(mu1));
   index = (denominator1.*denominator2 > 0);
   ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));
   index = (denominator1 ~= 0) & (denominator2 == 0);
   ssim_map(index) = numerator1(index)./denominator1(index);
end

mssim = mean2(ssim_map);

return

相关参数说明:filter2 fspecial

5. 例子

img=imread('D:/lena_in_scene.jpg');
imshow(img);
title('原图像');
figure;
img_gaussian=imnoise(img, 'gaussian' , 0, 0.02 ); %均值为0,方差为0.02
imshow(img_gaussian);
title('加噪图像');
ssim_index(img,img_gaussian)

SSIM

SSIM

SSIM:0.1901 MSE:24361669

6. Reference

[1] Image Quality Assessment: From Error Visibility to Structural Similarity

脚本宝典总结

以上是脚本宝典为你收集整理的SSIM全部内容,希望文章能够帮你解决SSIM所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:数据库