一、多曝光图像融合原理
多曝光图像融合旨在将同一场景下不同曝光参数 (欠曝、正常曝、过曝)拍摄的图像结合,保留各图像的细节(如欠曝图的亮部、过曝图的暗部),生成动态范围更广、视觉效果更优的融合图像。核心思想是提取各图像的互补信息(亮部/暗部细节、边缘纹理),通过融合规则(如加权平均、多尺度分解)合成新图像。
二、MATLAB实现步骤
1. 图像准备与预处理
(1)图像读取与模拟
若没有实际多曝光图像,可通过gamma变换模拟不同曝光效果(以正常图像为基准):
- 欠曝图像 :降低亮度(gamma>1),如
img_low = img.^2; - 过曝图像 :提高亮度(gamma<1),如
img_high = sqrt(img)。
matlab
clear; clc; close all;
% 读取正常曝光图像(或生成测试图像)
img_normal = im2double(imread('scene.jpg')); % 替换为实际图像路径
if size(img_normal, 3) == 3
img_normal_gray = rgb2gray(img_normal); % 转为灰度图(简化演示)
else
img_normal_gray = img_normal;
end
% 模拟不同曝光图像(gamma变换)
gamma_low = 2.0; % 欠曝(gamma>1,变暗)
gamma_high = 0.5; % 过曝(gamma<1,变亮)
img_low = imadjust(img_normal_gray, [], [], gamma_low); % 欠曝图
img_high = imadjust(img_normal_gray, [], [], gamma_high); % 过曝图
img_normal_disp = img_normal_gray; % 正常图
% 显示原图
figure;
subplot(131); imshow(img_low); title('欠曝图像(低曝光)');
subplot(132); imshow(img_normal_disp); title('正常曝光图像');
subplot(133); imshow(img_high); title('过曝图像(高曝光)');
(2)图像配准(可选)
若多曝光图像存在位移,需用imregister函数配准(假设已对齐,此处跳过)。
2. 融合算法实现
方法1:加权平均融合法(简单高效)
根据像素亮度动态调整权重:暗区赋予过曝图高权重,亮区赋予欠曝图高权重,保留细节。
matlab
% 权重函数:基于像素亮度(0-1范围)
function w = weight_map(img, type)
img = mat2gray(img); % 归一化到[0,1]
if strcmp(type, 'low') % 欠曝图权重(亮区权重低)
w = 1 - img; % 亮区(img大)→权重小
elseif strcmp(type, 'high') % 过曝图权重(暗区权重低)
w = img; % 暗区(img小)→权重小
else % 正常图权重(中等亮度)
w = 0.5 * ones(size(img));
end
end
% 加权平均融合
w_low = weight_map(img_low, 'high'); % 欠曝图权重(过曝图在暗区权重高)
w_high = weight_map(img_high, 'low'); % 过曝图权重(欠曝图在亮区权重高)
w_normal = weight_map(img_normal_disp, 'normal'); % 正常图权重
% 归一化权重(确保和为1)
total_w = w_low + w_high + w_normal;
w_low = w_low ./ total_w;
w_high = w_high ./ total_w;
w_normal = w_normal ./ total_w;
% 融合图像(加权平均)
img_fused_weighted = w_low.*img_low + w_high.*img_high + w_normal.*img_normal_disp;
方法2:拉普拉斯金字塔融合法(多尺度细节保留)
通过高斯金字塔 分解图像为不同尺度,提取拉普拉斯金字塔(高频细节),对各尺度高频层取绝对值最大的系数,低频层加权平均,最后重建图像。
matlab
% 构建高斯金字塔
function pyr = gaussian_pyramid(img, levels)
pyr{1} = img;
for i = 2:levels
pyr{i} = impyramid(pyr{i-1}, 'reduce'); % 降采样
end
end
% 构建拉普拉斯金字塔
function pyr = laplacian_pyramid(gauss_pyr)
levels = length(gauss_pyr);
pyr = cell(1, levels);
for i = 1:levels-1
expanded = impyramid(gauss_pyr{i+1}, 'expand'); % 升采样
expanded = imresize(expanded, size(gauss_pyr{i}), 'bilinear'); % 调整尺寸
pyr{i} = gauss_pyr{i} - expanded; % 高频细节
end
pyr{levels} = gauss_pyr{levels}; % 最顶层为低频
end
% 拉普拉斯金字塔融合
levels = 4; % 金字塔层数
% 对三幅图像分别构建拉普拉斯金字塔
pyr_low = laplacian_pyramid(gaussian_pyramid(img_low, levels));
pyr_high = laplacian_pyramid(gaussian_pyramid(img_high, levels));
pyr_normal = laplacian_pyramid(gaussian_pyramid(img_normal_disp, levels));
% 融合各层:高频取绝对值最大,低频加权平均
pyr_fused = cell(1, levels);
for i = 1:levels-1 % 高频层(细节)
pyr_fused{i} = (abs(pyr_low{i}) > abs(pyr_high{i})) & (abs(pyr_low{i}) > abs(pyr_normal{i})) ? pyr_low{i} : ...
(abs(pyr_high{i}) > abs(pyr_normal{i}) ? pyr_high{i} : pyr_normal{i});
end
pyr_fused{levels} = (pyr_low{levels} + pyr_high{levels} + pyr_normal{levels})/3; % 低频层(背景)
% 从融合金字塔重建图像
img_fused_laplacian = pyr_fused{levels};
for i = levels-1:-1:1
expanded = impyramid(img_fused_laplacian, 'expand');
expanded = imresize(expanded, size(pyr_fused{i}), 'bilinear');
img_fused_laplacian = expanded + pyr_fused{i};
end
方法3:NSST多尺度分解融合法(高级细节保留)
利用非下采样剪切波变换(NSST) 分解图像为多尺度方向子带,低频子带加权平均,高频子带取绝对值最大的系数,适合保留边缘纹理(需NSST工具包)。
matlab
% 需先下载NSST工具包(如CSDN文库的NSST_toolbox.zip),并添加路径
addpath('NSST_toolbox');
% NSST分解参数
shear_params.dcomp = [3,3,4,4]; % 尺度层数
shear_params.dsize = [8,8,16,16]; % 滤波器大小
% 对三幅图像进行NSST分解
[coeffs_low, ~] = nsst_dec2(img_low, shear_params, 'maxflat'); % 欠曝图分解
[coeffs_high, ~] = nsst_dec2(img_high, shear_params, 'maxflat'); % 过曝图分解
[coeffs_normal, ~] = nsst_dec2(img_normal_disp, shear_params, 'maxflat'); % 正常图分解
% 融合规则:低频子带加权平均,高频子带取绝对值最大
coeffs_fused = cell(size(coeffs_low));
coeffs_fused{1} = (coeffs_low{1} + coeffs_high{1} + coeffs_normal{1})/3; % 低频子带(背景)
for i = 2:length(coeffs_low) % 高频子带(细节)
coeffs_fused{i} = zeros(size(coeffs_low{i}));
for j = 1:size(coeffs_low{i}, 3) % 方向子带
mag_low = abs(coeffs_low{i}(:,:,j));
mag_high = abs(coeffs_high{i}(:,:,j));
mag_normal = abs(coeffs_normal{i}(:,:,j));
[~, idx] = max(cat(3, mag_low, mag_high, mag_normal), [], 3);
coeffs_fused{i}(:,:,j) = coeffs_low{i}(:,:,j).*(idx==1) + ...
coeffs_high{i}(:,:,j).*(idx==2) + ...
coeffs_normal{i}(:,:,j).*(idx==3);
end
end
% NSST重建融合图像
img_fused_nsst = nsst_rec2(coeffs_fused, shear_params, 'maxflat');
3. 融合结果展示与评估
(1)结果显示
matlab
figure;
subplot(221); imshow(img_low); title('欠曝图像');
subplot(222); imshow(img_high); title('过曝图像');
subplot(223); imshow(img_fused_weighted); title('加权平均融合');
subplot(224); imshow(img_fused_laplacian); title('拉普拉斯金字塔融合');
figure;
subplot(121); imshow(img_fused_nsst); title('NSST融合');
subplot(122); imshowpair(img_normal_disp, img_fused_nsst, 'montage');
title('正常图 vs NSST融合图');
(2)客观评估指标
计算信息熵(Entropy) 、结构相似性(SSIM) 、视觉信息保真度(VIF) 评估融合效果:
matlab
% 信息熵(越高表示信息越丰富)
entropy_weighted = entropy(img_fused_weighted);
entropy_laplacian = entropy(img_fused_laplacian);
entropy_nsst = entropy(img_fused_nsst);
% SSIM(越接近1表示结构越相似)
ssim_weighted = ssim(img_fused_weighted, img_normal_disp);
ssim_laplacian = ssim(img_fused_laplacian, img_normal_disp);
ssim_nsst = ssim(img_fused_nsst, img_normal_disp);
fprintf('加权平均融合:熵=%.2f, SSIM=%.4f\n', entropy_weighted, ssim_weighted);
fprintf('拉普拉斯融合:熵=%.2f, SSIM=%.4f\n', entropy_laplacian, ssim_laplacian);
fprintf('NSST融合:熵=%.2f, SSIM=%.4f\n', entropy_nsst, ssim_nsst);
三、关键技术与注意事项
1. 融合算法对比
| 算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 加权平均 | 简单高效,实时性好 | 细节保留能力弱 | 快速预览、低算力设备 |
| 拉普拉斯金字塔 | 多尺度细节保留,效果较好 | 计算复杂度中等 | 通用场景 |
| NSST | 边缘纹理保留最优 | 依赖工具包,计算量大 | 高质量图像融合 |
2. 彩色图像融合
若输入为彩色图像,建议转换到YCbCr空间,仅融合亮度通道(Y),Cb/Cr通道直接平均,避免颜色失真:
matlab
% 彩色图像融合示例
img_low_rgb = im2double(imread('low_exp.jpg'));
img_high_rgb = im2double(imread('high_exp.jpg'));
img_normal_rgb = im2double(imread('normal_exp.jpg'));
% 转换到YCbCr
ycbcr_low = rgb2ycbcr(img_low_rgb);
ycbcr_high = rgb2ycbcr(img_high_rgb);
ycbcr_normal = rgb2ycbcr(img_normal_rgb);
% 仅融合Y通道(亮度)
y_fused = laplacian_fusion(ycbcr_low(:,:,1), ycbcr_high(:,:,1), ycbcr_normal(:,:,1)); % 调用拉普拉斯融合函数
% 合并通道并转回RGB
ycbcr_fused = cat(3, y_fused, mean(cat(3, ycbcr_low(:,:,2), ycbcr_high(:,:,2), ycbcr_normal(:,:,2)), 3), ...
mean(cat(3, ycbcr_low(:,:,3), ycbcr_high(:,:,3), ycbcr_normal(:,:,3)), 3));
img_fused_rgb = ycbcr2rgb(ycbcr_fused);
参考代码 利用matlab实现不同曝光成度的图像融合 www.youwenfan.com/contentcsm/83045.html
四、总结
通过MATLAB实现不同曝光图像融合,核心是根据需求选择融合算法:
- 快速实现:加权平均法(代码简单,适合入门);
- 平衡效果与复杂度:拉普拉斯金字塔法(多尺度细节保留);
- 高质量融合:NSST法(边缘纹理最优,需工具包支持)。
实际应用中,建议结合图像配准 (确保对齐)和彩色空间转换(避免颜色失真),以获得更优结果。代码可直接复现,替换图像路径即可适配不同场景。