`
pleasetojava
  • 浏览: 729644 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

从RGB到Lab色彩空间的转换

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

色彩模型除了最常见的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算法而找遍网络皆不得,万不得已只好自力更生。其间虽费时一日,幸好也算略有所得。暂记于此,以利后人。其间或许难免错漏之处,还望达人不吝指点。:SUN_GLASSES:

装载地址:http://hao.qinz.net/comments.php?y=08&m=07&entry=entry080727-033517
分享到:
评论

相关推荐

    rgb到lab色彩空间转换

    rgb到lab色彩空间转换,转换快速有效 失真率低

    rgb2lab颜色空间转换的MATLAB代码

    本主题将深入探讨RGB到Lab颜色空间转换的MATLAB实现,这对于理解图像处理和色彩科学至关重要。 RGB颜色空间是我们最常见的颜色模型,它基于人眼对红、绿、蓝三原色的感知。然而,在某些应用中,如色彩校正、图像...

    rgb2lab程序matlab实现RGB到LAB转换

    RGB到LAB颜色空间转换在图像处理领域中是一个常见的任务,特别是在色彩分析、图像增强和色彩校正等应用中。MATLAB作为一个强大的数值计算和可视化环境,提供了方便的工具来进行这样的转换。下面我们将深入探讨RGB到...

    RGB到LAB的色域转换程序 c++

    RGB到LAB色域转换在计算机图形学和图像处理领域中是一项基本操作,广泛应用于颜色校正、图像增强以及色彩分析等任务。RGB(红绿蓝)是显示器、摄像机等设备常用的加色模型,而LAB(L*a*b*)色域则更接近人类视觉系统...

    RGB2Lab_rgb转lab色彩通道matlab算法_

    MATLAB作为一种强大的数值计算和数据可视化工具,提供了丰富的函数库支持这类颜色空间转换。本文将详细介绍RGB到Lab色彩空间转换的MATLAB算法及其应用。 首先,我们需要理解RGB和Lab色彩空间的基本概念。RGB色彩...

    RGB到Lab颜色空间的转换

    实现的是RGB颜色空间到Lab颜色空间的转换,并显示一幅图像在Lab各个通道分别显示的效果,直接运行main.m即可

    将RGB图像转换成LAB颜色空间图像

    将RGB图像转换成LAB颜色空间图像,LAB颜色空间各个颜色分量的自相关性最小。具体转换内容参见matlab源代码

    颜色格式转换RGB转LAB

    RGB到LAB的转换涉及到复杂的数学运算,包括线性转换、伽马校正和色彩空间转换等步骤。通常,这个过程需要使用专业的图像处理库或编程语言的内置函数。例如,在JavaScript中,可以使用Color.js或Tiny Color这样的库来...

    Lab-RGB.zip_LAB颜色空间_matlab lab颜色_matlab中rgb转lab_rgb _rgb转换lab

    这些代码对于理解颜色转换背后的原理以及如何在Matlab环境中操作颜色空间转换非常有价值。 总的来说,RGB到Lab的转换在色彩分析、图像增强或色彩校正等任务中具有重要应用。熟练掌握这种转换技巧可以帮助我们更好地...

    rgb_to_lab.zip_Lab颜色提取_RGB到lab_RGB颜色转换_颜色提取_颜色空间

    颜色空间转换,把rgb彩色图像转换到lab颜色空间,用于提取颜色

    四面体插值算法实现RGB到CIELab颜色空间转换

    基于vc++实现四面体插值算法实现RGB到CIELab颜色空间转换

    RGB和Lab相互转换

    例如,在色彩校正时,可能需要先将图像从RGB转换为Lab,以便在更接近人眼感知的颜色空间中进行调整,然后再转换回RGB以适应显示设备。此外,Lab空间也常用于图像的色彩分割和特征提取,因为它可以提供与人类视觉感知...

    RGB2Lab 颜色空间转换 matlab

    非常实用的颜色空间转换,用于颜色距离的度量。方便实用。

    RGB与LAB转换

    通过对RGB到CIEXYZ色彩空间转换的研究,我们可以更好地理解和掌握色彩空间转换的技术细节。多项式回归法作为一种有效的转换方法,在保证转换精度的同时,也为后续的色彩管理和调整提供了可靠的理论基础和技术支持。...

    颜色空间转换RBG到LAB

    可以实现彩色图像由RGB到LAB空间的转换,代码可以直接运行

    颜色空间转换RGB和Lab空间互转

    这是一份RGB与Lab空间转换的代码,代码简洁好用,可以在opencv2中调用

    color_RGB2lab_lab2RGB.rar_Lab RGB_RGB Lab_RGB到lab_lab2rgb_rgb2la

    本主题聚焦于从RGB色彩空间转换到Lab色彩空间,以及反向转换的过程。RGB和Lab是两种广泛使用的色彩模型,各有其特点和适用场景。 RGB色彩空间是一种加性色彩模型,基于红(Red)、绿(Green)和蓝(Blue)三种基色...

    易语言RGB和LAB色彩转换源码

    2. XYZ色彩空间到Lab色彩空间的转换,这一步通常涉及到非线性转换,将XYZ值转换为人类视觉更敏感的L、a、b值。 在易语言中实现这样的转换,需要理解颜色理论和数学公式,并能够将其转化为易语言的语法。由于易语言...

    易语言RGB和LAB色彩转换

    综上所述,易语言RGB和LAB色彩转换涉及到RGB、XYZ和Hunter Lab色彩空间的相互转换,通过这些转换,开发者可以在不同的色彩系统间灵活地操作颜色数据,满足各种图像处理和显示需求。通过研究提供的源码,我们可以深入...

    易语言源码易语言RGB和LAB色彩转换源码.rar

    相反,LAB色彩模型是一种接近人眼感知的颜色空间,由Lightness(明度)、A通道(绿色-红色)和B通道(蓝色-黄色)组成。这种模型在色彩校正和图像处理中广泛应用,因为它能更好地模拟人类视觉系统对颜色的感知。在...

Global site tag (gtag.js) - Google Analytics