對於一種圖像處理方法,怎么樣來判斷該算法效果的好壞呢?除了人眼本身的觀察,還可以用某種指標來量化評判,本文將總結一下圖像質量評判的方法及實現。
峰值信噪比
峰值信噪比(PSNR)是一個用來評估圖像的保真性的客觀標准,經常用作圖像壓縮等信號重建質量的評價,非常簡單的方式是通過均方差(MSE)來定義:
\[MSE=\frac{\sum_{i=1}^{H}\sum_{j=1}^{W}{\left ( X\left ( i,j \right ) - Y\left ( i,j \right ) \right )}^2}{H * W} \]
\[PSNR=10\log_{10}{\frac{(2^n-1)^2}{MSE}} \]
其中,PSNR值越大,就代表失真越少,圖像壓縮典型的峰值信噪比在30-40dB
,小於30dB
的圖像是無法忍受的錯誤圖像。
function [PSNR, MSE] = psnr(X, Y)
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 計算峰值信噪比PSNR
% 將RGB轉成YCbCr格式進行計算
% 如果直接計算會比轉后計算值要小2dB左右(當然是個別測試)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
if size(X,3)~=1 %判斷圖像時不是彩色圖,如果是,結果為3,否則為1
org=rgb2ycbcr(X);
test=rgb2ycbcr(Y);
Y1=org(:,:,1);
Y2=test(:,:,1);
Y1=double(Y1); %計算平方時候需要轉成double類型,否則uchar類型會丟失數據
Y2=double(Y2);
else %灰度圖像,不用轉換
Y1=double(X);
Y2=double(Y);
end
if nargin<2
D = Y1;
else
if any(size(Y1)~=size(Y2))
error('The input size is not equal to each other!');
end
D = Y1 - Y2;
end
MSE = sum(D(:).*D(:)) / numel(Y1);
PSNR = 10*log10(255^2 / MSE);
NC
NC對兩幅圖進行相似度的衡量,除了用眼觀看的方法之外,我們可以食用更加精確的使用數據來客觀評估歸一化,歸一化的相關系數(NC)提供了度量工具,,可以用來衡量圖像的魯棒性。
\[NC=\frac{\sum_{x=1}^{M} \sum_{y=1}^{N}W(x,y)W(x,y)^-))}{\sqrt{\sum_{x=1}^{M} \sum_{y=1}^{N} W(x,y)^2)} \sqrt{\sum_{x=1}^{M} \sum_{x=1}^{N}W(x,y)^2)}} \]
其中W(x,y)
和$W(x,y)^-$
是代表的兩張圖,M和N代表的是圖像分標率,NC取值一般在[0,1],越接近1表示魯棒性越好。