• 图像处理之图像质量评价指标PSNR(峰值信噪比)


    一、PSNR基本定义

    PSNR全称为“Peak Signal-to-Noise Ratio”,中文意思即为峰值信噪比,是衡量图像质量的指标之一。PSNR是基于MSE(均方误差)定义,对给定一个大小为m*n的原始图像I和对其添加噪声后的噪声图像K,其MSE可定义为:
    在这里插入图片描述
    则PSNR可定义为:
    在这里插入图片描述
    其中MAXI为图像的最大像素值,PSNR的单位为dB。若每个像素由8位二进制表示,则其值为2^8-1=255。但注意这是针对灰度图像的计算方法,若是彩色图像,通常可以由以下方法进行计算:

    方法一:计算RGB图像三个通道每个通道的MSE值再求平均值,进而求PSNR

    方法二:直接使用matlab的内置函数psnr()(注意该函数将所有图像当成灰度图像处理)。

    方法三:将图像转为YCbCr格式,只计算Y分量即亮度分量的PSNR。

    二、PSNR评价标准

    PSNR值越大,表示图像的质量越好,一般来说:

    (1)高于40dB:说明图像质量极好(即非常接近原始图像)
    (2)30—40dB:通常表示图像质量是好的(即失真可以察觉但可以接受)
    (3)20—30dB:说明图像质量差
    (4)低于20dB:图像质量不可接受

    三、matlab实现PSNR

    1、方法一:rgbPSNR.m

    function psnrvalue = rgbPSNR(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    % 注意不加下面两行代码,得出的最终PSNR值将比加上偏大
    image1=double(image1);
    image2=double(image2);
    
    MSE_R=double(zeros(row,col));
    MSE_G=double(zeros(row,col));
    MSE_B=double(zeros(row,col));
    image1_R=image1(:,:,1);  % R通道
    image1_G=image1(:,:,2);  % G通道
    image1_B=image1(:,:,3);  % B通道
    image2_R=image2(:,:,1);
    image2_G=image2(:,:,2);
    image2_B=image2(:,:,3);
    % 计算RGB图像三个通道每个通道的MSE值再求平均值
    for i=1:row
        for j=1:col
            MSE_R(i,j)=(image1_R(i,j)-image2_R(i,j))^2;
            MSE_G(i,j)=(image1_G(i,j)-image2_G(i,j))^2;
            MSE_B(i,j)=(image1_B(i,j)-image2_B(i,j))^2;
        end
    end
    MSE_RGB=sum(MSE_R(:))+sum(MSE_G(:))+sum(MSE_B(:)); % 将RGB三个通道计算的MSE值相加,注意(:)的用法
    MSE=MSE_RGB/(row*col);
    B=8;         % 编码一个像素所用二进制位数
    MAX=2^B-1;   % 图像的灰度级数        
    psnrvalue=20*log10(MAX/sqrt(MSE)); % 两个图像的峰值信噪比                     
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2、方法二:grayPSNR.m

    function psnrvalue = grayPSNR(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    image1=double(image1);
    image2=double(image2);
    B=8;         % 编码一个像素所用二进制位数
    MAX=2^B-1;   % 图像的灰度级数       
    MSE=sum(sum((image1-image2).^2))/(row*col);     % 均方差  
    psnrvalue=20*log10(MAX/sqrt(MSE));                        
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、方法三:ycbcrPSNR.m

    function psnrvalue = ycbcrPSNR(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    % rgb2ycbcr函数将 RGB 颜色值转换为 YCbCr 颜色空间
    ycbcrimage1=rgb2ycbcr(image1);
    ycbcrimage2=rgb2ycbcr(image2);
    % 取出Y通道
    ycbcrimage1_y=ycbcrimage1(:,:,1);
    ycbcrimage2_y=ycbcrimage2(:,:,1);
    
    ycbcrimage1_y=double(ycbcrimage1_y);
    ycbcrimage2_y=double(ycbcrimage2_y);
    
    B=8;         % 编码一个像素所用二进制位数
    MAX=2^B-1;   % 图像的灰度级数       
    MSE=sum(sum((ycbcrimage1_y-ycbcrimage2_y).^2))/(row*col);     % 均方差  
    psnrvalue=20*log10(MAX/sqrt(MSE)); 
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、主函数main.m

    clc;clear;close all;
    rgbimage=imread('boy.jpg');
    attack_rgbimage=imnoise(rgbimage,'gaussian',0,0.001);
    figure(1),
    subplot(121),imshow(rgbimage);
    title('原始图像');
    subplot(122),imshow(attack_rgbimage);
    title('噪声攻击图像');
    
    grayimage=rgb2gray(imread('boy.jpg'));
    attack_grayimage=imnoise(grayimage,'gaussian',0,0.001);
    figure(2),
    subplot(121),imshow(grayimage);
    title('原始图像');
    subplot(122),imshow(attack_grayimage);
    title('噪声攻击图像');
    
    
    % =====================PSNR Test===================== %
    % 高于40dB:说明图像质量极好(即非常接近原始图像)
    % 3040dB:通常表示图像质量是好的(即失真可以察觉但可以接受)
    % 2030dB:说明图像质量差
    % 低于20dB:图像质量不可接受
    
    % 注意每次运行产生的PSNR值都会一点点差别
     psnrvalue = rgbPSNR(rgbimage,attack_rgbimage);% 方法一
     disp('RGB图像的峰值信噪比:');
     disp(psnrvalue);
     
     psnrvalue1 = psnr(rgbimage,attack_rgbimage);% 方法二(psnr函数为matlab内置函数,但其将所有图像当成灰度图像处理,得出的PSNR值偏大)
     disp('matlab函数的峰值信噪比:');
     disp(psnrvalue1);
     
     psnrvalue2 = grayPSNR(grayimage,attack_grayimage);% 方法二
     disp('灰度图像的峰值信噪比:');
     disp(psnrvalue2);
     
     psnrvalue3 = ycbcrPSNR(rgbimage,attack_rgbimage);% 方法三
     disp('YCbCr图像Y通道的峰值信噪比:');
     disp(psnrvalue3);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    四、实现结果分析

    1、输出结果

    RGB图像:

    在这里插入图片描述
    对应灰度图像:
    在这里插入图片描述
    各种方法输出的PSNR值:
    在这里插入图片描述
    2、结果分析

    1、对于RGB图像计算的PSNR值最小,两个方法计算的灰度图像的PSNR基本一样,对于YCbCr图像的Y通道的PSNR值最大。

    2、注意每次运行主函数main.m文件,输出的PSNR值都会有细微差别,可以对比上下两张图。
    在这里插入图片描述
    3、对于以上提出的三种方法,不论使用哪种方法计算PSNR都无所谓,只要保持实验部分都使用同一种方法即可。但是一般方法一和方法三使用比较多。

    4、仅以高斯噪声的参数为讨论,我们将主函数main.m文件的高斯噪声的方差改为0.1,可以与上方得到方差为0.001的PSNR结果进行对比,可以看出得到的PSNR要小很多。
    在这里插入图片描述

  • 相关阅读:
    硬件【11】超全讲解I2C的上拉电阻
    【TVM源码学习笔记】3.1.2. Codegen低级化relay ir前的内存分配
    如果在学习spring的时候没看过这份学习笔记+源码剖析,真的亏大了!
    六、线程池的编写与解析 —— TinyWebServer
    全面理解Web3.0时代
    七夕了,给你的那个TA画上一箭倾心吧~
    web3 入门记录
    L1-018 大笨钟 C++解法
    python-opencv视频中的人脸检测
    【Web前端】HTML/CSS一文详解
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/127676377