能不能将高频子带修改为基于平均梯度取大的融合规则,哪个高频子带的平均梯度大就取哪个
时间: 2024-03-22 16:38:45 浏览: 50
可以将高频子带修改为基于平均梯度取大的融合规则。具体来说,对于每个高频子带,可以计算红外灰度图像和可见光灰度图像的梯度,然后将两幅图像的梯度加权平均,得到一个加权平均梯度,对于每个像素,选择梯度更大的那个图像的系数作为融合后的系数。
以下是修改后的代码:
```
% 读入红外灰度图像和可见光灰度图像
infrared = imread('infrared.jpg');
visible = imread('visible.jpg');
% 将图像转为双精度浮点型
infrared = im2double(infrared);
visible = im2double(visible);
% 将红外灰度图像和可见光灰度图像进行NSCT分解
level = 3; % 分解级数
wname = 'antonini'; % 小波滤波器
infrared_nsct = nsctdec(infrared, level, wname);
visible_nsct = nsctdec(visible, level, wname);
% 对红外灰度图像和可见光灰度图像的NSCT系数进行融合
fusion_nsct = cell(level+1,1);
for i = 1:level
% 高频子带采用基于平均梯度取大的融合规则
infrared_coeff = infrared_nsct{i};
visible_coeff = visible_nsct{i};
% 计算红外灰度图像和可见光灰度图像的梯度
infrared_grad = imgradient(infrared_coeff);
visible_grad = imgradient(visible_coeff);
% 计算加权平均梯度
alpha = 0.5; % 系数,需要根据实际情况进行调整
beta = 0.5; % 系数,需要根据实际情况进行调整
weighted_grad = alpha * infrared_grad + beta * visible_grad;
% 对于每个像素,选择梯度更大的那个图像的系数作为融合后的系数
fusion_nsct{i} = zeros(size(infrared_coeff));
for j = 1:size(infrared_coeff,1)
for k = 1:size(infrared_coeff,2)
if weighted_grad(j,k) == 0
fusion_nsct{i}(j,k) = 0.5 * (infrared_coeff(j,k) + visible_coeff(j,k));
elseif infrared_grad(j,k) > visible_grad(j,k)
fusion_nsct{i}(j,k) = infrared_coeff(j,k);
else
fusion_nsct{i}(j,k) = visible_coeff(j,k);
end
end
end
end
for i = level+1
% 低频子带采用自适应加权融合规则
infrared_coeff = infrared_nsct{i};
visible_coeff = visible_nsct{i};
alpha = 1.5; % 系数,需要根据实际情况进行调整
beta = 0.5; % 系数,需要根据实际情况进行调整
fusion_nsct{i} = (alpha * infrared_coeff + beta * visible_coeff) ./ (infrared_coeff + visible_coeff);
end
% 将融合后的NSCT系数进行重构
fusion = nsctrec(fusion_nsct, wname);
% 将融合结果进行灰度拉伸
fusion = (fusion - min(fusion(:))) / (max(fusion(:)) - min(fusion(:)));
% 显示融合结果
imshow(fusion);
```
在修改后的代码中,对于每个高频子带,首先计算红外灰度图像和可见光灰度图像的梯度,然后将两幅图像的梯度加权平均,得到一个加权平均梯度。对于每个像素,选择梯度更大的那个图像的系数作为融合后的系数。如果加权平均梯度为0,则将两幅图像的系数进行加权平均,这样可以避免分母为0的情况。对于低频子带,仍然采用自适应加权融合规则。
阅读全文