📄 maxchosenimf.m
字号:
function [c,s,varagout] = maxchosenimf(c1,s1,c2,s2,consistency,app)
% MAXCHOSENIMF利用最大值选择法对图像进行融合
%
% [c,s] = MAXCHOSENIMF(C1,S1,C2,S2,CONSISTENCY)对利用最大值选择法对
% 输入进行融合,并返回融合小波系数和簿记矩阵
% [C,S,MAP] = MAXCHOSENIMF(C1,S1,C2,S2,CONSISTENCY)返回融合小波系数,
% 簿记矩阵和融合map
% 输出map记录融合小波系数来自那幅图像,若来自图像1,则记0;
% 否则记1
%
% app的默认值为0
% app = 0 将两幅输入图像的近似系数进行平均
% app = 1 取两幅图像中近似系数的绝对值较小的作为融合系数
% app = 2 取两幅图像中近似系数的绝对值较大的作为融合系数
% consistency的默认值为1
% consistency = 0 不进行一致性检验
% consistency = 1 进行一致性检验
%
% 参见minchosenimf
% 检查输入和输出的合理性
error(nargchk(2,3,nargout));
error(nargchk(4,6,nargin));
sz1 = size(s1);
nmax = sz1(1) - 2;
tmap = cell(nmax,3);
elements1 = prod(s1,2);
elements2 = prod(s2,2);
if (ndims(c1) ~= 2)|(size(c1,1) ~= 1)|...
(ndims(c2) ~= 2)|(size(c2,1) ~= 1)
error('C1和C2必须是行向量');
end
if (ndims(s1) ~= 2)|~isreal(s1)|~isnumeric(s1)|(size(s1,2) ~= 2)|...
(ndims(s2) ~= 2)|~isreal(s2)|~isnumeric(s2)|(size(s2,2) ~= 2)
error('S1和S2必须是二维实数阵列');
end
if (length(c1) < elements1(end))| ...
~(elements1(1)+3*sum(elements1(2:end - 1)) >= elements1(end))| ...
(length(c2) < elements2(end))| ...
~(elements2(1)+3*sum(elements2(2:end - 1)) >= elements2(end))
error('[C1,S1]和[C2,S2]必须是标准小波分解结构');
end
if (length(c1) ~= length(c2))|(s1 ~= s2)
error('输入的源图像不符合要求:大小不同!')
end
if(nargin > 4) &(consistency ~= 0) & (consistency ~= 1)
error('consistency(是否进行一致性检验)输入错误!');
end
if (nargin > 5) & (~((app == 0)|(app == 1)|(app == 2)))
error('输入错误,请重新输入对近似图像的处理方法');
end
if nargin == 5
app = 0;
end
if nargin == 4
consistency = 1;
app = 0;
end
%选取绝对值最大的作为融合系数
decision1 = abs(c1) > abs(c2);
decision2 = abs(c1) <= abs(c2);
decision1 = im2double(decision1);
decision2 = im2double(decision2);
s = s1;
elements = prod(s,2);
%创建map若融合系数来自图1,则写入0,若来自图2则写入1
map = ones(1,length(c1));
map = map - decision1;
mask = ones(3,3)/9;
if app == 1
decision1(1:elements1(1)) = 1 - decision1(1:elements1(1));
decision2(1:elements2(1)) = 1 - decision2(1:elements2(1));
end
if app == 2
decision1(1:elements1(1)) = decision1(1:elements1(1));
decision2(1:elements2(1)) = decision2(1:elements2(1));
end
if consistency == 1
for i =1:nmax
for j = 1:3
tmap{i,j} = repmat(0,s(i + 1,:));
tmap{i,j}(:) = map(elements1(1) + (j - 1)*elements1(2) + 1:elements1(1) + j*elements1(2));
tmap{i,j} = impad(double(tmap{i,j}),1);
tmap{i,j} = round(conv2(tmap{i,j},mask,'valid'));
map(elements1(1) + (j - 1)*elements1(2) + 1:elements1(1) + j*elements1(2)) = tmap{i,j}(:);
end
elements1(1) = elements1(1) + 3*elements1(i + 1);
elements1(2) = elements1(i + 2);
end
if app == 1
mapa = repmat(0,s(1,:));
a = map(1:elements(1));
mapa(:) = map(1:elements(1));
mapa = impad(double(mapa),1);
mapa = round(conv2(mapa,mask,'valid'));
mapa = ~mapa;
mapa = impad(double(mapa),1);
mapa = round(conv2(mapa,mask,'valid'));
mapa = ~mapa;
map(1:elements(1)) = mapa(:);
end
decision2 = map;
decision1 = 1 - map;
end
if app == 0
decision1(1:elements1(1)) = 0.5;
decision2(1:elements2(1)) = 0.5;
end
c = c1.*decision1 + c2.*decision2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -