基于直方图优化的图像去雾系统
项目简介
本项目是一个基于 MATLAB 开发的图像去雾与增强仿真平台。系统旨在通过直方图优化技术解决图像因雾气遮挡导致的对比度低、细节丢失等问题。该平台集成了图形用户界面(GUI),集成了全局与局部直方图均衡化算法以及基于色彩恒常性理论的 Retinex 算法,能够实时展示处理效果及直方图变化,为图像去雾算法的性能评估与对比分析提供了直观的工具。
系统要求
- 运行环境: MATLAB (推荐 R2017a 或更高版本)
- 工具箱依赖: Image Processing Toolbox (图像处理工具箱)
* 代码中使用了色彩空间转换函数(如
rgb2hsv,
rgb2lab)以及图像滤波函数(如
adapthisteq,
imgaussfilt),因此必须安装此工具箱。
功能特性
- 多算法集成: 系统内置了三种核心去雾与增强算法,用户可以通过菜单栏快速切换。
- 可视化对比: 界面设计采用四屏显示模式,分别展示原始图像、去雾结果、原始灰度直方图和结果灰度直方图,便于直观对比。
- 文件操作: 支持多种常见图像格式的读取与处理结果的保存。
- 数据量化: 通过实时绘制灰度直方图,量化展示图像对比度和动态范围的变化。
算法实现与逻辑详解
本项目的所有功能逻辑均在一个主程序中实现,以下是代码中集成的关键算法及其具体实现细节:
1. 全局直方图均衡化 (Global Histogram Equalization)
该算法主要用于调整图像的整体动态范围,增强全局对比度。
* 首先判断输入图像是否为彩色(RGB)。如果是彩色图像,将其转换到 HSV 色彩空间。
* 提取 V 通道(亮度分量),仅对 V 通道进行标准的
histeq 直方图均衡化处理,以保护 H(色调)和 S(饱和度)分量不被破坏,从而避免色彩失真。
* 如果是灰度图像,则直接应用直方图均衡化。
* 处理完成后,将图像转换回 RGB 空间并转为 uint8 格式输出。
2. 局部直方图均衡化 (CLAHE)
该算法用于在增强局部对比度的同时限制噪声放大,特别适合处理有雾图像的局部细节。
* 将图像转换到 CIELAB (Lab) 色彩空间。研究表明 CLAHE 在 L 通道(亮度)上的效果优于 HSV 空间。
* 提取 L 通道并归一化。
* 应用限制对比度自适应直方图均衡化 (
adapthisteq)。
*
参数配置: 代码中设定的分块数量 (
NumTiles) 为 [8 8],对比度限制阈值 (
ClipLimit) 为 0.01,目标分布 (
Distribution) 采用瑞利分布 ('rayleigh'),以获得更自然的去雾效果。
* 将处理后的 L 通道与原始 a、b 通道合并,转换回 RGB 空间。
3. Retinex 图像增强 (Multi-Scale Retinex, MSR)
基于色彩恒常性理论,通过估计光照分量来恢复物体本身的反射分量,能有效处理光照不均和雾气问题。
*
多尺度处理: 代码实现了多尺度 Retinex (MSR) 算法。使用了三个不同尺度的高斯核 sigma 值:
[15, 80, 250],权重均分为
[1/3, 1/3, 1/3]。小尺度用于提取细节,大尺度用于处理色彩和整体光照。
*
光照估计: 将图像转为 double 类型并加 1(避免对数运算出现无穷小),进入对数域。利用
imgaussfilt 函数进行高斯模糊以估计光照分量。
*
反射分量计算: 根据公式
Log(R) = Log(I) - Log(G*I) 计算反射分量。
*
颜色恢复与归一化: 算法采用了基于统计特性的自动色阶调整(Simplest Color Balance 思想)。
* 计算每个通道的均值 (Mean) 和标准差 (Std)。
* 设定截断范围为
[Mean - 2*Std, Mean + 2*Std],将超出该范围的像素值截断。
* 将结果线性拉伸并归一化至 0-255 范围,转换为 uint8 输出。
界面交互与系统逻辑
代码通过纯 MATLAB 脚本(无需 .fig 文件)构建了完整的 GUI 系统:
界面布局
*
文件: 包含打开图像、保存结果、退出系统。
*
去雾算法: 下拉选择上述三种算法。
*
帮助: 显示关于信息。
*
第一行: 左侧显示“原始有雾图像”,右侧显示“去雾增强图像”。
*
第二行: 左侧显示“原始图像灰度直方图”,右侧显示“增强图像灰度直方图”。直方图计算时,若为彩色图像会自动转换为灰度图进行统计。
交互流程
- 启动: 运行主函数,清除环境变量并初始化全局数据,构建图形窗口。
- 加载: 点击“打开图像”触发回调,读取图片至内存变量
rawImg,并同步初始化 resImg,调用 update_display 函数刷新四个坐标轴。 - 处理: 选择算法菜单项,系统会显示进度条(waitbar),执行对应的图像处理逻辑,更新
resImg 变量,完成后自动关闭进度条并刷新显示。 - 保存: 点击“保存结果”,系统检查是否存在处理后的图像,若存在则弹出文件保存对话框。
使用方法
- 确保 MATLAB 已安装并包含图像处理工具箱。
- 直接运行
main.m 文件。 - 在弹出的窗口中,点击菜单栏 "文件" -> "打开图像",选择一张需要去雾的图片(支持 .jpg, .png, .bmp, .tif)。
- 点击 "去雾算法",在下拉菜单中选择一种算法(如 "局部直方图均衡化 (CLAHE)")。
- 观察界面下方的直方图变化以及右上角的去雾效果。
- 如需保存处理后的图片,点击 "文件" -> "保存结果"。