图像质量评价MSE,SNR等指标(附Matlab代码)

通过其原始图像作为参考来评价一幅图像,就是有参照图像评价。
有参照图像评价参数主要包括MAE、MSE、NMSE、SNR、PSNR、ISNR等。
(1)平均绝对误差(MAE)
平均绝对误差的计算是把评价图像与原始图像各点灰度差的绝对值之和除以图像的大小。
其值越小表示与原始图像的偏差越小,图像质量越好。
M A E = ∑ i = 1 M ∑ j = 1 N ∣ g ( i , j ) − g ^ ( i , j ) ∣ M × N . MAE=\frac{\sum_{i=1}^{M}\sum_{j=1}^N |g(i,j)-\widehat{g}(i,j)|}{M\times N}. MAE=M×Ni=1Mj=1Ng(i,j)g (i,j).
M和N分别表示图像长度和宽度上的像素点数,g(i,j)和g’(i,j)分别是原始图像和待评价图像图像在点(i,j)处的灰度值。

%该函数用于计算MAE评价绝对误差
%值越小表示与原始图像偏差越小,图像质量越好
%I表示原始图像
%J表示恢复后的图像
function mae = calculate_mae(I,J)
    %如果是I灰度图像只有二维,如果I是彩色图像将会有三维
    dim = length(size(I));%保存的是I的维度
    M = size(I,1);
    N = size(I,2);
    dif = abs(I - J);
    if dim == 2
        val = sum(sum(dif));
    else
        val = sum(sum(sum(dif)));
    end
    mae = val / (M*N);
end

(2)均方误差(MSE)
均方误差也是判断图像质量最常用的算法之一。
MSE的值越小表示图像的质量越好。
M S E = ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) − g ^ ( i , j ) ] 2 M × N . MSE=\frac{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)-\widehat{g}(i,j)]^2}{M\times N}. MSE=M×Ni=1Mj=1N[g(i,j)g (i,j)]2.

%该函数用于计算MSE计算均方误差
%mse值越小图像质量越好。
%I表示原始图像
%J表示恢复后的图像
function mse = calculate_mse(I,J)
    %如果是I灰度图像只有二维,如果I是彩色图像将会有三维
    dim = length(size(I));%保存的是I的维度
    M = size(I,1);
    N = size(I,2);
    dif = (I - J).^2;
    if dim == 2
        val = sum(sum(dif));
    else
        val = sum(sum(sum(dif)));
    end
    mse = val / (M*N);%其实这里的M*N=numel(I)
end

补充:
numel(a)函数才可以计算矩阵a中元素的个数;
length(a)函数计算的其实是矩阵a所有维数中含有元素最多的维数对应的元素个数。
而prod(size(a)),作用同numel,matlab推荐使用numel。prod函数作用是相乘。

a=[1,2,3;4,5,6];
length(a)%3
numel(a)%6
prod(size(a))%size(a)=[2,3],prod([2,3])=2*3=6

(3)归一化均方误差(NMSE)
归一化均方误差是一种基于能量归一化的测量方法,它相对均方误差是将分母的大小变成了原始图像的各个像素的平方和。
同样是值越小表示图像质量越好。
N M S E = ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) − g ^ ( i , j ) ] 2 ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) ] 2 . NMSE=\frac{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)-\widehat{g}(i,j)]^2}{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)]^2}. NMSE=i=1Mj=1N[g(i,j)]2i=1Mj=1N[g(i,j)g (i,j)]2.

%该函数用于计算MSE计算归一化均方误差
%值越小图像质量越好
%I表示原始图像
%J表示恢复后的图像
function nmse = calculate_nmse(I,J)
    %如果是I灰度图像只有二维,如果I是彩色图像将会有三维
    dim = length(size(I));%保存的是I的维度
    dif = (I - J).^2;
    I_2 = I.^2;
    if dim == 2
        val1 = sum(sum(dif));
        val2 = sum(sum(I_2));
    else
        val1 = sum(sum(sum(dif)));
        val2 = sum(sum(sum(I_2)));
    end
    nmse = val1/val2;
end

