「计算机视觉」 Lab色域空间的研究与转化

关键字:计算机视觉 CV、Lab 色域、颜色空间转换、水下图像处理
摘要: 关于具有距离特性的Lab色域研究、Lab2RGB空间转化和水下图像处理的计算机视觉研究

一 选题报告

通过学习我们知道,计算机视觉中有很多色域空间,其中最为常见的便是 RGB Space,但由于其 R、G、B 三通道并不具备距离性(即一个细微的数值变化可能就会出现完全不接近的颜色),不符合人的视觉观感。

例如对于深红和浅红,在色域空间内应该是某通道的细微变化,中间不应间隔一个绿色。

而能够做到这一点的,便是 Lab 色域空间。Lab 的 L 表示亮度通道,a 表示红绿通道,b 表示黄蓝通道。

在 Lab 色域空间中,颜色的程度是具备线性变化的,即具备符合感知的距离差异。那么如果深入研究 Lab 这种更具距离特性的,更符合人类感知的色域空间,将是非常具有前景的。

2 研究历程

2.1 初识色域——确立 Lab 空间

从中不难看出,,Lab 具有最为广域的颜色空间,可以表示更多的颜色(甚至有的人眼无法感知)! 而 Lab 的距离特性意味着,以水下图像为例,我们是不是只需通过大量数据集求出水下图像的 a、b 值,就可以通过近似的方式去加工图片成水下效果呢?而通过对像素的逆向处理,是不是就能还原过滤水下图像的蓝绿色干扰呢?(当然逆向处理要难得多!) 但毫无疑问,这是条非常令人激动的探索方向!

2.2 陷入困境——越界无错之因

我们知道,L(0~100)表示明度,a(-128~+127)表示红绿通道,b(-128~+127)表示蓝绿通道。
当我们训练完大量的水下图像数据集后,出现的一个根本性的问题。
探索的疑问便在此刻出现:为什么当我们操作 a、b 色彩通道的数值,即使越界了也未有报错呢?

要知道,之所以我们研究 Lab 色域,正是在于其距离可控,如果 Lab 是一个循环的话,那我们求水下色域 a、b均值将变得毫无意义。

想到这儿,我们的研究进展不由得陷入困境。

2.3 越山前行——计算机实现 Lab 的本质

打开 opencv 的底层源码和 Lab 实现库,查阅了大量的论文,甚至去外国的色域空间原理的官网去查询 Lab 的色域表示,我们最终找到了答案。

与其说我们是在计算机上显示 Lab 色域,不如说我们是将 Lab 转换成计算机可以显示的 RGB 颜色进行显示。(之前说到,很多 Lab 是无法表示的)

计算机视觉显示 Lab 是采用 RGB 转换的方式实现的。即把 Lab 的色域一一映射到 RGB 空间中,从而在计算机中进行显示。
也就是说,-128~127 是 Lab 的理论空间,但在计算机上的实际空间是转换为 RGB 所能在计算机上显示的值。那么我们的阶段性目标出现了:
找出 Lab 的限定区间!

** 毫无疑问,当我们最后计算出的这个值域空间后,是无比欣喜的!** **这意味着,我们只需要预先限定 Lab 通道的范围在这个范围内,便不会出现越界报错、越界颜色变化不再规律的问题了!**

2.4 Lab 的 Matlab 仿真——穷举法
既然 Lab 色域在计算机上是通过 RGB 转化而成的,那么我便来通过 Matlab 来揭开 Lab 转 RGB 的面纱吧!

【可视化观察】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%% srgb色域
clc
clear
[r,g,b] = meshgrid(linspace(0,1,50));
rgb = [r(:), g(:), b(:)];
lab = rgb2lab(rgb);
a = lab(:,2);
b = lab(:,3);
L = lab(:,1);

k = boundary(a,b,L);
trisurf(k,a,b,L,'FaceColor','interp',...
'FaceVertexCData',rgb,'EdgeColor','none')
xlabel('a*')
ylabel('b*')
zlabel('L*')
axis([-110 110 -110 110 0 100])
view(-10,35)
axis equal
title('sRGB gamut surface in L*a*b* space')

三 论文整理

四 结语

所谓学术探索,就是当有一天突然发现,”百度一下”不再能够解决问题了,CSDN、谷歌无法再有人为我们解答迷津了。
而我们所要不断研究和探索的,就是为了在某一个小问题上,成为别人疑问的解答者。

随着研究问题的不断深入,我们学习的方向越来越收束,所能获得的解答也越来越少。
但这个世界,正是由无数向未知探索的前辈们探索的无比明亮。