对于一种图像处理方法,怎么样来判断该算法效果的好坏呢?除了人眼本身的观察,还可以用某种指标来量化评判,本文将总结一下图像质量评判的方法及实现。
峰值信噪比
峰值信噪比(PSNR)是一个用来评估图像的保真性的客观标准,经常用作图像压缩等信号重建质量的评价,非常简单的方式是通过均方差(MSE)来定义:
[MSE=frac{sum_{i=1}^{H}sum_{j=1}^{W}{left ( Xleft ( i,j
ight ) - Yleft ( i,j
ight )
ight )}^2}{H * W}
]
[PSNR=10log_{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表示鲁棒性越好。