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)=
(uaua+ubub+C1)(sigmaasigmaa+sigmabsigmab+C2)
C1=(K1L);
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