质量评估指标:SSIM(Structural similarity 结构相似性)

本文介绍了结构相似性指标(SSIM)的概念,它是一种衡量图像质量的方法,关注图像的结构信息和感知变化。SSIM与传统的MSE和PSNR不同,因为它考虑了像素间的依赖性和感知现象。SSIM的计算涉及平均值、方差和协方差,并通过特定的窗口函数进行操作。该指标广泛应用于图像压缩、图像修复和模式识别等领域。提供的源码展示了SSIM的MATLAB实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、结构相似性

SSIM 是一种基于感知的模型,它将图像退化视为结构信息的感知变化,同时还结合了重要的感知现象,如亮度掩蔽和对比度掩蔽。
与 MSE 或 PSNR 等其他技术的不同之处在于,这些方法估计绝对误差。
结构信息是指像素具有很强的相互依赖性,尤其是当它们在空间上接近时。 这些依赖项携带有关视觉场景中对象结构的重要信息。

二、定义

SSIM值是通过不同的图像窗口计算的
在这里插入图片描述
u_x:x的平均值;
u_y:y的平均值;
o_x^2:x的方差;
o_y^2:y的方差;
o_xy:x和y的协方差;
c1=(k1L)^2;
c2=(k2
L)^2;
L:像素值的动态范围;
默认值:k1=0.01、k2=0.03。


三、应用

图像压缩:SSIM
图像修复:Stat-SSIM
模式识别:CW-SSIM

四、SSIM源码

function [mssim, ssim_map] = ssim(img1, img2, K, window, L)

if (nargin < 2 || nargin > 5)
   mssim = -Inf;
   ssim_map = -Inf;
   return;
end

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

[M N] = size(img1);

if (nargin == 2)
   if ((M < 11) || (N < 11))
	   mssim = -Inf;
	   ssim_map = -Inf;
      return
   end
   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))
	   mssim = -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)
		   mssim = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   mssim = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

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

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


img1 = double(img1);
img2 = double(img2);

% automatic downsampling
f = max(1,round(min(M,N)/256));
%downsampling by f
%use a simple low-pass filter 
if(f>1)
    lpf = ones(f,f);
    lpf = lpf/sum(lpf(:));
    img1 = imfilter(img1,lpf,'symmetric','same');
    img2 = imfilter(img2,lpf,'symmetric','same');

    img1 = img1(1:f:end,1:f:end);
    img2 = img2(1:f:end,1:f:end);
end

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

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
   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

参考文献
Image_quality_assessment_from_error_visibility_to_structural_similarity

### Structural Similarity Index (SSIM) 参数详解 #### SSIM 函数参数说明 `structural_similarity` 是用于测量两幅图像之间结构相似性的函数。该函数接受多个可选参数,这些参数可以调整比较过程中的行为: - `X`: 输入的第一张灰度图像。 - `Y`: 输入的第二张灰度图像,尺寸需与 X 相同。 - `win_size`: 使用窗口大小,默认为 11×11 像素。较大的窗口可能会提高准确性但也增加了计算成本[^1]。 - `gradient`: 如果设置为 True,则返回梯度图;默认 False 只返回指数值。 - `data_range`: 数据范围,即最大可能像素差异。对于8位图像通常设为255。 - `multichannel`: 是否处理多通道图像(彩色)。当输入的是单通道灰度图片时应将其置为False。 ```python from skimage.metrics import structural_similarity as ssim import numpy as np # 示例代码展示如何调用 structural_similarity 函数并传入不同参数 img1_gray = ... # 加载第一张灰度图像 img2_gray = ... # 加载第二张灰度图像 ssim_value, grad = ssim( img1_gray, img2_gray, win_size=11, gradient=True, data_range=img1_gray.max() - img1_gray.min(), multichannel=False ) print(f'SSIM Value: {ssim_value}') ``` 此段代码展示了如何利用 `structural_similarity` 来获取两张给定灰度图像间的 SSIM 数值以及它们之间的梯度信息。注意这里假设已经加载好了两个变量 `img1_gray`, `img2_gray` 表示要被比较的一对灰度化后的图像数据。 #### 关键点解释 为了更好地理解上述参数的作用,在实际应用中可以根据具体情况调整这些选项以获得最合适的匹配效果。例如,如果知道所使用的图像具有特定的最大最小强度级别,则可以通过指定 `data_range` 提高精度。而开启 `gradient` 则有助于后续分析或可视化目的下的进一步操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值