Retinex-McCann 图像增强算法 MATLAB 实现
项目简介
本项目在 MATLAB 环境中完整复现了基于 Retinex 理论的 McCann99 算法。该系统旨在模拟人类视觉系统(HVS)的颜色恒常性,通过计算图像中的相对亮度关系,分离并去除光照分量,从而恢复物体真实的反射率信息。
该实现特别针对光照分布不均、背光拍摄或整体低照度的图像进行了优化。代码采用多分辨率金字塔架构,能够有效地在该系统架构下捕捉图像的长距离光照变化,增强图像的局部对比度并恢复暗部细节。
功能特性
本项目基于提供的源代码实现了以下核心功能:
- 灵活的图像输入机制:支持用户交互式选择本地图像文件(JPG, PNG, BMP, TIF)。如果用户取消选择,系统会自动生成一张带有模拟光照阴影(正弦/余弦梯度)的合成低照度图像用于算法演示。
- 对数域计算:将图像转换至对数空间进行处理,符合 Retinex 理论中将乘性光照分量转换为加性分量的数学基础,并包含防止对数奇异值的保护性处理。
- 多分辨率金字塔架构:自动根据图像尺寸构建高斯金字塔,从低分辨率层开始估算光照,逐层向上采样修正,显著提高了算法计算长距离像素关联的效率。
- McCann99 核心迭代:实现了完整的“比率-乘积-重置-平均”(Ratio-Product-Reset-Average)迭代逻辑,支持 8 邻域方向(上、下、左、右及四个对角线)的路径传播。
- 独立通道处理:针对彩色图像,对 R、G、B 三个通道分别独立进行 Retinex 增强,以最大化调整局部对比度。
- 自动动态范围调整:在从对数域恢复至线性域后,通过计算全局最大值和最小值进行线性拉伸(归一化),将图像像素值映射回 [0, 1] 范围。
- 可视化评估系统:提供了一个包含 6 个子图的综合界面,展示原始图、增强图、增强前后差异图、RGB 直方图对比以及灰度亮度分布曲线对比。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(用于
imresize, imhist, imread 等函数)
使用方法
- 确保 MATLAB 的当前工作目录包含项目源文件。
- 在 MATLAB 命令窗口中运行主函数。
- 系统将弹出文件选择对话框:
* 选择一张图片以运行增强算法。
* 点击“取消”以使用内置的合成低照度演示模式。
- 等待计算完成后,观察弹出的结果对比窗口。
算法实现细节与逻辑分析
本项目的核心逻辑实现在主程序及辅助函数中,具体流程如下:
1. 预处理阶段
程序首先通过
uigetfile 获取图像。若未选择图像,则读取内置
peppers.png 并生成一个基于正弦波的空间光照掩膜叠加到原图上,模拟光照不均环境。
随后,图像被转换为双精度浮点数,并执行
log(I + delta) 变换进入对数域,其中
delta 为极小值(1e-4),用于避免对数运算中的无限负值。
2. 多分辨率金字塔构建
算法根据输入图像的最小维度,计算金字塔的最大层数,确保最顶层图像尺寸不小于 32 像素。
- 使用
cell 数组存储每一层图像。 - 通过
imresize 函数配合双线性插值(bilinear)进行 0.5 倍下采样,构建从原始尺寸到顶层的图像金字塔。
3. McCann99 迭代过程
这是算法的核心部分,对 R、G、B 通道分别执行以下逻辑:
- 初始化:从金字塔的最顶层(分辨率最低)开始,初始估计值使用顶层图像本身。
- 逐层处理:从顶层向下遍历至底层(原始分辨率)。
- 上采样:在进入下一层级前,将上一层的计算结果(Current Estimate)通过双线性插值放大至当前层级的尺寸。
- 层内迭代:在每一层调用核心运算函数,执行固定次数(代码中设定为 4 次)的迭代。
4. 核心运算逻辑 (Ratio-Product-Reset-Average)
并在辅助函数中实现,具体步骤如下:
- 方向遍历:每次迭代涵盖 8 个方向(北、南、东、西、东北、西北、东南、西南)。
- 位移比较:利用
circshift 函数实现图像矩阵的循环位移,模拟像素访问邻域的操作。 - 比率 (Ratio):计算原始输入图像与其位移后图像在对数域的差值(对应物理域的商),反映光照梯度。
- 乘积 (Product):将旧的估计值(Old Product)与比率相加,得到新的预测值。
- 重置 (Reset):执行 Retinex 的“最大白”假设。在对数域中,0 代表最大亮度(log 1)。如果预测值大于 0,说明估算的反射率超过了物理极限,将其强制重置为 0。
- 平均 (Average):将旧的估计值与经过重置的新预测值取平均,更新当前的估计结果。
5. 后处理与恢复
- 指数变换:使用
exp() 函数将处理后的对数域数据转换回线性域。 - 归一化:统计图像的全局最小值和最大值,执行
(I - min) / (max - min) 线性拉伸操作,确保输出图像充分利用显示动态范围,消除因算法导致的整体亮度偏移。
6. 结果展示
利用 MATLAB 的
subplot 功能构建可视化面板:
- 展示原始图像与增强后图像的直观对比。
- 计算并归一化显示差异图(
abs(Out - In)),直观呈现被增强的纹理细节。 - 分别绘制增强前后的 RGB 分量直方图。
- 绘制灰度亮度分布曲线,展示图像整体亮度的提升和直方图的均衡化趋势。