影象質量評價方法PSNR+SSIM&&評估指標SROCC,PLCC
ssim的計算裡面有高斯模糊,為了快速計算,先對每個小塊進行計算,然後計算所有塊的平均值。可以參考原始碼實現,而且程式碼實現有近似的在裡面!matlab中中影象PSNR和SSIM的計算
“在實際應用中,可以利用滑動窗將影象分塊,令分塊總數為N,考慮到視窗形狀對分塊的影響,採用高斯加權計算每一視窗的均值、方差以及協方差,然後計算對應塊的結構相似度SSIM,最後將平均值作為兩影象的結構相似性度量,即平均結構相似性MSSIM”
function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L) C1 = (K(1)*L)^2; C2 = (K(2)*L)^2; window = window/sum(sum(window)); img1 = double(img1); img2 = double(img2); 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
1.PSNR,峰值信噪比
通常用來評價一幅影象壓縮後和原影象相比質量的好壞,當然,壓縮後圖像一定會比原影象質量差的,所以就用這樣一個評價指標來規定標準了。PSNR越高,壓縮後失真越小。這裡主要定義了兩個值,一個是均方差MSE,另一個是峰值信噪比PSNR,公式如下:
這裡的MAX通常是影象的灰度級,一般就是255了。
close all; clear all; clc; img=imread('lena.jpg'); [h w]=size(img); imgn=imresize(img,[floor(h/2) floor(w/2)]); imgn=imresize(imgn,[h w]); img=double(img); imgn=double(imgn); B=8; %編碼一個畫素用多少二進位制位 MAX=2^B-1; %影象有多少灰度級 MES=sum(sum((img-imgn).^2))/(h*w); %均方差 PSNR=20*log10(MAX/sqrt(MES)); %峰值信噪比
原圖
影象寬高分別縮小1/2再放大到原圖,PSNR=30.2dB
影象寬高分別縮小1/5再放大到原圖,PSNR=24.5dB
可以看出PSNR越高,影象和原圖越接近。當然,這都是客觀指標,實際評價還有主觀指標,不過主觀的東西就比較模糊了,每個人感覺都會不同的。最常用的全參考視訊質量評價方法有以下2種:
PSNR(峰值信噪比):用得最多,但是其值不能很好地反映人眼主觀感受。一般取值範圍:20-40.值越大,視訊質量越好。
SSIM(結構相似性):計算稍複雜,其值可以較好地反映人眼主觀感受。一般取值範圍:0-1.值越大,視訊質量越好。
PSNR,SSIM計算有如下工具可選:
Evalvid中的psnr.exe:開源軟體,命令列介面,使用無限制。推薦,適合批處理。
注:MOS(Mean Opnion Score,平均意見分)是主觀評價實驗之後,得到的主觀分數,取值0-100,值越大,代表主觀感受越好。以下實驗資料來自Live資料庫:http://live.ece.utexas.edu/research/Quality/
SSIM引數
一種衡量兩幅影象相似度的新指標,其值越大越好,最大為1,經常用到影象處理中,特別在影象去噪處理中在影象相似度評價上全面超越SNR(signal to noise ratio)和PSNR(peak signal to noise ratio)。結構相似性理論認為,自然影象訊號是高度結構化的,即畫素間有很強的相關性,特別是空域中最接近的畫素,這種相關性蘊含著視覺場景中物體結構的重要資訊;HVS的主要功能是從視野中提取結構資訊,可以用對結構資訊的度量作為影象感知質量的近似。結構相似性理論是一種不同於以往模擬HVS低階的組成結構的全新思想,與基於HVS特性的方法相比,最大的區別是自頂向下與自底向上的區別。這一新思想的關鍵是從對感知誤差度量到對感知結構失真度量的轉變。它沒有試圖通過累加與心理物理學簡單認知模式有關的誤差來估計影象質量,而是直接估計兩個複雜結構訊號的結構改變,從而在某種程度上繞開了自然影象內容複雜性及多通道去相關的問題。作為結構相似性理論的實現,結構相似度指數從影象組成的角度將結構資訊定義為獨立於亮度、對比度的,反映場景中物體結構的屬性,並將失真建模為亮度、對比度和結構三個不同因素的組合。用均值作為亮度的估計,標準差作為對比度的估計,協方差作為結構相似程度的度量。
結構相似性指標(英文:structural similarity index,SSIM index)是一種用以衡量兩張數位影像相似程度的指標。當兩張影像其中一張為無失真影像,另一張為失真後的影像,二者的結構相似性可以看成是失真影像的影像品質衡量指標。相較於傳統所使用的影像品質衡量指標,像是峰值信噪比(英文:PSNR),結構相似性在影像品質的衡量上更能符合人眼對影像品質的判斷。
實際使用時,簡化起見,一般會將引數設為及,得到:
在計算兩張影像的結構相似性指標時,會開一個區域性性的視窗,一般為×的小區塊,計算出視窗內訊號的結構相似性指標,每次以畫素為單位移動視窗,直到整張影像每個位置的區域性結構相似性指標都計算完畢。將全部的區域性結構相似性指標平均起來即為兩張影像的結構相似性指標。
- 在實際應用中,可以利用滑動窗將影象分塊,令分塊總數為N,考慮到視窗形狀對分塊的影響,採用高斯加權計算每一視窗的均值、方差以及協方差,然後計算對應塊的結構相似度SSIM,最後將平均值作為兩影象的結構相似性度量,即平均結構相似性MSSIM:
opencv和matlab都有現成的函式可以使用。
影象質量評價指標
MSE: Mean Squared Error
均方誤差是指引數估計值與引數真值之差平方的期望值;
MSE可以評價資料的變化程度,MSE的值越小,說明預測模型描述實驗資料具有更好的精確度。
RMSE
均方誤差:均方根誤差是均方誤差的算術平方根
MAE :Mean Absolute Error
平均絕對誤差是絕對誤差的平均值
平均絕對誤差能更好地反映預測值誤差的實際情況.
SD :standard Deviation
標準差:標準差是方差的算術平方根。標準差能反映一個數據集的離散程度。平均數相同的兩組組資料,標準差未必相同。
Spearman秩序相關係數(SROCC)本身就不是衡量線性相關的,而是衡量秩序的相關性的。設有兩組序列X和Y,其秩序為R(X)和R(Y),這裡R(Xi)=k代表Xi是序列X中的第k大(或第k小),則SROCC(X, Y) = PLCC(R(X), R(Y)),其中PLCC是Pearson線性相關係數。
SROCC被認為是最好的非線性相關指標,這是因為,SROCC只與序列中元素的排序有關。因此即使X或Y被任何單調非線性變換作用(如對數變換、指數變換),都不會對SROCC造成任何影響,因為不會影響元素的排序。維基百科有一張很直觀的圖片,很好地體現了SROCC與PLCC的區別。
除此之外,還有一個Kendall秩序相關係數(KROCC),它的定義是pairwise的:
KROCC = (同序對數-逆序對數) / 總對數 (總對數=n(n - 1)/2)它的性質與SROCC類似,但是比較抖。對於連續輸出的機器學習模型或簡單的迴歸擬合,發Paper的話,一般要放SROCC和PLCC,這兩個標準是最重要的,可以很好地衡量模型的非線性相關性和線性相關性。偶爾也會放KROCC和RMSE(方均根誤差)。但是SROCC是比PLCC更為根本的指標,因為一個複雜模型總可以用一些附加的非線性變換(對數或者指數,還有某些領域內recommanded複雜的組合= =)來補正,使得PLCC更高一些,而SROCC卻不能被這些附加非線性變換來影響。
附Python計算PSNR程式碼:
# PSNR.py
import numpy as np
import math
def psnr(target, ref, scale):
# target:目標影象 ref:參考影象 scale:尺寸大小
# assume RGB image
target_data = np.array(target)
target_data = target_data[scale:-scale,scale:-scale]
ref_data = np.array(ref)
ref_data = ref_data[scale:-scale,scale:-scale]
diff = ref_data - target_data
diff = diff.flatten('C')
rmse = math.sqrt( np.mean(diff ** 2.) )
return 20*math.log10(1.0/rmse)