1. 程式人生 > >【影象融合】評價方法(熵、均方根誤差)

【影象融合】評價方法(熵、均方根誤差)

影象融合質量評價方法

  一般分為主觀和客觀兩類:

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);

執行結果