(4)信噪比(SNR)与峰值信噪比(PSNR)
信噪比与峰值信噪比也是用来测量图像质量的常用参数。
信噪比与峰值信噪比是值越大代表图像质量越好。
S N R = 10 l o g 10 [ ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) ] 2 ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) − g ^ ( i , j ) ] 2 ] . SNR=10log_{10}[\frac{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)]^2}{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)-\widehat{g}(i,j)]^2}]. SNR=10log10[i=1Mj=1N[g(i,j)g (i,j)]2i=1Mj=1N[g(i,j)]2].
P S N R = 10 l o g 10 [ 25 5 2 × M × N ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) − g ^ ( i , j ) ] 2 ] . PSNR=10log_{10}[\frac{255^2 \times M \times N}{\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)-\widehat{g}(i,j)]^2}]. PSNR=10log10[i=1Mj=1N[g(i,j)g (i,j)]22552×M×N].

%该函数用于计算SNR信噪比和PSNR峰值信噪比
%信噪比与峰值信噪比的值越大代表图像的质量越好。
%I表示原始图像
%J表示恢复后的图像
function [snr,psnr] = calculate_snr_psnr(I,J)
    %如果是I灰度图像只有二维,如果I是彩色图像将会有三维
    dim = length(size(I));%保存的是I的维度
    M = size(I,1);
    N = size(I,2);
    dif = (I - J).^2;
    I_2 = I.^2;
    if dim == 2
        val1 = sum(sum(dif));
        val2 = sum(sum(I_2));
    else
        val1 = sum(sum(sum(dif)));
        val2 = sum(sum(sum(I_2)));
    end
    snr = 10*log10(val2/val1);
    psnr = 10*log10((255*255*M*N)/val1);
end

(5)信噪比改善因子(ISNR)
MSE和PSNR只表征了复原图像相对于原始理想图像的相似程度,但没有标明复原图像相对于退化图像的改善程度。
I S N R = 10 l o g 10 [ ∑ i = 1 M ∑ j = 1 N [ g ( i , j ) − f ( i , j ) ] 2 ∑ i = 1 M ∑ j = 1 N [ f ^ ( i , j ) − f ( i , j ) ] 2 ] = P S N R f ^ − P S N R g . ISNR=10log_{10}[\frac {\sum_{i=1}^{M}\sum_{j=1}^N [g(i,j)-f(i,j)]^2} {\sum_{i=1}^{M}\sum_{j=1}^N [\widehat{f}(i,j)-f(i,j)]^2}] =PSNR_{\widehat{f}}-PSNR_g. ISNR=10log10[i=1Mj=1N[f (i,j)f(i,j)]2i=1Mj=1N[g(i,j)f(i,j)]2]=PSNRf PSNRg.
f(i,j)和f’(i,j)分别是原始图像和复原后的图像在点(i,j)处的灰度值,
g(i,j)表示退化图像在点(i,j)处的灰度值。
ISNR为复原图像的峰值信噪比与退化图像的峰值信噪比之差。
如果ISNR>0,ISNR越大,表明相对于退化图像复原的改善程度越大,算法的图像复原能力越好;
如果ISNR<0,表明图像相对于退化图像更加远离目标,不能使使退化图像得到改善。

%该函数用于计算ISNR信噪比改善因子
%I为原始图像
%P为退化的图像
%J为修复后的图像
%返回值isnr越大,表明相对于退化图像复原的改善程度越大,算法的图像恢复能力越好。
%反之如果isnr<0,说明图像相比于退化图像更加远离目标,算法不能使退化图像得到改善。
function isnr = calculate_isnr(I,P,J)
    %如果是I灰度图像只有二维,如果I是彩色图像将会有三维
    dim = length(size(I));%保存的是I的维度
    dif1 = (J - I).^2;%待评价图像相比于原始图像
    dif2 = (P - I).^2;%退化图像相比于原始图像
    if dim == 2
        val1 = sum(sum(dif1));
        val2 = sum(sum(dif2));
    else
        val1 = sum(sum(sum(dif1)));
        val2 = sum(sum(sum(dif2)));
    end
    isnr = 10*log10(val2/val1);
end

参考:Visual C++数字图像处理(谢凤英,赵丹培主编)

你可能感兴趣的:(matlab,数字图像处理,matlab,图像处理)