导航:首页 > 源码编译 > 色空间转换算法

色空间转换算法

发布时间:2022-09-19 23:17:51

‘壹’ 什么是L*a*b颜色空间

可以用数字计算的方法实现由RGB信号到CIE LAB空间的转换,在这个转换过程中可以自动弥补由于滤色片和其它光学器件引起的误差,因此对这些器件的要求可以相应降低。

Lab色彩空间是由国际照明委员会(CIE)于1976年制定的,图4和图5分别为Lab色彩空间的三维立体空间模型图和平面图。它是用L*、a*、b*三个互相垂直的坐标轴来表示一个色彩空间,L*轴表示明度,黑在底端,白在顶端。+a*表示品红色,-a*表示绿色,+b*表示黄色,-b*表示蓝色,a*轴是红一绿色轴,b*轴是黄一蓝色轴Lab与LCH对颜色的描述在数值上的对应关系将在第三部分详细介绍。任何颜色的色相和特征都可以用a*、b*数值来表示,用L*、a*、b*三个数值可以描述自然界中的任何色彩。Lab有三个通道,制作一个Lab模式的图像,从中可以发现,a和b通道几乎不能辨别出来,它们仅仅定义了图像的色彩部分,而没有定义图像的形态细节,因此在Lab模式的图像中颜色和层次是分离的,这一点与RGB和CMYK是不一样的,这使得灰色曲线和彩色曲线可以分开调整,当使用者调整灰色曲线时,彩色的部分不受影响,因此可以只用没有颜色信息的L*通道确定图像的最亮和最暗值。这样既可以避免在色彩校正过程中产生一些跳跃性的、阶调不连续的颜色,也可以只在L通道上锐化图像来强调图像的整体细微层次。L*值的范围为100(白)至0(黑),这样的最大范围在印刷品上并不能体现出来,对于优质铜版纸,L*值的范围不超过95(白)和5(黑)。a*和b*的变化范围从—100到100。任一颜色可以用空间中对应点的L*、a*、b*确定。

在CIEl976L朋均匀颜色空间中可以方便地对颜色进行各种操作。如把a*的数值变成-a*,把b*的数值变成-b*就是进行了相反色的操作,改变后的颜色为原来颜色的相反色,如果仅输出L*通道,则可以用彩色原稿复制单色。

由于Lab色彩空间最大,它包含了RGB和CMYK色彩空间,所以当色彩数据从这样一个大的色彩空间转换到比它小得多的CMYK色彩空间时,不会因为数据量不够而引起色彩的偏差,造成色彩损失。

‘贰’ rgb转换为cmyk颜色空间的举例

rgb转换为cmyk颜色空间的举例:
RGB个CMYK是两个不同的颜色系统,常用与描述设备的属性,RGB一般为输入设备、显示设备的设备值,CMYK则为输出设备(打印机、印刷机)值。
我们工作中,经常会用到RGB-CMYK的转换,如将RGB的图片转换成CMYK,这在打印/印刷中为“分色”,我们不可能人为去进行这样的分色操作。
SO及颜色相关体系中,也没有针对RGB-CMYK之间的转换有一个固定的关系和公式,其实很好理解。
比如RGB(125,125,125)的一个灰色,发送至EPSON打印机上解析后CMYK(50,40,40,0),发送至CANON打印机上解析后的CMYK为(40,30,30,15),更何况打印所使用的软件可能不同,所以无法固定的将RGB转换成CMYK。

‘叁’ c++为什么需要rgb颜色空间转化为ycrcb颜色空间

显示器是通过红绿蓝三种颜色的发光点混合产生颜色的,所以用RGB颜色空间。
但人的视觉实际上是对亮度比色彩要敏感的,转换成YCrCb色彩空间后,可以对于Y分量(亮度)和CrCb(色彩)分开处理,比如视频压缩算法会降低CrCb部分的分辨率来节约空间。
所以不同的色彩空间都有其特定的用途,不同用途之间故而需要转化。

‘肆’ 颜色的空间变换是指

看到好文章,想保存怎么办!下载APP
颜色空间转换(一)

最初九月雪
2014-12-10分享收藏
颜色空间转换

不同彩色空间之间的转换。

1,CMY/CMYK颜色空间

青、品红、黄(CMY)(Cyan、Magenta、Yellow)彩色模型是彩色图象印刷行业使用的彩色空间,在彩色立方体中它们是红、绿、蓝的补色,称为减色基,而红、绿、蓝称为加色基。在CMY模型中,颜色是从白光中减去一定成分得到的。CMY坐标可以从RGB模型中得到:

