matlab中18张彩色图片基于范数的全变分图像融合代码
时间: 2023-10-10 19:11:37 浏览: 63
基于matlab的图像融合源码
4星 · 用户满意度95%
以下是基于范数的全变分图像融合的 MATLAB 代码:
```matlab
clear all;
close all;
clc;
% 读取18张彩色图片
for i=1:18
img = imread(['img',num2str(i),'.jpg']);
RGB(:,:,:,i) = img;
end
% 定义超参数
lamda1 = 0.02; % 范数惩罚项的权重
lamda2 = 0.03; % 总变分惩罚项的权重
lamda3 = 0.5; % 纹理保护项的权重
maxiter = 100; % 最大迭代次数
tol = 1e-4; % 允许的误差值
% 初始化参数
alpha = 0.1*ones(18,1);
beta = 0.1*ones(18,1);
u = ones(size(RGB(:,:,:,1)));
v = zeros(size(RGB(:,:,:,1)));
p = zeros(size(RGB(:,:,:,1)));
q = zeros(size(RGB(:,:,:,1)));
% 定义辅助函数和算子
f1 = @(x) cat(4,x(:,:,:,1)-x(:,:,:,2),x(:,:,:,2)-x(:,:,:,3),x(:,:,:,3)-x(:,:,:,4),...
x(:,:,:,4)-x(:,:,:,5),x(:,:,:,5)-x(:,:,:,6),x(:,:,:,6)-x(:,:,:,7),...
x(:,:,:,7)-x(:,:,:,8),x(:,:,:,8)-x(:,:,:,9),x(:,:,:,9)-x(:,:,:,10),...
x(:,:,:,10)-x(:,:,:,11),x(:,:,:,11)-x(:,:,:,12),x(:,:,:,12)-x(:,:,:,13),...
x(:,:,:,13)-x(:,:,:,14),x(:,:,:,14)-x(:,:,:,15),x(:,:,:,15)-x(:,:,:,16),...
x(:,:,:,16)-x(:,:,:,17),x(:,:,:,17)-x(:,:,:,18));
f2 = @(x) cat(4,x(:,:,:,1)-x(:,:,:,2),x(:,:,:,2)-x(:,:,:,3),x(:,:,:,3)-x(:,:,:,4),...
x(:,:,:,4)-x(:,:,:,5),x(:,:,:,5)-x(:,:,:,6),x(:,:,:,6)-x(:,:,:,7),...
x(:,:,:,7)-x(:,:,:,8),x(:,:,:,8)-x(:,:,:,9),x(:,:,:,9)-x(:,:,:,10),...
x(:,:,:,10)-x(:,:,:,11),x(:,:,:,11)-x(:,:,:,12),x(:,:,:,12)-x(:,:,:,13),...
x(:,:,:,13)-x(:,:,:,14),x(:,:,:,14)-x(:,:,:,15),x(:,:,:,15)-x(:,:,:,16),...
x(:,:,:,16)-x(:,:,:,17),x(:,:,:,17)-x(:,:,:,18),zeros(size(x(:,:,:,1))));
Dx = @(x) [diff(x,1,2),zeros(size(x,1),1,size(x,3),size(x,4))];
Dy = @(x) [diff(x,1,1);zeros(1,size(x,2),size(x,3),size(x,4))];
DxT = @(x) [-x(:,1,:,1),-diff(x,1,2),x(:,end-1,:,end)];
DyT = @(x) [-x(1,:,:,1);-diff(x,1,1);x(end-1,:,:,end)];
% 迭代求解
for iter=1:maxiter
% 更新 alpha 和 beta
alpha_old = alpha;
beta_old = beta;
alpha = max(0,alpha - lamda1*(u-p));
beta = max(0,beta - lamda1*(v-q));
% 更新 u 和 v
u_old = u;
v_old = v;
tmp1 = Dx(p) + f1(RGB - cat(4,alpha,beta,zeros(size(RGB(:,:,:,1)))));
tmp2 = Dy(q) + f2(RGB - cat(4,alpha,beta,zeros(size(RGB(:,:,:,1)))));
normtmp = sqrt(sum(tmp1.^2 + tmp2.^2,4));
tmp1 = tmp1./max(1,normtmp);
tmp2 = tmp2./max(1,normtmp);
u = max(0,1-lamda2./abs(cat(4,tmp1(:,2:end,:,:)-tmp1(:,1:end-1,:,:),zeros(size(tmp1(:,:,:,1))))));
v = max(0,1-lamda2./abs(cat(4,tmp2(2:end,:,:,:)-tmp2(1:end-1,:,:,:),zeros(size(tmp2(:,:,:,1))))));
u(isnan(u)) = 0;
v(isnan(v)) = 0;
% 更新 p 和 q
p_old = p;
q_old = q;
tmp = DxT(u.*tmp1);
p = tmp./(lamda3 + abs(tmp));
tmp = DyT(v.*tmp2);
q = tmp./(lamda3 + abs(tmp));
% 判断是否收敛
if norm(alpha-alpha_old,'fro')/norm(alpha_old,'fro') < tol && ...
norm(beta-beta_old,'fro')/norm(beta_old,'fro') < tol && ...
norm(u-u_old,'fro')/norm(u_old,'fro') < tol && ...
norm(v-v_old,'fro')/norm(v_old,'fro') < tol && ...
norm(p-p_old,'fro')/norm(p_old,'fro') < tol && ...
norm(q-q_old,'fro')/norm(q_old,'fro') < tol
break;
end
end
% 显示结果
figure;
subplot(221);imshow(RGB(:,:,:,1));title('原图1');
subplot(222);imshow(RGB(:,:,:,9));title('原图9');
subplot(223);imshow(RGB(:,:,:,18));title('原图18');
subplot(224);imshow(cat(3,u(:,:,1),v(:,:,1),zeros(size(u(:,:,1))))/max(u(:)));title('融合结果');
```
这里使用了基于范数的全变分图像融合方法,该方法可以将多幅图像融合成一幅图像,保留了每幅图像的信息,同时又能够消除噪声和保持细节。
阅读全文