⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maxchosenimf.m

📁 PCA算法matlab程序源码,这个是我和同学一起做的,大家可以参考看看怎么样的,谢谢大家,可以提议供大家学!
💻 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 + -