ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

卷积神经网络实现红外与可见光图像融合:MATLAB与金字塔详解

卷积神经网络实现红外与可见光图像融合:MATLAB与金字塔详解 简介面向红外与可见光图像融合的CNN实现资源包结合卷积神经网络与经典多尺度融合算法为图像处理、深度学习方向的研究者和开发者提供一套可直接运行的Matlab实验代码适用于低光照、恶劣环境下的目标识别与图像增强场景。压缩包共22个文件以m脚本为主17个涵盖金字塔分解与重构、上/下采样、融合规则选择等核心函数另含2幅示例图像、2个说明文档及1个预训练CNN模型mat格式整体仅1.7MB便于快速下载与复现。已有541人学习下载。其中不仅提供了CNN特征提取与融合策略的实现流程还集成了引导滤波、曝光融合等经典方法读者可通过示例脚本对照预训练模型和测试图像梳理从预处理、特征提取到融合后处理的全链路理解不同融合策略的优劣并可直接基于代码扩展自身实验。1. 红外与可见光融合为什么选择 CNN 而不是简单加权夜间安防或辅助驾驶场景里红外传感器给出稳定的热辐射轮廓可见光传感器给出高分辨率的颜色与纹理但两者的空间分辨率和亮度分布完全不一致。直接对像素做加权平均暗部纹理会被热辐射信号冲掉强边缘处还会出现明显的灰白光晕。这个压缩包里给出一套不同的思路用卷积神经网络同时提取两幅图像的特征生成逐像素的融合权重再借助拉普拉斯金字塔完成多尺度合并。包内包含 cnnmodel.mat 预训练模型、example.m 与 Script.m 两套入口脚本以及金字塔分解、引导滤波等完整 MATLAB 实现。它适合想复现深度学习图像融合算法的研究者也适合需要把红外与可见光融合模块嵌入现有视觉系统的工程师。下面从金字塔部分开始拆解。2. 先拆尺度高斯金字塔与拉普拉斯金字塔的 MATLAB 实现2.1 金字塔在这个融合流程里的位置CNN 负责给出权重但真正决定融合结果细节的是多尺度分解。红外与可见光图像的差异在高频区域最明显红外图高频较弱但轮廓完整可见光图有丰富边缘但也包含大量噪声。把图像分解到不同尺度后低频层可以放心地加权合并高频层则按 CNN 活动图选择信息量更大的一方。高斯金字塔通过重复的低通滤波和下采样把图像拆成逐层减半的分辨率拉普拉斯金字塔则记录每一层与上一层上采样结果的差等价于带通滤波。包内 gaussian_pyramid.m、laplacian_pyramid.m、downsample.m、upsample.m 正是这一部分的实现。2.2 四个核心文件的作用与参数先看包内最基础的 pyramid_filter.m它返回一个五点对称二项式滤波器默认系数为 [1/16, 1/4, 3/8, 1/4, 1/16]标准差大约在 0.8 到 1.0 之间。这个滤波器先应用到行方向再列方向等效于把高频部分剥离给拉普拉斯层。表 1 列出了 gaussian_pyramid 相关函数的使用方式函数作用关键参数gaussian_pyramid.m生成高斯金字塔img 输入图像levels 分解层数laplacian_pyramid.m由高斯金字塔生成拉普拉斯金字塔输入为高斯金字塔元胞数组downsample.m先滤波再隔行隔列采样img、filter、采样步长upsample.m先插值再滤波恢复尺寸img、filter、放大倍数示例代码% 读取源图像并转成 double避免 uint8 运算截断 ir im2double(imread(sourceimages/s01_ir.bmp)); vis im2double(imread(sourceimages/s01_vis.bmp)); % 层数取 4输入 256x256 时最低层只有 16x16 G_ir gaussian_pyramid(ir, 4); G_vis gaussian_pyramid(vis, 4); % 由高斯金字塔逐层做差分得到拉普拉斯金字塔 L_ir laplacian_pyramid(G_ir); L_vis laplacian_pyramid(G_vis);代码里 im2double 是关键一步很多新手直接用 imread 的 uint8 数据参与滤波卷积输出会溢出融合结果出现横条纹。gaussian_pyramid 的 levels 参数决定了金字塔层数图像尺寸为 2^levels 的倍数时最省事256x256 配 levels4 或 5 都合适。2.3 下采样与上采样的边界处理downsample.m 的常见实现是先与 pyramid_filter 做卷积再取间隔为 2 的像素。边界处直接补零会在金字塔重建时产生边缘暗线所以我一般建议使用 MATLAB 的 padarray 进行镜像扩展% downsample.m 内部核心操作示意 f pyramid_filter(); img_padded padarray(img, [2 2], replicate); img_f filter2(f, filter2(f, img_padded, valid), valid); out img_f(1:2:end, 1:2:end);这里 filter2 的 valid 去掉边界补零的影响padarray 的 replicate 让边缘像素向外复制比默认补零更稳。upsample.m 则相反先隔行插零再做相同的滤波最后乘以 4 保持能量一致。这两个函数直接决定重建图像有没有棋盘格效应值得单独测一下。3. CNN 活动图生成与 band_fuse 权重融合策略3.1 预训练模型 cnnmodel.mat 的结构推断cnnmodel.mat 是包内已经训练好的模型文件。虽然资源里没有提供训练脚本但从 maxpooling_s2.m 可以推断模型不是类似 VGG 或 ResNet 这种很深的结构而是一个三层左右的浅层卷积网络输出是一组特征图而不是分类得分。表 2 给出了一个常见的参考结构推断该模型与之类似层类型输出尺寸说明conv13x3 卷积ReLU64x64x16输入灰度图 64x64pool1maxpooling_s232x32x16步长为 2降低分辨率conv23x3 卷积ReLU32x32x32增加通道数pool2maxpooling_s216x16x32第二层池化conv33x3 卷积ReLU16x16x1输出活动图maxpooling_s2.m 的作用是从输入特征图中取每个 2x2 窗口的最大值等效于把特征图缩小一半。图像融合中可以用它来扩大感受野但最后融合权重必须恢复到原图分辨率所以后边还需要 upsample.m。实际调用时不需要手动解卷积网络直接加载 mat 文件后按字段取出权重即可。3.2 band_fuse.m 的核心处理流程band_fuse.m 是本包中把 CNN 与金字塔结合的主要函数。它的流程大致是先对红外和可见光分别构建拉普拉斯金字塔再把两幅原图送入 CNN 得到两个活动图最后对金字塔的每一层用活动图归一化结果作为权重合并。示意代码如下% 加载预训练 CNN 权重 S load(model/cnnmodel.mat); net S.net; % 前向计算得到活动特征图act_ir 与 act_vis 尺寸与原图一致 % 这里 cnn_feature_map 是示意函数实际需按模型字段逐层卷积 act_ir cnn_feature_map(net, ir); act_vis cnn_feature_map(net, vis); % 用相对强度作为融合权重eps 防止除零 w act_ir ./ (act_ir act_vis eps); % 对每一层金字塔加权合并 fused_pyr cell(numel(L_ir), 1); for k 1:numel(L_ir) fused_pyr{k} w .* L_ir{k} (1 - w) .* L_vis{k}; endcnn_feature_map 示意的是用加载的模型权重手动实现前向传播也可以用 MATLAB 2019 之后的 dlnetwork 加载模型并调用 predict。注意 w 是原分辨率上的权重图而 L_ir{k} 是逐层减半的尺寸所以实际 band_fuse.m 中会把权重图下采样到与当前层一致或者直接把活动图也放进金字塔体系里逐层生成。这个细节决定了融合边缘是否对齐。3.3 加权平均、取大与 selc.m 的对比仅用 w 做软加权是通用做法但 es2.m 与 selc.m 提供了另外两种选择。selc.m 通常实现“选择式”融合比较两幅源图在当前位置的活动度谁大就完全取谁。这种硬选择在高频层可以保留最锐利的边缘但容易在相邻区域产生不连续。比较代码是% selc.m 的硬选择策略示意 choice act_ir act_vis; fused_pyr{k} choice .* L_ir{k} ~choice .* L_vis{k};而 es2.m 更接近边缘保持的软切换可以看作是带边缘增强的加权版本。实际使用中低频层推荐用加权平均避免块状伪影高频层可以用 selc 硬选择来提升边缘强度。这个参数配置在 example.m 里通常通过 switch 变量控制修改后重新运行即可对比。4. 引导滤波去伪影与金字塔重构细节4.1 为什么需要 guidedfilter.m 介入直接由 CNN 活动图归一化得到的权重图不一定是平滑的。因为卷积层的特征图保留了较多具象信息某些纹理区域会突然切换来源融合结果里就会出现局部灰斑。guidedfilter.m 用一张参考图对权重图做边缘保持滤波参考图通常选可见光图像因为它含有的边缘信息与人眼感知一致。引导滤波的输出在平坦区域上被平均在强边缘上跟随参考图所以权重图的轮廓不会糊掉。表 3 给出了这个滤波器的参数调整范围参数推荐范围影响r2~8滤波窗口半径越大越平滑eps_reg0.001~0.1边缘保持阈值越小细节越多% 引导滤波调用r 为滤波半径eps_reg 为正则化系数 r 4; eps_reg 0.01; w_smooth guidedfilter(vis, w, r, eps_reg);参数里r 控制局部窗口大小r 过大时权重图过于平滑红外与可见光的切换带会变宽eps_reg 控制“多大梯度算边缘”太小会让滤波退化为普通均值滤波。包内 boxfilter.m 是引导滤波的积分图实现它的作用是用 O(1) 复杂度计算出窗口内均值避免嵌套循环这是 guidedfilter.m 能处理大尺寸图像的关键。4.2 reconstruct_laplacian_pyramid 的重建细节融合后的拉普拉斯金字塔 fused_pyr 要还原回原尺寸需要 reconstruct_laplacian_pyramid.m。重建过程是从金字塔最顶层开始反复上采样并与下一层相加% 金字塔重建核心循环 res fused_pyr{end}; for k numel(fused_pyr)-1 : -1 : 1 res upsample(res) fused_pyr{k}; end如果 upsample.m 中的滤波器系数不是按能量归一化重建结果整体会偏亮或偏暗。另一个容易忽略的问题是各层尺寸奇偶性如果原图不是 2 的整数次幂下采样后尺寸向下取整重建时 upsample 后的尺寸会和上一层对不上。所以在构造输入前最好先做 imresize 把图像调整为 2 的幂次比如 512x512。4.3 融合效果验证边缘响应与伪影完成重建后可以把融合结果与红外、可见光原图做逐像素差edge_ir imfilter(ir, fspecial(sobel)); edge_vis imfilter(vis, fspecial(sobel)); edge_fused imfilter(fused, fspecial(sobel));比较边缘响应的位置可以看到引导滤波是否保住了可见光中的毛刺细节同时避免把红外图的热辐射边界复制成双层轮廓。这是一个快速非参数验证手段比看整体亮度更直观。5. 跑通 example.m 后如何评估 PSNR/SSIM 并调整融合参数5.1 快速运行入口包内 example.m 是串起全流程的入口。运行时会把 sourceimages 目录下的 s01_ir.bmp 和 s01_vis.bmp 读入加载 model/cnnmodel.mat调用 band_fuse.m最后保存融合结果到 results 目录。在 MATLAB 命令行输入以下代码即可cd(CNN_infrared_visible_image_fusion); example;如果只想看某个环节的输出可以打开 Script.m它会把金字塔各层、活动图和最终权重逐级展示适合调参时定位问题。5.2 评估指标的计算融合图像没有标准答案但可以用融合结果与各源图之间的相似度做参考。常见指标有 PSNR、SSIM 和 UIQI示意计算如下psnr_ir psnr(fused, ir); psnr_vis psnr(fused, vis); ssim_ir ssim(fused, ir); ssim_vis ssim(fused, vis); % UIQI 需要第三方 qim 函数实现这里假设已放入路径 uiqi_ir qim(fused, ir); uiqi_vis qim(fused, vis);需要注意的是psnr 函数要求两个输入值域一致fused 是 double 0~1ir 也必须保持同样格式否则指标会失真。5.3 最值得先动的两个参数如果融合结果出现块状不连续优先调低 r 到 2如果亮度偏暗检查 upsample.m 末尾是否做了 4 倍因子修正。在这套代码里金字塔层数不是越多越好256x256 的图用 5 层时最顶层只有 8x8拉普拉斯差分几乎没有有意义信息还会增加计算负担。先固定 levels4把引导滤波的 eps_reg 调到 0.05再观察边缘变化比一次性调整所有参数更容易定位问题。本文还有配套的精品资源点击获取
返回列表