Advertisement

【图像融合】评价方法(熵、均方根误差)

阅读量:

图像融合质量评价方法

一般分为主观和客观两类:

1、主观方法主要是观察者来评价融合结果的质量。

2、客观方法又分为两类:

(1)无参考图像评价方法(如信息熵)。

1)单一图像统计特征评价。

2)融合图像和原图像关系评价。

(2)有参考图像评价方法(如均方根误差)。


说明:L表示图像灰度级别。Pi表示灰度值i像素占总像素比例。E越大表示融合图像信息量越大。

代码示例

复制代码
    function varargout= msg(varargin)
    %函数功能:
    %     函数msg求出输入图像的熵
    %----------------------------------%
    
    if nargin<1         %判断输入变量的个数
    error('输入参数必须大于等于1.');
    elseif nargin==1
    varargout{1}=f(varargin{1});
    end
    end
    
    function y= f(x)
    %函数功能:
    %      函数y=f(x)的功能是求出图像x的熵
    %输入参数:
    %      x----输入的原图像
    %输出参数:
    %      y----原图像的熵
    %-------------------------------------------------%
    x=uint8(x);
    temp=unique(x);   %temp就是x中全部不同的元素,例如x=[1,1,3,4,1,5];那么temp=[1;3;4;5]
    temp=temp';
    len=length(temp); %求出x矩阵中不同元素的个数
    p=zeros(1,len);   %p向量用来存储矩阵x中每个不同元素的个数
    [m,n]=size(x);
    for k=1:len
    for i=1:m
        for j=1:n
            if x(i,j)==temp(1,k)
                p(1,k)=p(1,k)+1;
            end
        end
    end
    end
    for k=1:len
    p(1,k)=p(1,k)/(m*n);  %求出每个不同元素出现的频率
    p(1,k)=-p(1,k)*log2(p(1,k));
    end
    y=sum(p);
    end
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

函数调用

复制代码
    x1 = imread('lena.jpg');
    x2 = imread('lena1.jpg');
    x3 = imread('lena2.jpg');
    
    subplot(1,3,1);imshow(x1);title('源图像');
    subplot(1,3,2);imshow(x2);title('左模糊');
    subplot(1,3,3);imshow(x3);title('右模糊');
    
    out{1}= msg(x1);
    out{2}= msg(x2);
    out{3}= msg(x3);
    
    fprintf('\n图像1的熵:%f\n',out{1});
    fprintf('\n图像2的熵:%f\n',out{2});
    fprintf('\n图像3的熵:%f\n',out{3});
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

运行结果


均方根误差

说明:均方误差越小,表示融合图像和参考图差异越小,融合效果越好。

代码示例

复制代码
    function varargout= rmse(varargin)
    
    if nargin<2
    error('输入参数必须大于等于2.');
    elseif nargin==2
    varargout{1}=h(varargin{1},varargin{2});
    end
    end
    
    function r=h(f,g)
    %函数功能:
    %      函数r=h(f,g)求出两幅图像的均方根误差r
    %输入参数:
    %      f----标准图像
    %      g----融合后的图像
    %-------------------------------------%
    
    f=double(f);
    g=double(g);
    [m,n]=size(f);
    
    temp=[];
    for i=1:m
    for j=1:n
        temp(i,j)=(f(i,j)-g(i,j))^2;
    end
    end
    
    r=sqrt(sum(sum(temp))/(m*n));
    
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

函数调用

复制代码
    x1 = imread('lena.jpg');
    x2 = imread('lena1.jpg');
    x3 = imread('lena2.jpg');
    
    subplot(1,3,1);imshow(x1);title('源图像');
    subplot(1,3,2);imshow(x2);title('左模糊');
    subplot(1,3,3);imshow(x3);title('右模糊');
    
    out1= rmse(x1,x2);
    out2= rmse(x1,x3);
    
    fprintf('\n图像1、2的均方根误差:%f\n',out1);
    fprintf('\n图像1、3的均方根误差:%f\n',out2);
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    

运行结果


全部评论 (0)

还没有任何评论哟~