C = 1 – R

M = 1 – G

Y = 1 – B

由于在印刷时CMY模型不可能产生真正的黑色,因此在印刷业中实际上使用的是CMYK彩色模型,K为第四种颜色,表示黑色(black ink):从CMY 到CMYK的转换:

K := min(C,M,Y)

C := C – K

M := M – K

Y := Y - K

[cpp] view plain
//RGB转换为CMY
void rtRGB2CMY(RtScalar rgb, RtScalar& cmy)
{
cmy.val[0] = 255 - rgb.val[0];
cmy.val[1] = 255 - rgb.val[1];
cmy.val[2] = 255 - rgb.val[2];
}

//CMY转换为RGB
void rtCMY2RGB(RtScalar cmy, RtScalar& rgb)
{
rgb.val[0] = 255 - cmy.val[0];
rgb.val[1] = 255 - cmy.val[1];
rgb.val[2] = 255 - cmy.val[2];
}

//CMY转换为CMYK
void rtCMY2CMYK(RtScalar cmy, RtScalar& cmyk)
{
unsigned char temp = 0;

temp = min(min(cmy.val[0], cmy.val[1]), cmy.val[2]);

if (temp == 255 )
{
cmyk = rtScalar(0, 0, 0, 0);
}
else
{
cmyk.val[0] = cmy.val[0] - temp;
cmyk.val[1] = cmy.val[1] - temp;
cmyk.val[2] = cmy.val[2] - temp;
}
cmyk.val[3] = temp;
}

//CMYK转换为CMY
void rtCMYK2CMY(RtScalar cmyk, RtScalar& cmy)
{
cmy.val[0] = cmyk.val[0] + cmyk.val[3];
cmy.val[1] = cmyk.val[1] + cmyk.val[3];
cmy.val[2] = cmyk.val[2] + cmyk.val[3];
}

2,HSI颜色空间

HSI色彩空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中 方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析 和处理的工作量。HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着 转换关系。

HSI 色彩模型是从人的视觉系统出发,用 H 代表色相 (Hue)、S 代表饱和度 (Saturation) 和 I 代表亮度 (Intensity) 来描述色彩。饱和度与颜色的白光光量刚好成反比,它可以说是一个颜色鲜明与否的指标。因此如果我们在显示器上使用 HIS 模型来处理图像,将能得到较为逼真的效果。
色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。
饱和度 (Saturation):又称色度,是指色彩的强度或纯度。饱和度代表灰色与色调的比例,并以 0% (灰色) 到 100% (完全饱和) 来衡量。
亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。





[cpp] view plain
//RGB转换为HSI
void rtRGB2HSI(RtScalar rgb, RtScalar& hsi)
{
double maxv = 0, minv = 0, angle = 0;
RtScalar temp;

temp.val[0] = rgb.val[0] / 255.0;
temp.val[1] = rgb.val[1] / 255.0;
temp.val[2] = rgb.val[2] / 255.0;

maxv = max(max(temp.val[0], temp.val[1]), temp.val[2]);
minv = min(min(temp.val[0], temp.val[1]), temp.val[2]);

hsi.val[2] = (temp.val[0] + temp.val[1] + temp.val[2]) / 3.0;
hsi.val[1] = 1.0 - minv/hsi.val[2];

angle = (temp.val[0] + temp.val[0] - temp.val[1] - temp.val[2]) / 2.0 * sqrt((temp.val[0] - temp.val[1])*(temp.val[0] - temp.val[1]) + (temp.val[0] - temp.val[2])*(temp.val[1] - temp.val[2]));

if (temp.val[2] <= temp.val[1])
hsi.val[0] = angle / PI * 180.0;
else
hsi.val[0] = (2 * PI - angle)/PI * 180.0;
}

//HSI转换为RGB
void rtHSI2RGB(RtScalar hsi, RtScalar& rgb)
{
int flag = 0;
double t1 = 0, t2 = 0, tv1 = 0, tv2 = 0, tv3 = 0;
RtScalar temp;
temp = hsi;
temp.val[0] = hsi.val[0] * PI / 180.0;

t1 = 2.0 * PI / 3.0;
t2 = 2.0 * t1;

if (temp.val[0] >= t1 && temp.val[0] < t2)
{
flag = 1;
temp.val[0] -= t1;
}
if (temp.val[0] >= t2)
{
flag = 2;
temp.val[0] -= t2;
}

tv1 = (temp.val[2] * (1 - temp.val[1])) * 255.0;
tv2 = (temp.val[2] * (1 + temp.val[1] * cos(temp.val[0]) / cos(PI / 3 - temp.val[0]))) * 255.0;
tv3 = (3.0 * temp.val[2] - tv1 - tv2) * 255.0;

switch (flag)
{
case 0:
rgb = rtScalar(tv2, tv3, tv1, 0);
break;
case 1:
rgb = rtScalar(tv1, tv2, tv3, 0);
break;
case 2:
rgb = rtScalar(tv3, tv1, tv2, 0);
break;
}
}

