from: http://nkwavelet.blog.163.com/blog/static/227756038201441624345947/
本文首先阐述Lab颜色模式的基本特性,然后介绍RGB和Lab颜色空间互相转换的算法,并给出算法核心代码和效果图,最后将Lab颜色空间应用到几个特效滤镜中,得到几个类似photoshop滤镜效果图。
【参考资料】
http://hi.baidu.com/im_wxj/item/c43e52cbaab6373399b4984d
http://hao.qinz.net/comments.php?y=08&m=07&entry=entry080727-033517
http://blog.sina.com.cn/s/blog_46e3af5b0100u7wt.html ( 该文中的代码有bug,在本文中已经修正 )
1. Lab颜色空间简介
Lab是一种色彩空间,也即一种颜色模型,是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立的,在1976年又经修订并被命名为CIELab。这是一种与设备无关的颜色系统,也是一种基于生理特性的颜色系统,以数字化方式来描述人的视觉感应。它适用于一切光源色体或物体色的表示与计算。
在Lab颜色空间中,一种颜色由L(亮度)、a颜色、b颜色三种参数表征.L表示照度(Luminosity),相当于亮度,L取值为0 -- 100(纯黑--纯白)。a表示从绿色至
红色
的范围,a取值为 -128 -- +127 (
绿 --
洋红)。b表示从
蓝色
至
黄色的范围,b取值为 -128 -- +127(
蓝 --
黄).正为暖色,负为冷色.
Lab颜色模式的特点:
a) Lab颜色空间中亮度和颜色是分开的, L通道没有颜色,a通道和b通道只有颜色。
b) 在Lab中进行调节很简单,速度很快.
c) 色域宽阔 。它不仅包含了RGB,CMYK的所有色域,还能表现它们不能表现的色彩,人的肉眼能感知的色彩,都能通过Lab模型表现出来.
d) 它弥补了RGB色彩模型和CMYK色彩模式色彩分布不均的不足.
下图所示为Lab颜色空间的图示:
2. Lab和RGB颜色空间之间互转
我们可以先观察RGB到XYZ的转换:
计算完成后,XYZ的取值范围分别是:[0, 0.950456],[0, 1],[0, 1.088754].
然后是XYZ到Lab的转换:
其中函数 f(t) 的定义如下:
计算完成后,L的取值范围 [0, 100],而a和b则为[-128, +127] 和 [-128, +127]。
接下来给出RGB和Lab互相转换的代码及效果图,此处代码将Lab数据归一化到 [0, 1] 区间。
原始图 RGB->Lab->RGB(中间未作任何处理)
原始图 RGB->Lab->RGB(中间未作任何处理)
// 将RGB转化为Lab值函数
void RGB2Lab(int R, int G, int B, double &L, double &a, double &b)
{
double x, y, z;
double fx, fy, fz;
// 转至X-Y-Z
x = 0.412453 * R + 0.357580 * G + 0.180423 * B;
y = 0.212671 * R + 0.715160 * G + 0.072169 * B;
z = 0.019334 * R + 0.119193 * G + 0.950227 * B;
// 除以255,即归一化
x /= (255.0 * 0.950456);
y /= 255.0;
z /= (255.0 * 1.088754);
// 类似Gamma校正
if (y > 0.008856)
fy = pow(y, 1.0/3.0);
else
fy = 7.787 * y + 16.0 / 116.0;
if (x > 0.008856)
fx = pow(x, 1.0/3.0);
else
fx = 7.787 * x + 16.0 / 116.0;
if (z > 0.008856)
fz = pow(z, 1.0/3.0);
else
fz = 7.787 * z + 16.0 / 116.0;
L = 116.0 * fy - 16.0;// 对于 y <= 0.008856 的情况,该公式可以简化为 L = 903.3 * y
a = 500.0 * (fx - fy);
b = 200.0 * (fy - fz);
// Lab值归一化
L = L / 100.0;
a = (a + 128.0) / 255.0;
b = (b + 128.0) / 255.0;
}
// 将Lab转化为RGB值函数
void Lab2RGB(double L, double a, double b, int &R, int &G, int &B)
{
double x, y, z;
double fx, fy, fz;
double dr, dg, db;
L = L * 100.0;
a = a * 255.0 - 128.0;
b = b * 255.0 - 128.0;
fy = (L + 16.0) / 116.0;
fy = fy*fy*fy;
if (fy > 0.008856)
{
y = fy;
fy = (L + 16.0) / 116.0;
}
else
{
y = L / 903.3;
fy = 7.787 * y + 16.0/116.0;
}
fx = a / 500.0 + fy;
if (fx > 0.206893)
x = pow(fx, 3.0);
else
x = (fx - 16.0/116.0) / 7.787;
fz = fy - b/200.0;
if (fz > 0.206893)
z = pow(fz, 3);
else
z = (fz - 16.0/116.0) / 7.787;
x *= (255.0 * 0.950456);
y *= 255.0;
z *= (255.0 * 1.088754);
dr = 3.240479 * x - 1.537150 * y - 0.498535 * z;
dg = -0.969256 * x + 1.875992 * y + 0.041556 * z;
db = 0.055648 * x - 0.204043 * y + 1.057311 * z;
R = (dr < 0.0) ? 0 : (dr > 255.0) ? 255 : (unsigned int)dr;
G = (dg < 0.0) ? 0 : (dg > 255.0) ? 255 : (unsigned int)dg;
B = (db < 0.0) ? 0 : (db > 255.0) ? 255 : (unsigned int)db;
}
3. Lab颜色小应用
人在看物体时,首先看到的是明暗,次之是色彩,Lab模式就是这样的。
L通道 :
调整图像的亮度,当然亮度有暗、中间调和高光区之分。对亮度实施线性或Gamma等变换相当于在图像上添加强光或暗光。
a通道 :
深绿 --- 50%灰(中性灰)-- 红色。
b通道 :
亮蓝 --- 50%灰(中性灰)--- 黄色
。
在用photoshop给照片添加暖色或冷色,就是在Lab空间
中调节这3个参数。暖色通常有红紫、红、橘、黄橘、黄,因此需要将ab通道值加强;冷色通常有蓝绿、蓝青、蓝、蓝紫,因此需要调低ab通道值。以下为程序生成的暖色、冷色、强光、暗光效果图: