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