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

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

相关推荐
benna1 小时前
多模态知识图谱的构建及在热点新闻事件中的应用
人工智能·知识图谱
AI弟1 小时前
第13章 迁移学习:让AI学会“举一反三“的艺术
人工智能·机器学习·迁移学习
ccLianLian1 小时前
MaskCLIP+
人工智能·计算机视觉
艾莉丝努力练剑1 小时前
【C++:C++11收尾】解构C++可调用对象:从入门到精通,掌握function包装器与bind适配器包装器详解
java·开发语言·c++·人工智能·c++11·右值引用
Allen_LVyingbo1 小时前
解锁医疗AI新引擎:从数据库与编程语言透视合成数据生成(代码部分)
数据库·人工智能·深度学习·健康医疗
李景琰1 小时前
Java 25+AI+物联网+区块链融合平台:架构设计与企业级实现
java·人工智能·物联网·区块链
倔强的石头1061 小时前
循环神经网络(RNN):从序列数据难题到实战落地的完整指南
人工智能·rnn·深度学习
Leinwin1 小时前
Ignite 2025:Microsoft 365 Copilot 全面升级,引领企业进入自主智能(Agentic AI)新时代
人工智能·microsoft·copilot