项目:基于Retinex中心环绕算法的图像阴影去除系统
项目简介
本项目实现了一套基于Retinex(视网膜大脑皮层)理论的图像阴影去除与增强系统。该系统模仿人类视觉系统的感知机制,旨在解决图像中因光照不均或阴影遮挡导致的细节丢失问题。
核心思想是基于Retinex理论的“中心环绕”(Center-Surround)机制,假设图像由“照射分量”(Illumination)和“反射分量”(Reflectance)组成。通过在对数域中利用高斯卷积估计光照变化,并将其剥离,从而还原物体表面的真实物理反射属性。本项目完整实现了从基础的单尺度算法到结合色彩恢复的高级多尺度融合算法,不仅能有效去除阴影,还能显著提升图像的局部对比度并保持色彩真实感。
功能特性
- 全套Retinex算法实现:包含单尺度Retinex (SSR)、多尺度Retinex (MSR) 以及带色彩恢复的多尺度Retinex (MSRCR) 三种核心算法。
- 自包含演示环境:代码内置了合成阴影图像生成器,无需外部图片文件即可直接运行演示,生成的图像包含纹理背景、全局光照渐变及局部强阴影。
- 多尺度融合策略:MSR算法采用了低(Sigma=15)、中(Sigma=80)、高(Sigma=250)三个不同尺度的高斯核进行加权融合,平衡了细节增强与动态范围压缩。
- 色彩恢复机制:MSRCR算法引入色彩恢复因子(CRF),有效解决了经典Retinex算法容易出现的“灰度世界”色彩失真问题。
- 可视化数据分析:系统自动生成处理前后的直方图对比、光照分量(中心环绕)估计算法的中间结果可视化,方便从数据和视觉层面评估算法效果。
- 自适应归一化:实现了基于统计特性(均值与标准差)的自适应图像归一化,用于将Retinex算法产生的宽动态范围数据映射回可视区间。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 将
main.m 保存到 MATLAB 的工作目录中。 - 直接运行
main.m 脚本。 - 系统将自动清理环境,生成合成测试图像,依次执行 SSR、MSR、MSRCR 算法。
- 运行结束后,会弹出三个窗口:
*
算法对比图:展示原始含阴影图像与三种算法处理后的效果对比。
*
中心环绕机制图:展示不同尺度下估计出的光照分量(高斯模糊图)。
*
数据分析图:展示灰度直方图对比及最终结果的RGB分量分布。
代码实现逻辑详解
main.m 文件是整个系统的核心,其内部执行流程严格按照以下步骤进行:
1. 环境初始化与图像获取
代码首先清理工作区(
clear,
clc)。为了保证代码的独立性和可复现性,程序没有读取外部文件,而是调用内部子函数生成了一张分辨率为 600x400 的合成图像。该图像包含棋盘格纹理背景,并叠加了线性的光照渐变以及局部的强高斯阴影,最后转化为
double 类型并归一化到 [0, 1] 区间以便于后续对数域计算。
2. 算法参数配置
预定义了Retinex算法所需的关键参数:
- SSR参数:设定高斯核标准差
sigma_ssr 为 80。 - MSR参数:定义了三个尺度
[15, 80, 250] 及其对应的等权重 [1/3, 1/3, 1/3],分别对应细节提取、中等范围处理和全局动态范围调整。 - MSRCR参数:设置色彩恢复系数
alpha、增益 beta、总增益 G 和偏差 b,用于在增强亮度的同时校正色彩。
3. 核心算法流水线
程序依次对图像进行三种算法处理:
- 执行 SSR:对每个通道分别调用单尺度处理函数,计算完成后调用归一化函数处理结果。
- 执行 MSR:对每个通道分别调用多尺度处理函数,通过加权融合不同尺度的SSR结果,并进行归一化。
- 执行 MSRCR:调用带色彩恢复的处理函数,此时不再是逐通道独立处理,而是需要利用多通道信息计算色彩恢复因子,处理后同样进行归一化。
4. 结果可视化(模拟PPT逻辑)
代码利用
subplot 生成三组特定的分析图表:
- 图1 (算法效果综合对比):在一个窗口中同时显示“原始图像”、“SSR结果”、“MSR结果”和“MSRCR结果”,直观展示阴影去除能力的递进。
- 图2 (光照分量估计):为了演示Retinex的物理原理,代码提取了绿色通道,展示了在MSR算法中使用的三个不同尺度(小、中、大)的高斯滤波结果。这实际展示了算法“看”到的光照分布(Illumination),即中心环绕机制中的“环绕”部分。
- 图3 (直方图对比分析):
* 上子图:叠加绘制原始图像和MSRCR处理后的灰度直方图,验证了算法将暗部像素(阴影区域)向亮部推移的效果。
* 下子图:单独展示MSRCR结果的R、G、B三通道直方图,用于分析色彩分布的均衡性。
关键算法与函数分析
项目包含以下几个核心内部函数,支撑了整个处理流程:
单尺度Retinex核心逻辑
该函数实现了最基础的Retinex公式 $R(x,y) = log(I(x,y)) - log(I(x,y) * G(x,y))$。
- 对数域转换:首先计算图像加1后的对数值。
- 光照估计:使用
imgaussfilt 函数对原图进行高斯卷积,模拟中心环绕机制中的“环绕”区域,得到光照分量估计。 - 反射分量提取:在对数域中将原图减去光照分量,得到反射率图像。
多尺度Retinex核心逻辑
该函数在单尺度的基础上构建。它接收一个尺度数组(如
[15, 80, 250]),在循环中多次调用单尺度Retinex算法,并将各次结果按照预设的权重进行线性叠加。这种方法结合了小尺度的高对比度细节和大尺度的色调自然度。
带色彩恢复的多尺度Retinex (MSRCR)
这是最复杂的实现部分,旨在解决“灰度世界”假设导致的色彩发灰问题。
- 色彩恢复因子 (CRF):计算公式为 $beta cdot log(alpha cdot I_i / sum I)$。通过计算当前通道像素与所有通道像素总和的比例,来调整局部色彩比例。
- 增益控制:引入了经典的Retinex增益 $G$ 和偏差 $b$,公式为 $R_{final} = G cdot (CRF cdot R_{MSR} + b)$,将处理结果映射到适合显示的亮度范围。
图像归一化 (自适应拉伸)
Retinex算法处理后的结果通常在对数域或具有不可预测的动态范围。为了在显示器上正确显示,该函数实现了一种基于统计特性的归一化方法:
- 计算每个通道的均值(Mean)和标准差(Std)。
- 利用
Mean ± 2.5 * Std 作为截断上下限(覆盖约98%的像素数据),去除极端噪点的影响。 - 将数据线性拉伸到 [0, 1] 范围,并对越界值进行截断(Clipping)。这相当于一种自动色阶调整。
合成图像生成器
为了确保代码无需素材即可运行,该函数通过数学公式生成测试图:
- 利用
meshgrid 和三角函数生成棋盘格背景。 - 构建线性渐变遮罩模拟由强到弱的光照。
- 使用高斯函数生成局部的圆形暗斑,模拟物体遮挡产生的阴影。
- 最后添加高斯噪声,模拟真实摄像头的成像环境。