ssim算法原理 - 我們都不是神的孩子 - CSDN博客 http://blog.csdn.net/ecnu18918079120/article/details/60149864
一、結構相似性(structural similarity)
自然圖像具有極高的結構性,表現在圖像的像素間存在着很強的相關性,尤其是在空間相似的情況下。這些相關性在視覺場景中攜帶着關於物體結構的重要信息。我們假設人類視覺系統(HSV)主要從可視區域內獲取結構信息。所以通過探測結構信息是否改變來感知圖像失真的近似信息。
大多數的基於誤差敏感度(error sensitivity)的質量評估方法(如MSE,PSNR)使用線性變換來分解圖像信號,這不會涉及到相關性。我們要討論的SSIM就是要找到更加直接的方法來比較失真圖像和參考圖像的結構。
二、SSIM指數
物體表面的亮度信息與照度和反射系數有關,且場景中的物體的結構與照度是獨立的,反射系數與物體有關。我們可以通過分離照度對物體的影響來探索一張圖像中的結構信息。
這里,把與物體結構相關的亮度和對比度作為圖像中結構信息的定義。因為一個場景中的亮度和對比度總是在變化的,所以我們可以通過分別對局部的處理來得到更精確的結果。

由SSIM測量系統可得相似度的測量可由三種對比模塊組成,分別為:亮度,對比度,結構。接下來我們將會對這三模塊函數進行定義。
首先,對於離散信號,我們以平均灰度來作為亮度測量的估計:

亮度對比函數l(x,y)是關於
的函數。

然后,由測量系統知道要把平均灰度值從信號中去除,對於離散信號
,可使用標准差來做對比度估量值。


對比度對比函數c(x,y)就是
的函數。

接下來,信號被自己的標准差相除,結構對比函數就被定義成
和
的函數。


最后,三個對比模塊組合成一個完整的相似測量函數:

S(x,y)應該滿足以下三個條件:
(1) 對稱性:
;

(2) 有界性:
;

(3) 最大值唯一性:當且僅當x=y時,S(x,y)=1 。
現在,我們定義三個對比函數。
亮度對比函數:

常數
是為了避免
接近0時造成系統的不穩定。


特別的,我們選擇
,L為圖像灰度級數,對於8-bit灰度圖像,L=255,
。公式(4)滿足上述三個條件。


對比度對比函數:

常數
,且
。公式(5)依然滿足上述三個條件。


結構對比函數:

其中

最后把三個函數組合起來,得到SSIM指數函數:

這里
,用來調整三個模塊間的重要性。

為了得到簡化形式,設
,得到:


三、SSIM指數應用於圖像質量評估
在圖像質量評估之中,局部求SSIM指數的效果要好於全局。第一,圖像的統計特征通常在空間中分布不均;第二,圖像的失真情況在空間中也是變化的;第三,在正常視距內,人們只能將視線聚焦在圖像的一個區域內,所以局部處理更符合人類視覺系統的特點;第四,局部質量檢測能得到圖片空間質量變化的映射矩陣,結果可服務到其他應用中。
所以,在上述公式中,
都加入了一個8*8的方形窗,並且逐像素的遍歷整幅圖片。每一步計算,
和SSIM都是基於窗口內像素的,最終得到一個SSIM指數映射矩陣,由局部SSIM指數組成。然而,簡單的加窗會使映射矩陣出現不良的“分塊”效應。為解決這問題,我們使用11*11的對稱高斯加權函數
作為加權窗口,標准差為1.5,且




則
的估計值表示為:




應用這種加窗方法,映射矩陣就可展現出局部各向同性的性質。
在這里,經過一些實驗總結,我們把K1設為0.01,K2設為0.03,然后用平均SSIM指數作為整幅圖像的估計質量評價:

其中X,Y為圖像,
為局部SSIM指數在映射中的位置,MN為局部窗口的數量。

四、matlab實現
- function [mssim, ssim_map,siga_sq,sigb_sq] = SSIM(ima, imb)
- % ========================================================================
- %ssim的算法主要參考如下論文:
- %Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image
- % quality assessment: From error visibility to structural similarity,"
- % IEEE Transactios on Image Processing, vol. 13, no. 4, pp. 600-612,
- % Apr. 2004.
- % 首先對圖像加窗處理,w=fspecial('gaussian', 11, 1.5);
- % (2*ua*ub+C1)*(2*sigmaa*sigmab+C2)
- % SSIM(A,B)=————————————————————————
- % (ua*ua+ub*ub+C1)(sigmaa*sigmaa+sigmab*sigmab+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各窗口內灰度值的方差
- %-------------------------------------------------------------------
- % Cool_ben
- %========================================================================
- 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