基于暗原色先验的图像去雾与深度估计系统
项目介绍
本项目是一个基于MATLAB开发的高效图像处理系统,旨在去除单幅图像中的雾霾,并基于透射率信息估计场景的相对深度。系统核心算法基于何凯明博士提出的
暗原色先验(Dark Channel Prior, DCP)理论,结合
大气散射物理模型进行图像复原。此外,系统采用了
导向滤波(Guided Filter)技术对透射率进行边缘保持平滑,以消除去雾产生的光晕效应,并提供场景深度信息的可视化展示。
功能特性
- 智能图像输入:支持用户交互式选择本地图像(JPG, PNG, BMP等),若未选择文件,系统将自动调用内置图像并合成雾效进行算法演示。
- 高效预处理:自动检测图像尺寸,对超过2000像素的大分辨率图像进行缩放,确保计算效率。
- 暗通道计算:利用最小值滤波精确计算图像的暗通道特征。
- 自动大气光估算:基于暗通道中最亮的像素区域,智能推断全局大气光值。
- 精细化透射率优化:结合导向滤波算法,优化粗糙透射率图,有效保留图像边缘细节并消除块状效应。
- 图像清晰化复原:基于大气散射模型逆向求解,恢复清晰的无雾图像。
- 深度信息可视化:根据透射率反推场景相对深度,并生成伪彩色深度热力图。
- 画质增强:对复原后的图像进行对比度拉伸与色彩平衡,提升视觉观感。
- 多视图结果展示:在一个窗口内同时展示原图、暗通道图、透射率图、深度图、复原图及最终增强图,便于算法效果评估。
系统要求
- MATLAB R2014a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 启动MATLAB环境。
- 运行主函数。
- 系统将弹出文件选择对话框:
*
选择图片:选中一张雾天图像,系统将对其进行去雾处理。
*
取消选择:若点击取消,系统将自动加载内置的
peppers.png,并通过深度模拟算法生成一张合成雾图,随即对该合成图进行去雾演示。
- 处理完成后,系统会自动弹出一个包含6个子图的窗口展示处理过程及结果。
算法原理与实现细节
本项目严格遵循以下算法流程实现:
1. 图像输入与合成机制
系统通过UI界面获取用户图像。为了增强演示的健壮性,代码内置了雾图合成逻辑:当用户未选择图像时,系统利用网格生成线性渐变深度,结合设定的散射系数(beta=3.0)和大气光值,在内置图像上叠加物理雾效。
2. 暗原色先验(DCP)计算
根据DCP理论,在非天空区域的局部窗口内,RGB三通道中至少有一个通道的像素值极低。系统设置窗口大小为15x15,首先计算像素的RGB最小值,随后通过形态学腐蚀操作(代替耗时的排序滤波)获取暗通道图。
3. 全局大气光值(A)估算
为了更准确地定位大气光,算法不直接取原图最亮值,而是采用两步法:
- 在暗通道图中提取亮度排名前0.1%的像素位置。
- 在原图对应的这些位置中,寻找RGB范数(亮度)最高的点作为全局大气光值A。同时对A值设定上限(1.0)以防止过曝。
4. 透射率估算与优化
- 初始透射率:基于大气散射模型推导,利用归一化暗通道计算初始透射率,并引入去雾程度因子(omega=0.95)以保留少许雾感,维持景深真实感。
- 导向滤波优化:初始透射率往往具有块状效应。系统实现了一个O(1)复杂度的导向滤波算法,以原图的灰度图作为引导图(Guided Image),对初始透射率进行滤波。滤波半径设为60,正则化参数eps设为0.001,确保在平滑纹理的同时精确保持物体边缘。
5. 场景复原
根据成像公式 $J(x) = frac{I(x) - A}{max(t(x), t_0)} + A$ 恢复场景辐射度。为了避免分母为零导致的噪点,系统设置了透射率下限 $t_0 = 0.1$。
6. 深度图生成
基于物理模型,透射率 $t$ 与深度 $d$ 呈指数反比关系。系统将优化后的透射率取反($1 - t$)作为相对深度的近似,并将其归一化到[0, 1]区间。随后应用自定义的Jet伪彩色映射,将灰度深度图转换为热力图,直观显示近景(冷色)与远景(暖色)。
7. 后处理增强
复原后的图像可能存在整体偏暗的问题。系统对RGB各通道分别进行对比度拉伸(Stretchlim),截断前0.5%和后0.5%的极值像素,将剩余像素的强度线性映射至全动态范围,显著提升图像的对比度和可视性。
关键函数解析
以下从代码层面分析各子函数实现的具体逻辑:
- getDarkChannel: 输入RGB图像,首先计算每个像素在通道维度的最小值,然后使用
imerode(腐蚀函数)配合正方形结构元素进行最小值滤波,高效生成暗通道图。 - getAtmosphericLight: 实现了鲁棒的大气光估算策略。通过
reshape和sort函数快速定位暗通道中最亮的0.1%像素索引,再利用这些索引在原图中进行二次筛选,确保选取的大气光点既是高亮区域又是非白色物体。 - getTransmission: 执行标准的DCP透射率计算公式。包含防止除零的微小量添加,以及对最终透射率进行[0, 1]截断处理。
- guidedFilter: 完整复现了He et al.的导向滤波算法。利用均值、方差和协方差的计算公式,通过线性模型将结构信息从引导图传递给输出图。
- boxfilter: 这是导向滤波加速的核心。通过
cumsum函数计算积分图(Integral Image),实现了与滤波半径无关的常数时间复杂度O(1)的区域求和运算,极大提升了算法运行速度。 - recoverScene: 执行逆向各像素运算。通过
repmat扩展矩阵维度,确保大气光A和透射率t与原图维度一致,从而进行完全向量化的矩阵运算。 - jetColormap: 在不依赖MathWorks外部工具箱的情况下,手动通过查表法(Lookup Table)将灰度值映射为Jet色彩空间(蓝-青-黄-红),用于深度图的可视化渲染。