Lab颜色空间及其应用

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通道值。以下为程序生成的暖色、冷色、强光、暗光效果图:
    

暖色                                                                  冷色

    

强光                                                                  暗光

Lab颜色空间及其应用相关推荐

  1. Python实现RGB和Lab颜色空间互转

    Python实现RGB和Lab颜色空间互转 https://github.com/rubund/debian-home-assistant/blob/1a3e8f7e4b9ddec60a4380e14 ...

  2. MATLAB 将RGB颜色空间转为HSI颜色空间、LAB颜色空间 原理及程序

    一张彩色图像是由R.G.B三个通道组成,所以首先需要将彩色图像分为三个通道的图像. 以下是对猫图进行单通道提取得到的图像. HSI颜色空间 HSI[Hue-Saturation-Intensity(L ...

  3. 【OpenCV】Lab颜色空间

    一.Lab颜色空间概念 Lab是一种色彩空间,也即一种颜色模型,是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立的,在1976年又经修订并被命名为CIELab.它包括人眼所能看 ...

  4. OpenCV颜色空间——Lab颜色空间

    对于Lab颜色空间,OpenCV同样实现了BGR和Lab之间的转换,如果BGR的值在[0,1]之间,那么转换为Lab的取值范围为: ,, 通过以下程序调节L分量,观察其效果: #include< ...

  5. RGB、HSV和Lab颜色空间

    https://blog.csdn.net/fred_yang2013/article/details/11083691 http://blog.csdn.net/carson2005/article ...

  6. 基于LAB颜色空间的彩色图像分割

    基于LAB颜色空间的彩色图像分割 首先加载原始图像 fabric = imread('fabric.png'); figure(1), imshow(fabric), title('fabric'); ...

  7. LAB颜色空间各通道的取值范围

    同RGB颜色空间相比,Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的.1976年,经修改后被正式命名为CIELab.它是一种设备无关的颜 ...

  8. RGB与Lab颜色空间互相转换

    RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客<光与色的故事--颜色空间浅析>),Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制 ...

  9. 彻底搞懂Lab 颜色空间

    本文参考wikipedia,并加入了自己的理解,有不对的地方多多指教~ 名称 在开始之前,先明确一下Lab颜色空间(Lab color space)的名字: - Lab的全称是CIELAB,有时候也写 ...

最新文章

  1. VTK:PolyData之PolyDataCellNormals
  2. WeChat报错navigateTo:fail can not navigateTo a tabbar page
  3. 趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口
  4. GIT项目管理工具(part7)--移动或者删除文件
  5. java zar_唬人的Java泛型并不难
  6. 不停机上线服务_手机停机也能迅速交话费!微信和三大运营商联手开了“绿色通道”...
  7. java 同步块_java 同步块(Java Synchronized Blocks)
  8. 基础算法---二分查找
  9. mysql基础之mariadb库管理和表管理语句
  10. eclipse 使用问题
  11. 计算机复试面试题总结
  12. 运行c程序的步骤及方法
  13. The Learnning of ROS Navigation Source Code---09-17
  14. 建模练习——扇贝单词
  15. 【自学Java】Java switch语句
  16. 亚马逊ERP贴牌OEM代理贴牌是什么意思 起到一个什么样的作用
  17. 设计一款CPU芯片到底有多难?
  18. Linux 虚拟内存和物理内存的理解(转)
  19. 51nod 1479 小Y的数论题
  20. 105,106数学思维

热门文章

  1. 跟我学Linux系统管理 第三讲 磁盘管理
  2. 算法设计与分析-习题-用生成函数求解递归方程f(n)=2f(n/2)+cn,f(1)=0
  3. sql中替换字段的部分字符
  4. word2vec的pytorch实现
  5. Spring data Mongo $map转写用例
  6. 【电力电子技术DC-AC】三相SPWM逆变器Simulink仿真(设置死区时间)
  7. 干货|最全焊接不良汇总,你知道如何避免吗?
  8. 泰克mdo3014使用手册_泰克示波器MDO3014故障维修案例分享
  9. 小程序获取上一页的数据修改上一个页面的数据
  10. 雷电模拟器dnconsole命令汇总