项目:基于Welsh算法的灰度图像色彩迁移与着色系统
项目简介
本项目是一个基于MATLAB开发的图像处理系统,旨在复现并实现Welsh等人提出的图像色彩迁移算法(Color Transfer to Greyscale Images)。该系统的核心功能是将一幅彩色参考图像(Source Image)的色彩风格智能地迁移到另一幅灰度目标图像(Target Image)上,从而实现黑白照片的自动着色或图像风格迁移。
系统通过将图像转换至Ruderman定义的$lalphabeta$色彩空间,利用亮度(Luminance)和纹理(Texture)特征在参考图像中寻找最佳匹配像素,并将对应的色度信息($alpha$和$beta$通道)传递给灰度图像,最终生成色彩自然且富有层次的彩色图像。
功能特性
- 自动色彩迁移:无需人工标注,仅需提供一张具有相似场景或纹理的参考彩色图像,即可自动为灰度图像着色。
- $lalphabeta$色彩空间处理:实现了RGB到$lalphabeta$色彩空间的双向转换,有效降低了通道间的相关性,使得亮度和色度可以独立处理。
- 纹理特征匹配:结合像素的亮度值与邻域标准差(纹理特征)进行联合匹配,提高了在复杂纹理区域着色的准确性。
- 高效分块处理:算法采用了分块(Block Processing)和向量化计算策略,并加入了进度条提示,有效控制内存占用并提升了处理大批量像素时的运行效率。
- 特征归一化:对亮度和纹理特征进行了基于标准差的自适应归一化,确保不同量级的特征在计算欧氏距离时具有合理的权重。
- 可视化结果对比:处理完成后自动弹出窗口,并排显示目标灰度图、参考彩色图和最终的着色结果图,便于直观评估效果。
系统要求
- MATLAB R2016a 或更高版本(需包含 Image Processing Toolbox,用于
imread, imresize, stdfilt等函数)。 - 系统需自带标准示例图像库(
cameraman.tif 和 peppers.png),或用户需自行准备相应格式的图像。
使用方法
- 确保MATLAB环境已正确安装并包含图像处理工具箱。
- 直接运行主程序脚本。
- 系统将自动加载内置的示例图像(摄影师灰度图作为目标,辣椒彩色图作为参考source)。
- 程序运行过程中会显示进度条,提示当前的着色进度。
- 运行结束后,会弹出结果窗口展示着色效果。
主要功能实现逻辑
本项目的主程序严格遵循Welsh算法的标准流程,结合了MATLAB的矩阵运算优势,具体实现步骤如下:
1. 数据准备与预处理
程序首先清空环境,并加载MATLAB内置的灰度图像(
cameraman.tif)和彩色图像(
peppers.png)。为了保证算法运行效率,系统强制将两幅图像调整为统一的尺寸(256x256像素),并将数据类型转换为双精度浮点型(
double),范围归一化至[0, 1]。如果目标图像是RGB格式,会自动转换为灰度图;如果参考图像非彩色,程序将报错终止。
2. 色彩空间转换
系统利用自定义函数实现了从RGB空间到Ruderman定义的$lalphabeta$色彩空间的转换。
- 彩色参考图:被完整分解为 $l$(亮度)、$alpha$(黄-蓝通道)、$beta$(红-绿通道)。
- 灰度目标图:仅作为亮度通道 $l$ 输入。虽然在代码层面上构建了三通道输入,但转换后仅保留 $l$ 通道用于后续的特征匹配,$alpha$ 和 $beta$ 通道待填充。
3. 特征提取
为了在参考图中找到与灰度图像素最相似的点,程序提取了两种关键特征:
- 亮度特征:直接使用 $l$ 通道的像素值。
- 纹理特征:计算 $l$ 通道在 $5 times 5$ 邻域内的标准差。程序使用
stdfilt 滤波函数高效计算局部纹理复杂度,用于区分平滑区域(如天空)和复杂纹理区域(如树木、织物)。
4. 样本选择
为了减少计算量并提取具有代表性的颜色样本,程序采用随机采样策略。从参考图像的所有像素中随机抽取200个像素点作为样本集。这些样本点记录了其亮度、色度($alpha, beta$)以及纹理特征,构成了色彩查找表。
5. 色彩匹配与迁移(核心算法)
这是程序最耗时的部分,实现了基于特征距离的最近邻搜索:
- 特征归一化:计算样本集亮度和纹理的标准差,并利用该统计量对源图像和目标图像的特征向量进行归一化,消除量纲差异,确保使用欧氏距离进行匹配时的公平性。
- 分块处理:为了防止生成巨大的距离矩阵导致内存溢出,程序将目标图像的所有像素平铺后,按4096个像素为一个块(Block)进行循环处理。
- 最近邻搜索:对于每一个目标像素,计算其特征向量([归一化亮度, 归一化纹理])与所有200个参考样本特征向量之间的欧氏距离。
- 色度传递:找到距离最小的那个样本点,将其 $alpha$ 和 $beta$ 值直接赋值给目标像素。
6. 图像重构与显示
匹配完成后,目标图像拥有了原始的 $l$ 通道和新生成的 $alpha$、$beta$ 通道。程序调用逆变换函数,将数据从 $lalphabeta$ 空间转换回 RGB 空间。最后,对超出 [0, 1] 范围的数值进行截断处理,并使用
subplot 并排显示处理前后的对比结果。
关键算法与函数分析
rgb2lab_welsh
实现RGB到$lalphabeta$空间的转换。该过程包含两个步骤:
- RGB -> LMS:通过线性矩阵变换将RGB转换为LMS锥体响应空间,并进行对数变换(Log10),模拟人类视觉对光强的对数感知特性。
- LMS -> lαβ:通过Ruderman提出的正交去相关矩阵,将LMS信号转换为三个不相关的分量(亮度、黄蓝差、红绿差)。
lab2rgb_welsh
实现上述过程的逆变换。包括从$lalphabeta$到LMS的矩阵逆变换,指数还原($10^x$),以及从LMS回到RGB空间的矩阵变换。
compute_texture
纹理特征提取函数。通过计算图像局部邻域(默认为5x5窗口)内的标准差来量化纹理。标准差越大,表示该区域纹理越复杂(如边缘、噪点);标准差越小,表示区域越平滑。
select_samples
样本筛选函数。本实现使用了
randperm 生成随机索引,从参考图像中均匀随机地选取指定数量(如200个)的像素点。这种方法简单且能较好地覆盖参考图的整体色彩分布,避免了全像素搜索带来的巨大计算开销。