MatlabCode

本站所有资源均为高质量资源,各种姿势下载。

您现在的位置是:MatlabCode > 资源下载 > 一般算法 > Retinex-McCann图像增强算法MATLAB源码

Retinex-McCann图像增强算法MATLAB源码

资 源 简 介

本项目完整构建了基于Retinex理论的McCann99算法及其优化版本的MATLAB实现,旨在解决低照度、背光或光照分布不均匀场景下的图像质量下降问题。算法核心基于色彩恒常性原理,模拟人类视觉系统处理光照信息的方式。具体实现中,系统首先将输入图像转换至对数域,并构建多尺度高斯金字塔结构,将图像分解为不同分辨率的层级。在每一层级上,算法执行McCann特有的迭代“比较-重置”操作,通过长距离的像素比较来估算环境光照分量,并将低分辨率层的光照估计结果通过插值上采样传递至高分辨率层作为初始估计。这一过程自顶向下反复迭代,最终从原始图像中分离出代表物体真实属性的反射分量(Reflectance),并剔除光照分量(Illuminance)。项目代码包含完整的算法流程封装,提供灵活的参数设置(如金字塔层数、每层迭代次数),并具备自动白平衡与对比度拉伸的后处理功能。该工具箱适用于夜间监控视频增强、水下图像复原、医学影像清晰化以及老旧照片修复等多种应用场景,能显著提升图像的局部对比度、动态范围及色彩还原度。

详 情 说 明

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 输出及其指数变换(转回线性域)之后执行:
  1. 灰度世界白平衡:计算 RGB 三通道均值,以灰度均值为目标计算缩放因子,平衡色彩。
  2. 对比度拉伸:统计全局像素排序,取 1% 和 99% 处的灰度值作为截断阈值,将图像拉伸至 [0, 1] 区间,显著提升对比度。
  3. Gamma 校正:应用 Gamma=1/1.2 的指数变换,进一步提升暗部细节的可视性。

辅助工具函数

  • 直方图绘制:在同一坐标系下绘制 RGB 三通道的直方图曲线,便于观察色彩分布。
  • 统计获取:计算图像灰度化后的均值和标准差,用于量化评估增强效果。
---

环境要求与使用方法

系统要求

  • MATLAB:推荐 R2016a 及以上版本。
  • 工具箱:必须安装 Image Processing Toolbox(图像处理工具箱),用于支持脚本中的 imresize, imhist, imread, imshow 等核心函数。

使用方法

  1. main.m 下载至本地目录。
  2. (可选)在同目录下放置一张名为 peppers.png 的测试图片。如果没有图片,脚本会自动生成一个多色彩的随机噪声图进行演示。
  3. 直接运行 main.m
  4. 程序运行结束后,将自动弹出窗口显示:
* 原始图像与模拟低照度/不均匀光照后的输入图像。 * 经过 Retinex-McCann 算法增强后的输出图像。 * 输入与输出的直方图对比。 * 图像尺寸、处理耗时、均值与标准差变化的文本报告。

参数调整

用户可以直接在 main.m 代码中调整以下变量以改变算法行为:
  • nIterations:每个金字塔层级的迭代次数(默认为 4)。增加此值通常能获得更平滑的光照估计,但会增加计算耗时。
  • img_low_light 乘数系数:调整模拟低照度的暗度(默认为 0.3)。