最近一直在学习绘制RGB,HSV,Lab色彩空间的直方图,其中也涉及到互相转换的知识,这是网上看到的介绍的。

====================================================================================================================================

虽然若干年前就看过了关于色彩空间的介绍,但是直到今天才自己动手写代码做这件事情。虽然网络上已经有很多现成的例子,但是一则仅仅适用于浮点型的数据,另一方面,在实现上也有一些尚可优化之处。

色彩模型除了最常见的RGB以外,还有HSB、YCbCr、XYZ、Lab等。HSB一般仅仅作为图像处理过程中的临时模式,YCbCr常常用于图像的压缩处理,而XYZ则严格按照人眼对光信号的敏感度进行分布。

这 里将要稍作讨论的便是Lab模型。网络上诸多的介绍都说Lab是基于XYZ的,故人们一般也只能找到XYZ和Lab之间的转换,而RGB到Lab的转换只 能使用XYZ作为中间模式间接进行。可惜的是,这种现状源于误解。而在图像处理软件中(比如Photoshop),往往采用一个更为简单的算法。

我们可以先观察RGB到XYZ的转换:

[X,Y,Z] = [M] * [R,G,B]

其中M为一3x3矩阵:
[M] = [0.4125, 0.3576, 0.1805;
0.2126, 0.7152, 0.0722;
0.0193, 0.1192, 0.9505],

RGB是经过Gamma校正的色彩分量:R=g(r),G=g(g),B=g(b)。
其中rgb为原始的色彩分量。

g是Gamma校正函数:
当 x < 0.018 时,g(x) = 4.5318 * x
当 x >= 0.018 时,g(x) = 1.099 * d^0.45 - 0.099

rgb以及RGB的取值范围则均为[0,1)。计算完成后,XYZ的取值范围则有所变化,分别是:[0, 0.9506),[0, 1),[0, 1.0890)。

以及XYZ到Lab的转换:

L = 116 * f(Y1) - 16
a = 500 * (f(X1) - f(Y1))
b = 200 * (f(Y1) - f(Z1))

其中f是一个类似Gamma函数的校正函数:
当 x > 0.008856 时,f(x) = x^(1/3)
当 x <= 0.008856 时,f(x) = ( 7.787 * x ) + ( 16 / 116 )
X1、Y1、Z1分别是线性归一化之后的XYZ值,也就是说,它们的取值范围都是[0, 1)。此外,函数f的值域也和自变量一样都是[0, 1)。

计算完成后,L的取值范围[0, 100),而a和b则约为[-169, +169)和[-160, +160)。

在观察这些貌似复杂的变换之前,我们必须确定的一个假设是:在图像处理软件中,非RGB色彩数据的绝对值并不重要,重要的是他们能够尽可能准确的还原成RGB图像以显示在屏幕等相关设备上。这个假设是我们的简化得以成立的理由。

上面的从XYZ到Lab的转换乍一看起来很奇怪,但若是仔细观察,不难发现L与Y1只是一个简单的同区间映射关系,这个映射其实可有可无(如果进行了映射反而必定导致色阶丢失)。

这样,我们取得的第一个简化是: L = Y1 。

接 下来接着看a和b的映射过程。大家不难发现,a和b其实是一个色差信号(跟Cb和Cr的性质差不多)。至于它们的转换系数500和200,大家可以完全忘 记,因为他们的值域并不符合8位整数值的表达需要。我们将会稍后计算出合适的因数,使得a和b都处在[0, 255]的范围内。

因为XYZ必须归一化转为X1Y1Z1,那么我们其实可以在转换矩阵M中作出这个修改,令每行乘以一个系数以使得每行各数之和为1:
[M1] = [0.4339, 0.3762 0.1899;
0.2126, 0.7152, 0.0722;
0.0177, 0.1095, 0.8728]

于是乎,我们得出一个半成品:
L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = Fa * (X1 - Y1) + Da
b = Fb * (Y1 - Z1) + Db
其中的Fx是调整值域用的系数,Dx是一个正数,用来消除a和b的负值。Fx和Dx的选取必须令a和b满足值域在[0, 255]上的分布。

接 下来我们来确定Fx和Dx的值。通过M1我们很容易计算出X1-Y1的值域(极端情况)为[-86.784, +86.784),而Y1-Z1的值域则为[-204.9536, +204.9536)。于是乎,Fa的值为1.4749,Fb的值为0.6245;Da和Db则都是128。

这时,代入M1有:
L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = 1.4749 * (0.2213 * R - 0.3390 * G + 0.1177 * B) + 128
b = 0.6245 * (0.1949 * R + 0.6057 * G - 0.8006 * B) + 128
其中RGB和Lab的取值范围都是[0,255]。

最后的一点工作是算法的优化。我们可以将这个方程组转换成常整数乘法与移位的方式(相当于使用定点数)。为了方便阅读,我仍然将移位写为除法。

所以我们的最终结果为:

L = Y1 = (13933 * R + 46871 * G + 4732 * B) div 2^16
a = 377 * (14503 * R - 22218 * G + 7714 * B) div 2^24 + 128
b = 160 * (12773 * R + 39695 * G - 52468 * B) div 2^24 + 128

至于逆变换则可以用类似的方法推导出来:

