【影象融合】評價方法(熵、均方根誤差)
阿新 • • 發佈:2019-01-02
影象融合質量評價方法
一般分為主觀和客觀兩類:
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);
執行結果