RGB与Lab颜空间互相转换

up新势力
RGB与Lab颜⾊空间互相转换
通州二中RGB与Lab颜⾊空间互相转换
1.Lab颜⾊空间
同RGB颜⾊空间相⽐(见博客《光与⾊的故事--颜⾊空间浅析》),Lab是⼀种不常⽤的⾊彩空间。它是在1931年国际照明委员会(CIE)制定的颜⾊度量国际标准的基础上建⽴起来的。1976年,经修改后被正式命名为CIELab。它是⼀种设备⽆关的颜⾊系统,也是⼀种基于⽣理特征的颜⾊系统。这也就意味着,它是⽤数字化的⽅法来描述⼈的视觉感应。Lab颜⾊空间中的L分量⽤于表⽰像素的亮度,取值范围是[0,100],表⽰从纯⿊到纯⽩;a表⽰从红⾊到绿⾊的范围,取值范围是[127,-128];b表⽰从黄⾊到蓝⾊的范围,取值范围是[127,-128]。下图所⽰为Lab颜⾊空间的图⽰;
需要提醒的是,Lab颜⾊空间⽐计算机显⽰器、打印机甚⾄⽐⼈类视觉的⾊域都要⼤,表⽰为 Lab 的位图⽐ RGB 或 CMYK 位图获得同样的精度要求更多的每像素数据。虽然我们在⽣活中使⽤RGB颜⾊空间更多⼀些,但也并⾮Lab颜⾊空间真的⼀⽆所有。例如,在Adobe Photoshop图像处理软件中,TIFF格式⽂件中,PDF⽂档中,都可以见到Lab颜⾊空间的⾝影。⽽在计算机视觉中,尤其是颜⾊识别相关的算法设计中,rgb,hsv,lab颜⾊空间混⽤更是常⽤的⽅法。
两者的区别:调值公式法
RGB的是由红⾊通道(R)、绿⾊通道(G)、蓝⾊通道(B)组成的,最亮的红⾊+最亮的绿⾊+最亮的蓝⾊=⽩⾊;最暗的红⾊+最暗的绿⾊+最暗的蓝⾊=⿊⾊;⽽在最亮和最暗之间,相同明暗度的红⾊+相同明暗度的绿⾊+相同明暗度的蓝⾊=灰⾊。在RGB的任意⼀个通道内,⽩和⿊表⽰这个颜⾊的明暗度。所以,有⽩⾊或者灰⽩⾊的地⽅,R、G、B三个通道都不可能是⿊⾊的,因为必须要有R、G、B三个通道来构成这些颜⾊。
⽽LAB不⼀样,LAB中的明度通道(L)专门负责整张图的明暗度,简单的说就是整幅图的⿊⽩版。a通道和b通道只负责颜⾊的多少。a通道表⽰从洋红⾊(通道⾥的⽩⾊)⾄深绿⾊(通道⾥的⿊⾊)的范围;b表⽰从焦黄⾊(通道⾥的⽩⾊)⾄袅蓝⾊(通道⾥的⿊⾊)的范围;a、b通道⾥的50%中性灰⾊表⽰没有颜⾊,所以越接近灰⾊说明颜⾊越少,⽽且a通道和b通道的颜⾊没有亮度。这就说明了为什么在a、b通道中红⾊T恤的轮廓是那么的清晰!因为红⾊是洋红⾊+焦黄⾊组成的。
总的来说:
1、适合RGB通道抠的图⼤部分LAB模式能完成,反之不成⽴。
2、任何单⼀⾊调背景下,⽤通道抠有明显颜⾊区别的部分,⽤LAB模式很快能完成
3、LAB模式下对明度(L)通道做任何操作(如锐化、模糊等)不会影响到⾊相。
2.RGB转Lab颜⾊空间
RGB颜⾊空间不能直接转换为Lab颜⾊空间,需要借助XYZ颜⾊空间,把RGB颜⾊空间转换到XYZ颜⾊空间,之后再把XYZ颜⾊空间转换到Lab颜⾊空间。
RGB与XYZ颜⾊空间有如下关系:
仔细观察式(1),其中 X = 0.412453 * R +  0.412453 *G+ 0.412453B ;  各系数相加之和为0.950456,⾮常接近于1,我们知道R/G/B的取值范围为[ 0,255 ],如果系数和等于1,则X的取值范围也必然在[ 0,255 ]之间,因此我们可以考虑等⽐修改各系数,使其之和等于1,这样就做到了XYZ和RGB在同等范围的映射。这也就是为什么代码⾥X,Y,Z会分别除以0.950456、1.0、1.088754。
RGB2Lab关键代码实现:
//RGB2Lab Lab2RGB
const float param_13 = 1.0f / 3.0f;
const float param_16116 = 16.0f / 116.0f;
const float Xn = 0.950456f;
const float Yn = 1.0f;
const float Zn = 1.088754f;
float gamma(float x)
{
return x>0.04045?powf((x+0.055f)/1.055f,2.4f):(x/12.92);
};
void RGB2XYZ(T_U8 R, T_U8 G, T_U8 B, float *X, float *Y, float *Z)
{
float RR = gamma(R/255.0);
float GG = gamma(G/255.0);
float BB = gamma(B/255.0);
*X = 0.4124564f * RR + 0.3575761f * GG + 0.1804375f * BB;
*Y = 0.2126729f * RR + 0.7151522f * GG + 0.0721750f * BB;
*Z = 0.0193339f * RR + 0.1191920f * GG + 0.9503041f * BB;
}
void XYZ2Lab(float X, float Y, float Z, float *L, float *a, float *b)
{
float fX, fY, fZ;
X /= (Xn);
Y /= (Yn);
Z /= (Zn);
if (Y > 0.008856f)
fY = pow(Y, param_13);
else
fY = 7.787f * Y + param_16116;
if (X > 0.008856f)
fX = pow(X, param_13);
else
fX = 7.787f * X + param_16116;
if (Z > 0.008856)
fZ = pow(Z, param_13);
else
fZ = 7.787f * Z + param_16116;
fZ = 7.787f * Z + param_16116;
*L = 116.0f * fY - 16.0f;
*L = *L > 0.0f ? *L : 0.0f;文件加密存储
*a = 500.0f * (fX - fY);
*b = 200.0f * (fY - fZ);
}
int RGB2Lab(IMAGE_TYPE *bmp_img,float *lab_img)
{
DWORD width,height,index;
WORD  biBitCount;
T_U8 *dst,*bmp,R,G,B;
float X,Y,Z,L,a,b;
T_U32 line_byte;
T_U16 i,j;
BITMAPFILEHEADER bf;
pbo纤维
BITMAPINFOHEADER bi;
memset(&bf, 0, sizeof(bf));
memset(&bi, 0, sizeof(bi));
bmp = bmp_img;
memcpy(&bf,bmp,14);
memcpy(&bi,&bmp[14],40);
height = bi.biHeight;
width  = bi.biWidth;
biBitCount = bi.biBitCount;//每⼀个像素由24 bits表⽰,即RGB分量每⼀个分量⽤8 bits表⽰ line_byte = WIDTHBYTES(width*bi.biBitCount);
dst = bmp_img+BMPHEADSIZE;
线粒体基因组for (i = 0; i <height;i++)
{
for (j = 0;j < width;j++)
{
index = i*line_byte+3*j;
B = dst[index];
G = dst[index+1];
R = dst[index+2];
RGB2XYZ(R,G,B,&X,&Y,&Z);
XYZ2Lab(X,Y,Z,&L,&a,&b);
lab_img[index] = L;
lab_img[index+1] = a;
lab_img[index+2] = b;
}
}
return 0;
}
4.结果实例
左侧图像是原始图像,右侧图像经过RGB->XYZ->LAB->XYZ->RGB的转换结果图。 以D65光源下24⾊卡为例,对⽐其计算出来的RGB Lab值⼤⼩。
24⾊在D65光源下sRGB值标准SRGB转Lab值

本文发布于:2024-09-24 17:09:31,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/91365.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:通道   空间   范围
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议