matlab加图,小波图像融合的Matlab实现示例(添加图片演示080428) | 学步园

(1)高频带的融合

首先,高频系数融合均采用基于像素点绝对值取大的规则,这里要注意的是,比较的对象是两幅原始图像的像素点的绝对值,而融合后图像的像素点的取值是两幅原始图像像素点绝对值大的那一点的值,也就是说,要取绝对值大的那个点的实际值。故相应的Matlab程序为:

% I1,I2 为两幅原始图像

y1=mywavedec2(I1,dim);

y2=mywavedec2(I2,dim);

[r,c]=size(y1);            % 根据低频融合算法进行图像融合

for i=1:r            % 首先取两幅源图像相应的小波分解系数绝对值最大者的值作为融合图像的分解系数

for j=1:c

if ( abs(y1(i,j)) >= abs(y2(i,j)) )

y3(i,j)=y1(i,j);

elseif ( abs(y1(i,j)) < abs(y2(i,j)) )

y3(i,j)=y2(i,j);

end

%    y3(i,j)=max( abs(y1(i,j)) , abs(y2(i,j)) );  % 这行代码是错误的,取了绝对值而非实际值

end

end

(2)低频融合的对象

低频融合的对象是N级分解后图像的LL-N子图像,相应的程序代码为:

LLa=y1(1:r/(2^dim),1:c/(2^dim));    % 调用lowfrefus函数对低频部分的小波分解系数进行融合LLb=y2(1:r/(2^dim),1:c/(2^dim));y3(1:r/(2^dim),1:c/(2^dim))=lowfrefus(LLa,LLb);

(3)低频融合策略的程序代码

这一部分程序代码的实现难度不大,根据算法原理中列出的公式可以很快写出相应的代码。不过有些细节问题还是要花心思处理,比如区域大小的确定、区域边界与图像边界的关系、区域中心与区域中各点的权值确定、区域中心在原始图像中的具体位置等等。

function y = lowfrefus(A,B);% 函数 Y=LOWFREFUS(A,B) 对输入的两个小波分解系数矩阵,根据低频融合算法,得出融合图像的低频小波分解系数[row,col]=size(A);    % 求出分解系数矩阵的行列数alpha=0.5;        % alpha是方差匹配度比较的阈值for i=1:row        % 根据低频融合算法,先求出矩阵A,B中以点P为中心的区域方差和方差匹配度for j=1:col        % 再根据方差匹配度与阈值的比较确定融合图像的小波分解系数[m2p(i,j),Ga(i,j),Gb(i,j)] = area_var_match(A,B,[i,j]);Wmin=0.5-0.5*((1-m2p(i,j))/(1-alpha));Wmax=1-Wmin;if m2p(i,j)=Gb(i,j)        % 若匹配度小于阈值,则取区域方差大的相应点的分解系数作为融合图像的分解系数y(i,j)=A(i,j);elsey(i,j)=B(i,j);endelse                % 若匹配度大于阈值,则采取加权平均方法得出相应的分解系数if Ga(i,j)>=Gb(i,j)y(i,j)=Wmax*A(i,j)+Wmin*B(i,j);elsey(i,j)=Wmin*A(i,j)+Wmax*B(i,j);endendendendfunction w = weivec(x,p);% 函数 W=WEIVEC(X,P) 对输入的r*c矩阵,计算出以点p为中心时矩阵各点的对应权值% 距离点p越近,权值就越大。权值是通过行和列的高斯分布加权相加得到的。[r,c]=size(x);p1=p(1);    p2=p(2);sig=1;for i=1:rfor j=1:cw(i,j)=0.5*(gaussmf(i,[sig p1])+gaussmf(j,[sig p2]));endendfunction [m2p,Ga,Gb] = area_var_match(A,B,p);% 函数 area_var_match 计算两个输入矩阵以点p为中心的区域方差以及区域方差匹配度level=1;    % 设置区域的大小[subA,mpa,npa]=submat(A,p,level);    % submat 函数取输入矩阵中以点P为中心、阶数为(2*level+1)的方阵作为子矩阵[subB,mpb,npb]=submat(B,p,level);[r,c]=size(subA);w=weivec(subA,[mpa npa]);    % 获取子矩阵的权值分布averA=sum(sum(subA))/(r*c); % 计算子矩阵的平均值averB=sum(sum(subB))/(r*c);Ga=sum(sum(w.*(subA-averA).^2));    % 计算子矩阵的区域方差Gb=sum(sum(w.*(subB-averB).^2));if (Ga==0)&(Gb==0)      % 计算两个子矩阵的区域方差匹配度m2p=0;elsem2p=2*sum(sum(w.*abs(subA-averA).*abs(subB-averB)))/(Ga+Gb);endfunction [smat,mp,np] = submat(x,p,level);% 函数 submat 取输入矩阵中以点P为中心、阶数为(2*level+1)的方阵作为输出的子矩阵[row,col]=size(x);m=p(1); n=p(2);if (m>row)||(n>col)error('Point p is out of matrix X !');return;endif ((2*level+1)>row)||((2*level+1)>col)error('Too large sample area level !');return;end% 设置子矩阵的边界值up=m-level;     down=m+level;left=n-level;   right=n+level;% 若子矩阵的某一边界值超出输入矩阵的相应边界,就进行边界处理,% 即超出边界后往相反方向平移,使其恰好与边界重合if left<1right=right+1-left;left=1;endif right>colleft=left+col-right;right=col;endif up<1down=down+1-up;up=1;endif down>rowup=up+row-down;down=row;end% 获取作为输出的子矩阵,并计算点p在输出的子矩阵中的位置smat = x(up:down,left:right);mp=m-up+1;np=n-left+1;

下面我们给出相应的图片示例,图1 是一幅远景清晰近景模糊的图片,图2 是一幅远景模糊近景清晰的图片,图3是融合效果图。

o_Fus01.jpg

o_Fus02.jpg

o_Fus03.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值