我将介绍七种不同的近红外(NIR)与可见光(RGB)图像融合方法 这些方法各具特点,适用于不同的场景。
核心融合方法 matlab
function fusedImage = fuseNIR_RGB(nirPath, rgbPath, method, varargin)
% 读取图像
nir = im2double(imread(nirPath));
rgb = im2double(imread(rgbPath));
% 确保图像尺寸一致
if ~isequal(size(nir), size(rgb(:,:,1)))
nir = imresize(nir, [size(rgb,1), size(rgb,2)]);
end
% 选择融合方法
switch lower(method)
case 'weighted_average'
% 加权平均法
alpha = 0.6; % NIR权重
if nargin > 3, alpha = varargin{
1}; end
fusedImage = alpha * nir + (1-alpha) * mean(rgb, 3);
case 'ihs'
% IHS变换融合
hsv = rgb2hsv(rgb);
fusedImage = hsv;
fusedImage(:,:,3) = nir; % 用NIR替换亮度分量
fusedImage = hsv2rgb(fusedImage);
case 'wavelet'
% 小波变换融合
level = 3; % 分解层数
if nargin > 3, level = varargin{
1}; end
% 对每个通道分别处理
fusedRGB = zeros(size(rgb));
for c = 1:3
[C_rgb, S] = wavedec2(rgb(:,:,c), level, 'db4');
[C_nir, ~] = wavedec2(nir, level, 'db4');
% 融合规则:低频取平均,高频取绝对值最大
fusedCoeffs = zeros(size(C_rgb));
for k = 1:level
% 低频系数
len = S(1,1)*S(1,2);
idx = 1:len;
fusedCoeffs(idx) = (C_rgb(idx) + C_nir(idx)) / 2;
% 高频系数
for d = 1:3 % 水平、垂直、对角
startIdx = len + 1;
len = S(k+1,1)*S(k+1,2);
endIdx = startIdx + len - 1;
% 取绝对值大的系数
abs_rgb = abs(C_rgb(startIdx:endIdx));
abs_nir = abs(C_nir(startIdx:endIdx));
mask = abs_rgb > abs_nir;
fusedCoeffs(startIdx:endIdx) = ...
mask.*C_rgb(startIdx:endIdx) + ...
~mask.*C_nir(startIdx:endIdx);
end
end
fusedRGB(

最低0.47元/天 解锁文章
4703

被折叠的 条评论
为什么被折叠?



