计算图像SSIM

284 阅读1分钟

ssim的算法主要参考如下论文:
Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image
quality assessment: From error visibility to structural similarity,"
操作流程如下\ 首先对图像加窗处理
w=fspecial('gaussian', 11, 1.5);
(2uaub+C1)(2sigmaasigmab+C2)
SIM(A,B)= (ua
ua+ubub+C1)(sigmaasigmaa+sigmabsigmab+C2)
C1=(K1
L);
C2=(K2*L); K1=0.01,K2=0.03
L为灰度级数,L=255
参数说明:

%     ima - 比较图像A  
%     imb - 比较图像B  
%  
% ssim_map - 各加窗后得到的SSIM(A,B|w)组成的映射矩阵  
%    mssim - 对加窗得到的SSIM(A,B|w)求平均,即最终的SSIM(A,B)  
%  siga_sq - 图像A各窗口内灰度值的方差  
%  sigb_sq - 图像B各窗口内灰度值的方差  

demo-ssim:

function [mssim, ssim_map,siga_sq,sigb_sq] = SSIM(ima, imb)  
w = fspecial('gaussian', 11, 1.5);  %window 加窗  
K(1) = 0.01;                      
K(2) = 0.03;                      
L = 255;       
ima = double(ima);  
imb = double(imb);  
  
C1 = (K(1)*L)^2;  
C2 = (K(2)*L)^2;  
w = w/sum(sum(w));  
  
ua   = filter2(w, ima, 'valid');%对窗口内并没有进行平均处理,而是与高斯卷积,  
ub   = filter2(w, imb, 'valid'); % 类似加权平均  
ua_sq = ua.*ua;  
ub_sq = ub.*ub;  
ua_ub = ua.*ub;  
siga_sq = filter2(w, ima.*ima, 'valid') - ua_sq;  
sigb_sq = filter2(w, imb.*imb, 'valid') - ub_sq;  
sigab = filter2(w, ima.*imb, 'valid') - ua_ub;  
  
ssim_map = ((2*ua_ub + C1).*(2*sigab + C2))./((ua_sq + ub_sq + C1).*(siga_sq + sigb_sq + C2));  
  
  
mssim = mean2(ssim_map);  
  
return