Retinex-McCann 图像增强算法 MATLAB 实现
项目简介
本项目完整构建了基于 Retinex 理论的 McCann99 算法及其优化版本的 MATLAB 实现。该算法模拟人类视觉系统处理光照信息的方式(色彩恒性),旨在解决低照度、背光或光照分布不均匀场景下的图像质量下降问题。
系统通过将图像转换至对数域,构建多尺度高斯金字塔结构,利用长距离像素比较来估算环境光照分量,并自顶向下迭代传递光照估计。最终从原始图像中分离出代表物体真实属性的反射分量,并剔除不均匀的光照分量。代码不仅包含核心算法,还集成了低照度环境模拟、非均匀光照生成以及完整的后处理流程。
---
主要功能特性
- 多尺度金字塔分解:自动根据图像尺寸计算金字塔层数,构建从粗糙到精细的高斯金字塔,有效处理不同频段的光照变化。
- Retinex-McCann99 核心引擎:在对数域内实现经典的 McCann 迭代算法,通过“比较-重置”(Compare-Reset)操作估算光照分布。
- 环境模拟与鲁棒性:内置数据预处理模块,若读取本地图片失败自动生成合成图像,并强制添加低照度(降低亮度)和正弦波形式的阴影(非均匀光照)以测试算法性能。
- 高效向量化实现:利用矩阵整体位移代替逐像素循环,提高迭代比较的计算效率。
- 自动化后处理:
*
自动白平衡:基于灰度世界假设(Gray World Assumption)校正色偏。
*
对比度拉伸:剔除极值点(1% - 99%)后归一化,增强动态范围。
*
Gamma 校正:轻微的非线性调节以优化视觉亮度。
- 全方位可视化评估:提供输入输出对比、直方图分析以及包括均值、标准差、耗时在内的统计数据展示。
---
核心算法与实现原理
本项目严格遵循 main.m 中的逻辑,其核心处理流程如下:
1. 预处理与环境模拟
程序首先尝试读取图像,若失败则生成随机噪声图。随后,将图像亮度降低至 30% 以模拟低照度,并叠加一个正弦余弦组合的 Mask 模拟非均匀光照(如阴影或聚光灯效果),确保输入数据具有挑战性。
2. 对数域转换与通道分离
算法将 RGB 图像分离为三个独立通道,分别添加微小常数后转换为对数域 (
log(I + epsilon))。这是 Retinex 理论的基础,因为在对数域中,图像模型由 $I = R times L$ 变为 $log(I) = log(R) + log(L)$,使得光照分量变为加性噪声,便于分离。
3. 多尺度金字塔 (Coarse-to-Fine)
- 层数计算:根据图像长宽,自动计算最大下采样层数,保证顶层图像最小维度不低于 32 像素。
- 下采样:使用双三次插值构建图像金字塔。
- 迭代传递:算法从金字塔顶层(最低分辨率)开始处理。顶层的初始光照估计直接取自该层图像。处理完一层后,将结果上采样至下一层尺寸,作为下一层的初始估计。
4. 迭代比较-重置 (Compare-Reset)
这是 McCann99 算法的灵魂,在每一层金字塔中执行指定次数的迭代:
- 邻域比较:在 8 个方向(上下左右及对角线)上进行像素比较。
- 比率传播:利用对数域的差值特性,通过相邻像素的光照差异来更新当前像素的光照估计。公式逻辑为:新估计值 = 邻域估计值 + (当前原图值 - 邻域原图值)。
- 最大值重置 (Reset Constraint):基于 Retinex 物理约束,物体表面的反射率不会超过 100%(即图像亮度无法超过光源亮度)。因此,如果在传播过程中估算出的像素值超过了当前层的最大值(“白点”),则将其强制重置为最大值。
- 均值平滑:为了防止迭代震荡并模拟多路径传播,采用当前估计值与新计算值的平均值来更新结果。
---
代码模块详细分析
代码结构紧凑,主要函数功能如下:
主流程控制
负责数据的加载、退化模拟(加阴影)、调用 Retinex 核心处理、执行后处理,并最终绘制包含图像对比、直方图和统计数据的综合图表。
McCann99 核心处理函数
该函数封装了 Retinex 的完整逻辑。它首先确定金字塔层数,然后构建金字塔。在自顶向下的循环中,负责管理层级间的上采样操作,并调用迭代器处理每一层数据。
迭代比较与重置函数
实现了 McCann99 特有的像素传播逻辑。
- 利用
circshift 函数实现图像矩阵的快速平移,避免了低效的 for 循环遍历像素。 - 实现了 8 邻域的遍历逻辑。
- 执行“光照估计传播”与“超过最大值截断”的核心数学运算。
后处理函数
在 Retinex 输出及其指数变换(转回线性域)之后执行:
- 灰度世界白平衡:计算 RGB 三通道均值,以灰度均值为目标计算缩放因子,平衡色彩。
- 对比度拉伸:统计全局像素排序,取 1% 和 99% 处的灰度值作为截断阈值,将图像拉伸至 [0, 1] 区间,显著提升对比度。
- Gamma 校正:应用 Gamma=1/1.2 的指数变换,进一步提升暗部细节的可视性。
辅助工具函数
- 直方图绘制:在同一坐标系下绘制 RGB 三通道的直方图曲线,便于观察色彩分布。
- 统计获取:计算图像灰度化后的均值和标准差,用于量化评估增强效果。
---
环境要求与使用方法
系统要求
- MATLAB:推荐 R2016a 及以上版本。
- 工具箱:必须安装 Image Processing Toolbox(图像处理工具箱),用于支持脚本中的
imresize, imhist, imread, imshow 等核心函数。
使用方法
- 将
main.m 下载至本地目录。 - (可选)在同目录下放置一张名为
peppers.png 的测试图片。如果没有图片,脚本会自动生成一个多色彩的随机噪声图进行演示。 - 直接运行
main.m。 - 程序运行结束后,将自动弹出窗口显示:
* 原始图像与模拟低照度/不均匀光照后的输入图像。
* 经过 Retinex-McCann 算法增强后的输出图像。
* 输入与输出的直方图对比。
* 图像尺寸、处理耗时、均值与标准差变化的文本报告。
参数调整
用户可以直接在
main.m 代码中调整以下变量以改变算法行为:
nIterations:每个金字塔层级的迭代次数(默认为 4)。增加此值通常能获得更平滑的光照估计,但会增加计算耗时。img_low_light 乘数系数:调整模拟低照度的暗度(默认为 0.3)。