3,YUV颜色空间
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y、B-Y, 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。 采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。根据美国国家电视制式委员会,NTSC制式的标准,当白光的 亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行 相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。

YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

[cpp] view plain
// RGB转换为YUV
void rtRGB2YUV(RtScalar rgb, RtScalar& yuv)
{
yuv.val[0] = 0.299*rgb.val[0] + 0.587*rgb.val[1] + 0.114*rgb.val[2]; // y
yuv.val[1] = -0.147*rgb.val[0] - 0.289*rgb.val[1]+ 0.436*rgb.val[2]; // u
yuv.val[2] = 0.615*rgb.val[0] - 0.515*rgb.val[1] - 0.1*rgb.val[2]; // v
}

// YUV转换为RGB
void rtYUV2RGB(RtScalar yuv, RtScalar& rgb)
{
rgb.val[0] = yuv.val[0] + 1.14*yuv.val[2]; // r
rgb.val[1] = yuv.val[0] - 0.39*yuv.val[1] - 0.58*yuv.val[2];
rgb.val[2] = yuv.val[0] + 2.03*yuv.val[1];
}

‘伍’ 颜色空间RGB与 色调、饱和度、亮度(ESL)转换的完整C语言算法

你把0-240 按比例 缩放 一下 到 HSL 的 范围,用 HSL-RGB 转换。

HSL--H是色相(0到360度),S是饱和度(0到1),L是亮度(0到1)

规1化的 HSL到RGB颜色值算换子程序:
// nomorized h,s,L 0-1.0
void HSL2RGB(double h, double s, double L,unsigned char *rr, unsigned char *gg,
unsigned char *bb)
{
double v,m,sv, vs0, c1, c2,xiaoshu,r,g,b;
int ih;
r = L; g = L;b = L;
if (L <= 0.5) v = L * (1.0 + s); else v = L + s - L * s;
if (v > 0) {
m = L + L - v; sv = (v - m ) / v;
h = h * 6.0; ih = (int)h;
xiaoshu = h - ih;
vs0 = v * sv * xiaoshu; c1 = m + vs0; c2 = v - vs0;
switch (ih) {
case 0: r = v; g = c1; b = m; break;
case 1: r = c2; g = v; b = m; break;
case 2: r = m; g = v; b = c1; break;
case 3: r = m; g = c2; b = v; break;
case 4: r = c1; g = m; b = v; break;
case 5: r = v; g = m; b = c2; break;
default: break;
}
}
*rr = (int) (r * 0xff); *gg = (int) (g * 0xff); *bb = (int) (b * 0xff);
}

把你3个数值,各除以240,代入子程序即可。
详见:http://hi..com/svjvcfwticdkmse/item/e6c43a21e385b10977272c0e
彩虹光谱RGB值自动生成程序 (L_o_o_n_i_e == 金色潜鸟)

‘陆’ matlab中CIE XYZ, CIE LAB, CIE LUV, RGB , YUV图像颜色空间相互转换函数,要自带的函数比如rgb2ycbcr

除了你说的rgb2ycbcr之外还有几个现成的转换函数是

ycbcr2rgb

rgb2ntsc

ntsc2rgb

rgb2gray

rgb2hsv

没有现成的 和CIE之间的转换函数


但是有一个函数

B = applycform(A,C)

可以将A通过C指定的转换结构转换为B

而C由可以由下面函数产生

C = makecform(type)

只需要输入不同type 就可以生成不同类型的转换结构

然后通过applycform实现颜色空间的转换

其中type可以选择的转换可预见下表


例如你要将存在变量A中lab格式的图像转换为标准的rgb格式

