• 图像处理之图像质量评价指标RMSE(均方根误差)


    一、RMSE基本定义

    MSE全称为“Root Mean Square Error”,中文意思即为均方根误差,是衡量图像质量的指标之一。计算原理为真实值与预测值的差值的平方然后求和再平均,最后开根号,公式如下:
    在这里插入图片描述
    RMSE值越小,说明图像越相似。计算RMSE有四种方法:

    方法一:计算RGB图像三个通道每个通道的MSE值再求平均值,最后开根号即可

    方法二:直接使用matlab的内置函数immse()(注意该函数将所有图像当成灰度图像处理),再开根号即可

    方法三:判断图像的维度,若是三维即为RGB图像求其RMSE,若是二维即为灰度图像求其RMSE

    方法四:同方法三,对RMSE进行归一化处理

    二、matlab实现RMSE

    1、方法一:rgbRMSE.m

    function rmsevalue= rgbRMSE(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    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值相加,注意(:)的用法
    rmsevalue=sqrt(MSE_RGB/(row*col)); % 在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

    2、方法二:grayRMSE.m

    function rmsevalue = grayRMSE(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    image1=double(image1);
    image2=double(image2);
    rmsevalue=sqrt(sum(sum((image1-image2).^2))/(row*col)); % 在MSE的基础上开根号
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、方法三:rgbgrayRMSE.m

    function rmsevalue = rgbgrayRMSE(image1,image2)
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    
    % 一定要注意转为double类型
    image1=double(image1);
    image2=double(image2);
    
    dim=length(size(image1));% 图像的维度
    if dim==2    % 灰度图像只有二维,彩色图像有三维
        sum_mse=sum(sum((image1-image2).^2));% 两次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加
    else
        sum_mse=sum(sum(sum((image1-image2).^2)));% 三次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加,第三次使用sum将每个通道值的和再次相加
    end
    rmsevalue=sqrt(sum_mse/(row*col));
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4、方法四:NRMSE.m

    function nrmsevalue = NRMSE(image1,image2)
    
    % image1和image2大小相等
    row=size(image1,1); % 图像的长
    col=size(image1,2); % 图像的宽
    
    % 一定要注意转为double类型
    image1=double(image1);
    image2=double(image2);
    
    dim=length(size(image1));% 图像的维度
    
    if dim==2    % 灰度图像只有二维,彩色图像有三维
        sum_mse1=sum(sum((image1-image2).^2));% 两次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加
        sum_mse2=sum(sum(image1.^2));
    else
        sum_mse1=sum(sum(sum((image1-image2).^2)));% 三次使用sum()函数,第一次使用sum将每行值相加,第二次使用sum将每行值的和再次相加,第三次使用sum将每个通道值的和再次相加
        sum_mse2=sum(sum(sum(image1.^2)));
    end
    nrmsevalue=sqrt(sum_mse1/(row*col))/sqrt(sum_mse2/(row*col));
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5、主函数main.m

    clc;clear;close all;
    rgbimage=imread('ultraman.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('ultraman.jpg'));
    attack_grayimage=imnoise(grayimage,'gaussian',0,0.01);
    figure(2),
    subplot(121),imshow(grayimage);
    title('原始图像');
    subplot(122),imshow(attack_grayimage);
    title('噪声攻击图像');
    % =============rgbRMSE.m============= %
    rmsevalue1 = rgbRMSE(rgbimage,attack_rgbimage);
    disp('RGB图像的均方根误差:');
    disp(rmsevalue1);
    % =============immse============= %
    rmsevalue2 = sqrt(immse(rgbimage,attack_rgbimage)); % 在使用matlab内置函数immse的基础上开根号
    disp('matlab函数的均方误差:');
    disp(rmsevalue2);
    % =============grayRMSE.m============= %
    rmsevalue3 = grayRMSE(grayimage,attack_grayimage);
    disp('灰度图像的均方根误差:');
    disp(rmsevalue3);
    % =============rgbgrayRMSE.m============= %
    rmsevalue4 = rgbgrayRMSE(rgbimage,attack_rgbimage);
    disp('RGB图像的均方根误差:');
    disp(rmsevalue4);
    
    rmsevalue5 = rgbgrayRMSE(grayimage,attack_grayimage);
    disp('灰度图像的均方根误差:');
    disp(rmsevalue5);
    % =============NRMSE.m============= %
    rmsevalue6 = NRMSE(rgbimage,attack_rgbimage);
    disp('RGB图像的归一化均方根误差:');
    disp(rmsevalue6);
    
    rmsevalue7 = NRMSE(grayimage,attack_grayimage);
    disp('灰度图像的归一化均方根误差:');
    disp(rmsevalue7);
    
    • 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
    • 41
    • 42
    • 43
    • 44

    三、实现结果分析

    1、输出结果

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

    1、注意每次运行主函数main.m文件,输出的RMSE值都会有细微差别,可以对比上下两张图。
    在这里插入图片描述
    2、仅以高斯噪声的参数为讨论,我们将主函数main.m文件椒盐噪声的方差改为0.001,可以与上方得到方差为0.01的RMSE结果进行对比,可以看出得到的RMSE要小很多,表示图像质量更好。

    在这里插入图片描述
    3、利用matlab的内置函数immse计算的灰度图像RMSE比我们自己写的方法计算的灰度图像RMSE要大一些。

    4、本质上,方法三是方法一和方法二的结合体。

  • 相关阅读:
    代码随想录算法训练营第三十四天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
    链表中的节点每k个一组翻转
    java基于Springboot的高校智能排课网站
    web安全之XSS攻击
    从滑动窗口到YOLO、Transformer:目标检测的技术革新
    基于PyTorch的生成对抗网络实战(7)——利用Pytorch搭建SGAN(Semi-Supervised GAN)生成手写数字并分类
    两APP通信之AIDL使用。
    马斯克收购 Twitter 后的 Web3 改革方向
    Ubuntu Anaconda 环境下删除 protobuf
    【笔记】Sturctured Streaming笔记总结(Python版)
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/127705623