尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

水下图像增强融合算法:Matlab源码与多尺度金字塔调参

发布时间:2026/9/11 23:10:29

资讯中心
01
ARTICLE

水下图像增强融合算法:Matlab源码与多尺度金字塔调参

水下图像增强融合算法:Matlab源码与多尺度金字塔调参
简介一份基于Matlab实现的水下图像增强融合算法完整源码包面向信号处理、图像处理方向的在校学生与开发者适用于毕业设计、课程设计及项目开发。算法覆盖色彩校正、对比度增强、多尺度金字塔融合、质量指标计算等关键环节能够有效提升水下图像清晰度与色彩真实性。压缩包共55个文件包括12个.m算法脚本、41张输入与融合结果对比图、1份原理说明PDF以及1份README引导文档整体大小仅7.02MB目录按算法模块和结果图分类便于快速定位与二次开发。源码经过严格测试内置拉普拉斯金字塔、引导滤波、双边滤波、简单色彩平衡、UCIQE评价等核心实现可辅助理解论文复现思路也适合在此基础上做参数调优或融合策略改进。目前已有145人学习浏览对于需要搭建水下图像处理实验环境、快速上手完整算法流程的读者来说是一份结构清晰、可直接运行的参考资料。1. 水下图像增强融合算法为什么单方法顶不住近岸浅水或浑浊水域拍到的水下图像问题远不止“暗”。水体对不同波长的吸收差异会让红色通道衰减最快整张图向蓝绿色坍缩悬浮颗粒的散射又让远景像隔了一层雾。这两个退化过程耦合在一起只做一次白平衡或一次对比度拉伸只能改善其中一个维度另一个维度仍然拖后腿。这也是水下图像增强融合算法这几年在论文和工程里都占主流的原因把颜色校正结果与对比度增强结果作为多路输入按像素级权重图做多尺度融合让“对症”的单方法各自发挥长处再在金字塔重构时互相补位。下面先讲退化模型与单方法的边界再给出可跑的 Matlab 源码最后聊指标验证与调参。2. 水下退化的物理模型与单方法增强的边界2.1 吸收与散射J(x)t(x)A(1-t(x)) 的由来水下成像可以近似写成I(x) J(x)·t(x) A·(1 - t(x))其中 J 是场景清晰辐射A 是背景光水体散射光t(x)exp(-βd(x)) 是透射率。关键在衰减系数 β 对波长敏感红光波长大、吸收系数大蓝绿光吸收弱。下表归纳了典型影响波长段典型深度影响视觉表现红光 R3~5 米内衰减显著暖色细节丢失肤色发青绿光 G5~15 米仍可传输中景对比度降低蓝光 B传输最远全图蓝青色主导背景光偏蓝路径散射则是 t(x) 中的 β 在高浑浊度下变大等效于在全图上叠加一层与距离相关的雾。因此水下图像增强要同时处理色偏吸收主导和去雾散射主导这是后续所有算法设计的出发点。2.2 直接套用陆地去雾与白平衡的翻车点暗通道先验去雾DCP在陆地上效果不错但水下场景的背景光常常是蓝绿色块算法按“最亮前 0.1% 像素”估计背景光时很容易把蓝色水体本身当成 A导致复原后偏色更重。灰度世界假设认为 RGB 三通道均值相等水下却天然不成立——红色通道均值远低于蓝色强行拉平会让整个画面偏品红。CLAHE 虽然能提升局部对比度但如果在 RGB 三通道上独立做各通道拉伸量不一致物体边缘会出现彩色镶边。可见单个方法只能覆盖退化的一部分且各自有副作用区域DCP 在背景光区域失准灰度世界在远景偏红CLAHE 在纹理丰富区放大噪声。融合算法的意义不是把多个结果平均而是用权重图在每个像素上决定“此刻该信任哪一路输出”再通过金字塔融合抑制接缝。2.3 多尺度融合框架的经验来源常见做法是采用 Ancuti 等人 2012 年提出的两输入、多权重融合框架先做一路颜色校正、一路对比度增强然后为每路输入构建对比度、饱和度、显著性三类权重图归一化后按拉普拉斯金字塔分层加权重建。这个框架后来被大量水下增强论文沿用变体基本集中在输入生成方式与权重组合上。思路不复杂难在 Matlab 实现里对权重归一化、金字塔层数、颜色空间转换的处理这也是后面三章要落地的内容。3. 融合算法的三模块设计输入、权重图与金字塔重建3.1 两路输入的选取颜色校正与 CLAHE 对比度增强第一路输入负责恢复色偏。我不会直接做硬性的灰度世界假设而是用“均值差部分补偿”的办法先算三个通道的全局均值取三者平均作为目标再把每个通道按自身均值与目标值的差值补回去。补偿强度用系数 alpha 控制水下 alpha 一般取 0.5 左右不会像灰度世界那样把远景推到偏红。mean_r mean(I(:,:,1), all); mean_g mean(I(:,:,2), all); mean_b mean(I(:,:,3), all); mid (mean_r mean_g mean_b) / 3; alpha 0.6; for c 1:3 m mean(I(:,:,c), all); I(:,:,c) I(:,:,c) alpha * (mid - m); end第二路输入负责提升对比度常见做法是在 Lab 颜色空间里只对亮度通道做 CLAHE。这样避免了 RGB 三通道独立均衡产生的色相漂移因为颜色信息留在 a、b 通道里不受影响。两路输入生成完后后续的权重和融合步骤对它们一视同仁这就是框架的“多路输入”部分。3.2 三类权重图对比度、饱和度与显著性权重图的作用是回答“这个像素位置哪路输入更可信”。第一类是拉普拉斯对比度权重取亮度图的拉普拉斯滤波结果绝对值数值大的地方纹理和边缘清晰自然更值得保留。第二类是饱和度权重取 R、G、B 三通道的标准差颜色越鲜明可信度越高这能压制颜色校正路径里可能出现的过饱和区域。第三类是显著性权重用大尺度高斯模糊后的亮度残差近似“中心-周边差”让主体区域比平缓背景获得更高权重。W_lap abs(imfilter(Ig, fspecial(laplacian, 0.2), replicate)); W_sat std(double(I), 0, 3); W_sig abs(Ig - imfilter(Ig, fspecial(gaussian, 31, 5), replicate)); W W_lap .* W_sat .* W_sig;三个权重相乘后还要做线性缩放我一般会压到 0.5~1 区间避免个别像素权重趋近零导致数值不稳定。归一化时两路权重单独算好再相除W1 W1/(W1W2)W2 1-W1这样每一层像素上两路权重之和恒为 1融合结果不会出现整体亮度偏移。3.3 为什么必须用金字塔融合而不是直接乘权重如果把归一化后的权重图直接和输入图像逐像素相乘再相加强边缘处会出现硬切换因为权重图空间变化太剧烈直接相乘会在物体边界留下光晕和接缝。多尺度金字塔融合把权重图下采样成高斯金字塔把输入图分解成拉普拉斯金字塔逐层加权后再自顶向下重构低频背景和高频边缘都能被平滑过渡。F_l(x,y) Σ_k G{W_k}_l(x,y) · L{I_k}_l(x,y)公式里 G 是权重的高斯金字塔L 是输入的拉普拉斯金字塔l 表示层号。层数通常取 4~6层数太少低频过渡不充分太多则最底层尺寸过小、权重意义下降。实际工程里 depth 默认 5并要按图像最短边做上限保护。4. Matlab 水下图像增强融合源码主流程与每个子函数4.1 完整源码入口、颜色校正、CLAHE、权重与金字塔把下面内容保存为uw_enhance.m和对应子函数文件或放在同一个脚本文件末尾。输入支持 uint8 和 double返回 double 0~1 的 RGB 结果。function out uw_enhance(I, depth) % 水下图像增强融合主入口 % I : RGB 图像支持 uint8 或 double(0~1) % depth : 金字塔层数默认 5图像太小时自动缩减 if nargin 2, depth 5; end if isa(I, uint8), I im2double(I); end % 生成两路输入 I1 color_restore(I); I2 clahe_enhance(I); % 为每路输入计算权重并归一化 W1 build_weight(I1); W2 build_weight(I2); W1 W1 ./ (W1 W2 eps); W2 1 - W1; % 金字塔融合 out pyramid_fuse({I1, I2}, {W1, W2}, depth); end function I_out color_restore(I) % 颜色校正均值差部分补偿 通道截断拉伸 mean_r mean(I(:,:,1), all); mean_g mean(I(:,:,2), all); mean_b mean(I(:,:,3), all); mid (mean_r mean_g mean_b) / 3; alpha 0.6; % 校正强度浑浊场景取 0.4~0.7 I_out I; for c 1:3 m mean(I(:,:,c), all); I_out(:,:,c) I(:,:,c) alpha * (mid - m); end for c 1:3 tmp I_out(:,:,c); lo prctile(tmp(:), 2); hi prctile(tmp(:), 98); if hi lo I_out(:,:,c) (tmp - lo) / (hi - lo); end end I_out min(max(I_out, 0), 1); end function I_out clahe_enhance(I) % 对比度增强Lab 空间只对亮度通道做 CLAHE lab rgb2lab(I); L lab(:,:,1) / 100; % Lab 亮度范围约 0~100 L adapthisteq(L, NumTiles, [8 8], ClipLimit, 0.02); lab(:,:,1) L * 100; I_out lab2rgb(lab); I_out min(max(I_out, 0), 1); end function W build_weight(I) % 三类权重连乘拉普拉斯对比度、饱和度、显著性 Ig rgb2gray(I); % 拉普拉斯对比度权重 lap imfilter(Ig, fspecial(laplacian, 0.2), replicate); W_lap abs(lap) 1e-3; % 饱和度权重 W_sat std(double(I), 0, 3) 1e-3; % 显著性权重与局部大尺度背景差异大的区域优先保留 h fspecial(gaussian, 31, 5); bg imfilter(Ig, h, replicate); W_sig abs(Ig - bg) 1e-3; W W_lap .* W_sat .* W_sig; % 线性缩放到 0.5~1避免极小权重带来的数值不稳定 W 0.5 0.5 * (W - min(W(:))) / (max(W(:)) - min(W(:)) eps); end function out pyramid_fuse(images, weights, depth) % 多尺度金字塔融合权重走高斯金字塔输入走拉普拉斯金字塔 N numel(images); res cell(depth, 1); for k 1:N L lap_pyr(images{k}, depth); G gauss_pyr(weights{k}, depth); for l 1:depth w3 repmat(G{l}, [1 1 3]); if isempty(res{l}) res{l} L{l} .* w3; else res{l} res{l} L{l} .* w3; end end end out res{depth}; for l depth-1:-1:1 out imresize(out, [size(res{l},1), size(res{l},2)]); out out res{l}; end out min(max(out, 0), 1); end function G gauss_pyr(img, depth) % 高斯金字塔先高斯模糊再下采样 G cell(depth, 1); G{1} img; h fspecial(gaussian, 5, 1.0); for l 2:depth blur imfilter(G{l-1}, h, replicate); G{l} imresize(blur, 0.5); end end function L lap_pyr(img, depth) % 拉普拉斯金字塔当前层减去下采样再上采样的结果 L cell(depth, 1); cur img; h fspecial(gaussian, 5, 1.0); for l 1:depth-1 blur imfilter(cur, h, replicate); down imresize(blur, 0.5); up imresize(down, [size(cur,1), size(cur,2)]); up imfilter(up, h, replicate); L{l} cur - up; cur down; end L{depth} cur; end代码逻辑说明入口函数uw_enhance先把输入统一成 double 0~1再生成颜色校正和 CLAHE 两路输入分别计算权重后做归一化最后进入金字塔融合。颜色校正的 alpha 是唯一需要按场景调的颜色参数CLAHE 的 ClipLimit 控制对比度增强力度0.02 表示限制直方图裁剪幅度的比例越大对比度越强但噪声也越明显金字塔深度 depth 控制融合过渡的尺度范围。提示如果你的 Matlab 版本低于 R2018b不支持mean(x,all)把代码里所有mean(...,all)改成mean(x(:))即可。std(double(I),0,3)返回每个像素在三个通道上的标准差结果尺寸和原图一致。4.2 最小跑通命令把增强函数保存好后命令行执行img imread(test_underwater.png); % 替换成你自己的水下图像 out uw_enhance(img, 5); figure; subplot(1,2,1), imshow(img), title(原始); subplot(1,2,2), imshow(out), title(融合增强); imwrite(out, test_enhanced.png);参数说明uw_enhance第一个参数是 RGB 图像第二个参数是金字塔深度5 是默认值。输出out是 double 类型、范围 0~1imshow可以直接显示imwrite写 PNG 或 JPG 也不会报警。如果读入的是灰度图需要先repmat(I,1,1,3)转成三通道否则rgb2gray会报维度错误。4.3 参数速查表与单步验证参数所在函数默认值调节建议alphacolor_restore0.6偏蓝严重加大但超过 0.8 远景易偏红NumTilesclahe_enhance[8 8]图像大时可改 [16 16]ClipLimitclahe_enhance0.02增大到 0.04 对比度更猛噪声也更多depthpyramid_fuse5小图用 4大图最多 6高斯窗口build_weight31x31, sigma5显著性权重里控制“主体范围”单步验证建议分段做先分别看I1、I2是否解决了色偏和对比度问题再显示W1、W2确认权重图在背景区域没有大面积过曝或全黑。如果权重图某一处出现极值对应的融合结果就会在那一块出现奇怪色彩这时优先检查输入是否含 NaN 或超出 0~1 的像素值。5. 验证与调参UIQM、UCIQE 和三个高频坑5.1 无参考指标快速检验水下增强没有标准参考图常见做法是用无参考指标。UIQM 综合色彩、清晰度与对比度UCIQE 侧重色偏、对比度和饱和度PCQI 则是有参考的块级对比度质量。Matlab 里没有内置 UIQM但可以先用一个快速三指标函数检查整体方向function s quick_quality(I) % 无参考快速指标信息熵 平均梯度 平均饱和度 Ig rgb2gray(I); gx imfilter(Ig, fspecial(sobel)); gy imfilter(Ig, fspecial(sobel)); grad sqrt(gx.^2 gy.^2); s.entropy entropy(Ig); s.gradient mean(grad(:)); s.saturation mean(std(double(I), 0, 3), all); end调用后对比原始图与增强图的三个数值熵和平均梯度上升说明对比度和细节变好饱和度适中说明没有过度增色。如果熵上升但饱和度接近 1多半是颜色校正过猛调小 alpha。5.2 三个高频坑alpha、depth 与权重极值第一个坑是 alpha 调太大颜色校正在蓝色背景区域会产生紫红色色晕。判断方法是看图像最远处的背景区域如果出现粉紫色把 alpha 降到 0.4 左右同时把截断拉伸的百分位从 2% 放宽到 3%。第二个坑是 depth 超过图像允许的最大值金字塔逐层减半到某层出现 1x1 或 0 尺寸imresize直接报错。常见做法是入口加一行保护depth min(depth, floor(log2(min(size(I,1), size(I,2)))) - 1); depth max(depth, 3);第三个坑是权重图极值。build_weight末尾做了 0.5~1 线性缩放但如果某路输入全黑或全白std结果为零连乘后权重退化为常数融合结果实质上退化成单输入。处理方式是检查输入合法性并在std处加上 1e-3 的 epsilon代码里已经包含。最后一招批量处理前先把所有输入统一到宽 800~1200 像素、保持长宽比下采样。这样金字塔层数恒定增强风格才可比交图表和做对比实验时能省去大量返工。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。