C = makecform(‘lab2srgb');

B = applycform(A,C);

得到的B就是有A转换过来的标准rgb图像


makecform函数还有其他可以设置的参数

具体内容还是自己看matlab的帮助文件

‘柒’ 怎样用C语言实现图片的RGB颜色空间向Lab颜色空间的转化

应该是HTML中的JAVASCRIPT代码,也可能是其他的用处很多,有时JAVASCRIPT中滤镜还要用!

颜色代码有以下几种表示方法:

HSB色系:利用的是人的视觉而产生的不同影响,用色值H,饱和度S,亮度B表示.

Lab色系,这是一种将自然界中所有颜色的转化,有些人眼是无法分辨的,这是各色系中色域最广的一个!用的时候不多.

RGB色系:这个是利用广告学中的三原色原理,纯色系,它认为各种颜色都是由R红G绿和B蓝来以不同比例混合(相加)而成.正如上文中的一个,使用24真彩色时每个最大值是255,最小是0,最后的一个数字,可能是滤镜要用到的滤色什么的,不见全部的东西是不知道的!同时还有另一种表示方法:6位16进制值:如FFFFFF一般前还要加个#号,前两位是红中间两位是绿最后两位是蓝.可以与数字相互转化.最常用的.

CMYK色系:由于广告中的印刷而产生的一种色系,也是混合,但是是减法色系.三原色是品红M,黄Y,青C,因为三色最终混合不能得到黑色,所以加入一个K黑色.这个用于印刷设计.色域没有RGB大.同时还是两个RGB三原色的混合(理论上),其中三原色都不复色,所以是减色系.表示方式是以%值表示,最大是100%.

WEB色系:是RGB的一个子色系(色域),当然色域最小.用以网页等设计,只能表示256种颜色,表示方法与RGB同.但是是按比例缩小色域,如RGB(0,0,0)就是WEB色能表示的,RGB(3,0,0)也是能表示的;但RGB(2,0,0)在WEB中就是RGB(3,0,0);换句话来说,不是RGB色系的一部分.

这没有专门的网站的,要多看一下书,一般平设开始会介绍一部分的相关知识的.

‘捌’ 图像色度空间变换原理

将RGB空间转换成HIS空间,亮度(I)表示颜色的明亮程度,它取决于地物辐射的强度;色调(H)是某一波长的光线引起人们视觉的反映,取决于光线的光谱组成和地物反射辐射的主波长;饱和度(S)是颜色的纯度,取决于地物反射辐射的光谱选择程度。RGB系统三分量是相关的,牵其一而动其全局,而HIS系统三分量相互独立,可以在不改变两个分量的前提下,而改变第三个分量的取值范围或任意的用其他因子来取而代之。由于所采用的坐标系统不同,色度空间变换有不同的模型,常用的主要有:

同一坐标系统:

1∶25万遥感地质填图方法和技术

‘玖’ HSL与RGB颜色系统如何相互转换

HSL与RGB转换
a) RGB→HSL的算法描述。
步骤1:把RGB值转成【0,1】中数值。

步骤2:找出R,G和B中的最大值。

步骤3:设L=(maxcolor + mincolor)/2

步骤4:如果最大和最小的颜色值相同,即表示灰色,那么S定义为0,而H未定义并在程序中通常写成0。

步骤5:否则,测试L:
If L<0.5, S=(maxcolor-mincolor)/(maxcolor + mincolor)
If L>=0.5, S=(maxcolor-mincolor)/(2.0-maxcolor-mincolor)

步骤6: If R=maxcolor, H=(G-B)/(maxcolor-mincolor)
If G=maxcolor, H=2.0+(B-R)/(maxcolor-mincolor)
If B=maxcolor, H=4.0+(R-G)/(maxcolor-mincolor)

步骤7:从第6步的计算看,H分成0~6区域。RGB颜色空间是一个立方体而HSL颜色空间是两个六角形锥体,其中的L是RGB立方体的主对角线。因此,RGB立方体的顶点:红、黄、绿、青、蓝和品红就成为HSL六角形的顶点,而数值0~6就告诉我们H在哪个部分。H=H*60.0,如果H为负值,则加360。

阅读全文

与色空间转换算法相关的资料

热点内容
android秒表实现 浏览:910
不适合程序员的表现 浏览:498
扣扣服务器问题怎么解决 浏览:126
手机怎么连接加密WF 浏览:329
电脑怎么在邮箱发送文件夹 浏览:803
王者荣耀服务器忙如何强制进入 浏览:26
云服务器网站怎么购买 浏览:477
linux系统记录 浏览:127
linuxusb驱动下载 浏览:34
梁特殊箍筋加密区公式 浏览:141
web应用安全pdf 浏览:47
linuxintel网卡驱动下载 浏览:217
资源解压后怎么删除 浏览:868
编程之美15种算法 浏览:147
java的图形用户界面设计 浏览:769
算数游戏源码 浏览:999
压缩机工作声音判断 浏览:985
事业单位程序员 浏览:507
易语言取相似颜色源码 浏览:773
pyodbclinux 浏览:585