利用MATLAB实现不同曝光程度图像融合

一、多曝光图像融合原理

多曝光图像融合旨在将同一场景下不同曝光参数 (欠曝、正常曝、过曝)拍摄的图像结合,保留各图像的细节(如欠曝图的亮部、过曝图的暗部),生成动态范围更广、视觉效果更优的融合图像。核心思想是提取各图像的互补信息(亮部/暗部细节、边缘纹理),通过融合规则(如加权平均、多尺度分解)合成新图像。

二、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法(边缘纹理最优,需工具包支持)。

实际应用中,建议结合图像配准 (确保对齐)和彩色空间转换(避免颜色失真),以获得更优结果。代码可直接复现,替换图像路径即可适配不同场景。

相关推荐
buttonupAI6 小时前
今日Reddit各AI板块高价值讨论精选(2025-12-20)
人工智能
2501_904876487 小时前
2003-2021年上市公司人工智能的采纳程度测算数据(含原始数据+计算结果)
人工智能
竣雄7 小时前
计算机视觉:原理、技术与未来展望
人工智能·计算机视觉
救救孩子把7 小时前
44-机器学习与大模型开发数学教程-4-6 大数定律与中心极限定理
人工智能·机器学习
Rabbit_QL8 小时前
【LLM评价指标】从概率到直觉:理解语言模型的困惑度
人工智能·语言模型·自然语言处理
呆萌很8 小时前
HSV颜色空间过滤
人工智能
roman_日积跬步-终至千里8 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
FL16238631298 小时前
[C#][winform]基于yolov11的淡水鱼种类检测识别系统C#源码+onnx模型+评估指标曲线+精美GUI界面
人工智能·yolo·目标跟踪
爱笑的眼睛119 小时前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
小润nature9 小时前
AI时代对编程技能学习方式的根本变化(1)
人工智能