设L1=L,a1=(a-128)*174,b1=(b-128)*410,有:
R = L1 + (a1 * 100922 + b1 * 17790) div 2^23
G = L1 - (a1 * 30176 + b1 * 1481) div 2^23
B = L1 + (a1 * 1740 - b1 * 37719) div 2^23
其中RGB和Lab的取值范围都是[0,255],再经过逆Gamma函数取得原始的rgb

以上的算法在Delphi中编译通过。经测试,运算得出的直方图与图片观感和我手头的Photoshop CS的结果非常相似,但也有一些幅度上的差别,且容以后慢慢细察。

当初为了寻觅一个简单的RGB直接转Lab算法而找遍网络皆不得,万不得已只好自力更生。其间虽费时一日,幸好也算略有所得。暂记于此,以利后人。其间或许难免错漏之处,还望达人不吝指点。

转载地址:http://hao.qinz.net/comments.php?y=08&m=07&entry=entry080727-033517

从RGB到Lab色彩空间的转换相关推荐

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

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

  2. RGB转为Lab色彩空间的偏色检测

    RGB转为Lab色彩空间的偏色检测 步骤: 第一步:将RGB转为LAB空间 第二步:在LAB空间内进行偏色检测 公式: 1)RGB----LAB 其中的rgb为原始图像的3个通道的值:Lab为转换之后 ...

  3. RGB与Lab颜色空间互相转换 持续更新中

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

  4. python中颜色空间lab直方图_python – 从RGB转换为LAB色彩空间 – 对L * A * B *值范围的任何了解?...

    在OpenCV( Python)中将图像从RGB转换为LAB时,我无法找到有关L * A * B *值范围的文档.寻找一些确认我的洞察力是正确的,因为数字是相当奇特的.我的亮度结果是0-255,但对于 ...

  5. RGB、Lab等颜色空间的区别

    RGB颜色空间 RGB颜色是红色(Red).绿色(Green)和蓝色(Blue)三基色的字母缩写.RGB色彩模式是通过三种基本颜色的不同程度的迭加来产生各种各样的不同颜色.这个标准能够涵盖人类视力所能 ...

  6. 你真的了解眼里所见的色彩吗?(一文总结RGB/HSV/Lab)

    1 认识色彩 我们DNA里的氮元素,牙齿里的钙元素,血液里的铁元素,吃掉的东西里的碳元素,都是曾经宇宙大爆炸时的万千星辰散落后组成的,所以我们每个人都是星辰.--卡尔萨根 在我们的印象里,星辰都是斑斓 ...

  7. 色彩空间(RGB, HSV, LAB, YUV)

    RGB颜色空间 RGB(red,green,blue)颜色空间最常用的用途就是显示器系统(计算机.电视机等都是采用RGB颜色空间来进行图像显示).一般来说,电脑,电视机等是利用三个电子枪分别发射R分量 ...

  8. python rgb转lab_RGB转LAB色彩空间

    1.原理 RGB无法直接转换成LAB,需要先转换成XYZ再转换成LAB,即:RGB--XYZ--LAB 因此转换公式分两部分: (1)RGB转XYZ 假设r,g,b为像素三个通道,取值范围均为[0,2 ...

  9. 深刻理解RGB色彩空间与HSI色彩空间的转换关系

    一.概要 本文先给出色调.饱和度和亮度的定义,然后将其量化,利用空间解析几何推导出RGB色彩空间与HSI色彩空间的转换关系,并给出实现这一转换的代码,同时给出OpenCV的标准转换算法. 二.色调.饱 ...

最新文章

  1. (0031) iOS 开发之图片压缩
  2. android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】
  3. vue 点击事件传递多个参数_vue传事件参数
  4. 【已解决】Error: Module not specified (IntelliJ IDEA)
  5. 工厂模式例子之计算器的实现
  6. 屏幕方向读取与锁定:Screen Orientation API(转)
  7. [Oracle] SQL*Loader 详细使用教程(3)- 控制文件
  8. 云计算具有什么平台_如何搭建自己的云计算平台?
  9. 【Java与智能设备】Ch0402 Activity的生命周期
  10. web前端之CSS——web字体详解
  11. Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
  12. 服务器上显示公式,Markdown中实时显示数学公式的方法
  13. javaWeb连接数据库实现简单的登陆注册功能
  14. 卡尔曼滤波原理图文详解
  15. uni app 自定义基座 真机调试 ios设备
  16. 华东师范大学副校长周傲英:数据赋能,从数据库到数据中台
  17. flea-cache使用之Memcached接入
  18. 【python基础】python中常用字符串函数详解
  19. 【转载】裸眼识别二维码
  20. 【考试记录】Apsara Clouder基础技能认证:实现调用API接口

热门文章

  1. 计算机开机引导的结果是,电脑开机显示引导媒体是怎么回事
  2. Android浏览器速度测试,Android平台浏览器网页加载速度对比评测
  3. HTML5 requestAnimationFrame( ) 动画API
  4. 终端乱码的终极解决方案
  5. ULARGE_INTEGER运算
  6. OOB套接字传输实例(达不到预期结果)
  7. char[]:strlen和sizeof的区别
  8. World Token钱包官网骗局模式,是传销吗?
  9. [react] 说说react的生命周期有哪些?
  10. React开发(229):react删除的实现