通过Photoshop的拾色器,我们知道表征颜色的模型的不止一种,本文将系统并且详细讨论这四种模型(HSV、LAB、RGB和CMYK)之间的联系以及应用。
本文部分章节整合了多位优秀博主的博客(链接见本文末尾),并对其表示感谢。文章中模型转换使用的是C式伪代码而不是数学公式,这样更便于编程人士理解。

图1.Photoshop cc的拾色器
数字图像处理中,最常用的使用也是最容易理解的是RGB模型,常用于颜色显示和图像处理,是三维坐标的模型形式。
下面先介绍RGB模型(图1),该模型可以使用vec3(r, g, b)表示,相当于三维直角坐标系,x、y、z轴相当于红、绿、蓝三通道,原点vec3(0.0, 0.0, 0.0)代表黑色,顶点vec3(1.0, 1.0, 1.0)代表白色,原点到顶点的中轴线x = y = z代表灰度线。

图2.RGB模型
图3.RGB模型解析
用RGB模型表征色彩、深浅、明暗变化的方法是:
色彩变化:三个轴RGB的最大分量顶点与黄紫青(YMC)色顶点的连线;
深浅变化:RGB顶点与CMY顶点到中轴线(原点和顶点的连线)的距离;
明暗变化:中轴线上的点的位置。离远点近偏暗,反之偏亮。
自然界中7色光都是单色光,都有自己独特的光谱特征。之所以使用RGB能混合成其他颜色的光,是因为人类的感官系统导致的,与人类的生理系统有关。可以说:将RGB以不同的比例混合后,人的眼睛可以形成与其他各种频率的可见光等效的色觉,所以才采用RGB作为三原色。
通过对RGB模型的讲解,我们了解到虽然RGB用来表示颜色方便,但相近的两个颜色其值相差可能较大。可以说RGB模型适用于计算机表示,而接下来讲解的HSV模型(Hue色相、Saturation饱和度、Value/Brightness亮度,也叫HSB)模型更适合人类习惯。
HSV模型可以使用倒锥形模型表示(图2)。模型中H表示色彩信息,即光谱颜色所在的位置,该参数用角度来表示,红、绿、蓝分别相隔120°,互补色(CMY)分别相差180°。纯度S是一个比例值,范围[0, 1],表示所选颜色的纯度和该颜色最大的纯度之间的比率,当S = 0时,代表灰度。V表示色彩的明亮程度,范围[0, 1],与光强度无直接关系。

图4.HSV模型

图5.HSV模型解析
HSV对人类来说是一种最直观的颜色模型,我们指定彩色角H,并使V = S = 1.0,然后通过添加黑色或者白色得到目标颜色。增加黑色可以减小V而S不变,这样减小了该颜色亮度;同样增加白色可以减小S而V不变,这样增加了颜色亮度。例如深蓝色(240°, 1.0, 0.4),浅蓝色(240°, 0.4, 1.0)[百度百科]。
一般的,人的眼睛最大能区分128种色彩,130种饱和度和23种明暗度。若仅使用16bits表示HSV值的话,可用7位存放H,4位存放S,5位存放V,即H7S4V5或者H6S5V5就能满足需求。
HSV可用于颜色分割:用H和S表示颜色距离。Androutsos等人同过实验,对HSV颜色空间模型进行大致划分,V > 75% && S > 20%为亮彩色区域,V < 25%为黑色区域,V > 75% && S < 20%为白色区域,其他为彩色区域。对于不同的彩色区域,混合H与S变量,根据划定的阈值就可以进行简单的颜色分割。
《Improving shadow suppression in moving object detection with HSV color information》(基于HSV的去阴影算法)
HSV模型不适合在使用光照的模型中,大部分光线混合运算、光强度运算都无法直接使用HSV模型来实现。
RGB与HSV模型互转(伪代码表示)
取值范围:
R, G, B: [0.0, 1.0] // RGB 0 - 255
H: [0, 2π] // H: [0, 360]
S, V: [0.0, 1.0] // S、V: [0, 100]%
1.RGB to HSV:

float maxValue = max(R, G, B);
float minValue = min(R, G, B);

V = maxValue;
S = (V != 0) ? 1.0 - minValue / maxValue : 0.0;

if (maxValue == minValue)
// undefined, throw error or return valid value.
if (R == maxValue && G >= B)
H = π/3 * (G - B) / (maxValue - minValue) + 0; // H = 60 * (G - B) / (maxValue - minValue) + 0;
if (R == maxValue && G < B)
H = π/3 * (G - B) / (maxValue - minValue) + 2π; // H = 60 * (G - B) / (maxValue - minValue) + 360;
if (G == maxValue)
H = π/3 * (B - R) / (maxValue - minValue) + 2π/3; // H = 60 * (G - B) / (maxValue - minValue) + 120;
if (B == maxValue)
H = π/3 * (R - G) / (maxValue - minValue) + 4π/3; // H = 60 * (G - B) / (maxValue - minValue) + 240;

2. HSV to RGB

hi = mod(floor(H / (π/3)), 6); // hi = floor( H / 60° ) mod 6
f = H / (π/3) - hi; // H = 60 * (G - B) / (maxValue - minValue) + 0;
p = V * (1 - S);
q = V * (1 - f * S);
t = V * (1 - (1 - f) * S);

switch (hi)
case 0: R = V; G = t; B = p; break; // (R, G, B) = (V, t, p)
case 1: R = q; G = V; B = p; break; // (R, G, B) = (q, V, p)
case 2: R = p; G = V; B = t; break; // (R, G, B) = (p, V, t)
case 3: R = p; G = q; B = V; break; // (R, G, B) = (p, q, V)
case 4: R = t; G = p; B = V; break; // (R, G, B) = (t, p, V)
case 5: R = V; G = p; B = q; break; // (R, G, B) = (V, p, q)

第三个我们要介绍的是Lab模型,该模型是基于人对颜色的感觉,描述的是颜色的显示方式,而非显示设备生成颜色所需要的特定色料的数量,故Lab也被视为设备无关的颜色模型。
Lab色彩模型是由亮度(L,Luminosity)和有关色彩的a、b三个要素组成。a表示从洋红色到绿色的范围,b表示由黄色到蓝色的范围。L取值[0, 100],当L = 50时,相当于50%的黑。a、b的值域都是[-128, 127]。当x = -128时,a是绿色,b是蓝色;当x渐渐过渡到127时,a渐渐变成了洋红色,b渐渐变成了黄色。所有的颜色可以由这3个值交互变化组成。例如,当Lab取值为(100, 30, 0)时,色彩表现为粉红色。
Lab模式中,a轴和b轴与RGB模型相比,洋红色更加偏红,绿色更加偏青,黄色略带红色,蓝色略偏青色。

图6.Lab颜色模型
Lab模型具有不依赖设备的优点,除此之外,它还具有宽阔的色域优势。色域范围内不仅包含了RGB、CMYK的所有色域,还能表示他们不能表现的色彩。人类能感知的色彩,都能通过Lab模型表现出来。另外,Lab色彩模型弥补了RGB色彩模型中分布不均匀的不足,在RGB模型中蓝色到绿色之间过度的色彩多,而绿色到红色之间缺少黄色和其他色彩。所以,如果想在数字图像处理中保留宽阔的色域和丰富的色彩,最好选择Lab模型。
1.RGB模型到Lab色彩空间的转换
RGB无法直接转成Lab,需要先转换成XYZ再转成Lab,因此转换需要两个步骤:
R、G、B: [0.0, 1.0] // 0 - 255
L: [0, 100]
a、b: [-128, 127]
(1)RGB转成XYZ
R = gamma(R);
G = gamma(G);
B = gamma(B);

float gamma(float x)
{
if (x > 0.04045) {
return pow((x + 0.055) / 1.055, 2.4);
} else {
return x / 12.92;
}
}

mat3x1(X, Y, Z) = mat3(M) * mat3x1(R, G, B);
其中 0.436052025 0.385081593 0.143087414
[M] = [ 0.222491598 0.716886060 0.060621486 ]
0.013929122 0.097097002 0.714185470
gamma函数是用来对图像进行非线性色调调整的,目的是提高图像的对比度。该函数并不唯一,本文给出的值被广泛应用于大多数。
(2)XYZ转Lab
L = 116 * f(Y / Yn) - 16;
a = 500 * (f(X/ Xn) - f(Y / Yn));
b = 200 * (f(Y / Yn) - f(Z / Zn));

float f(float t)
{
if (t > pow(6.0 / 29.0, 3)) {
return pow(t, 1.0 / 3.0);
} else {
return 1.0 / 3.0 * pow(29.0 / 6.0, 2.0) * t + 4.0 / 29.0;
}
}

其中Xn、Yn、Zn一般默认为1。

最后,本文介绍CMYK色彩模式,该模式是以打印油墨在纸张上的光线吸收特性为基础,图像中每个像素都是由靛青(C)、品红(M)、黄(Y)和黑(K)按照不同比例组成。每个像素的每种印刷油墨会被分配一个百分比例,最亮的颜色分配较低的印刷油墨颜色百分比,较暗的颜色分配较高的百分比。例如,明亮的红色可能会是(0.02, 0.93, 0.9, 0)。(0, 0, 0, 0)会产生纯白色。

R、G、B: [0.0, 1.0] // 0 - 255
C、M、Y、K: [0.0, 1.0] // 0% - 100%
由CMYK转换成RGB的公式:
R = (1.0 - C) * (1.0 - K)
G = (1.0 - M) * (1.0 - K)
B = (1.0 - Y) * (1.0 - K)

参考链接:
http://baike.baidu.com/view/1139658.htm (颜色模式)
http://baike.baidu.com/view/974298.htm (色彩空间)
http://zhuanlan.zhihu.com/lianghai/19652492
http://blog.csdn.net/viewcode/article/details/8203728

颜色空间模型(HSV\LAB\RGB\CMYK)的更多相关文章

  1. 色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV

    之前做个设计,现在从事IT,脑子里面关于RGB,RGBA,CMY,CMYK,YUV,但是具体理论还是不扎实.若干年前之前写过<水煮RGB与CMYK色彩模型—色彩与光学相关物理理论浅叙>&l ...

  2. LCD LED OLED区别 以及RGB、YUV和HSV颜色空间模型

    led 液晶本身不发光,而是有背光作为灯源,白色是由红绿蓝三色组成,黑色是,液晶挡住了led灯光穿过显示器. lcd比led更薄. oled:显示黑色时,灯是灭的,所以显示黑色更深,效果更好. 这就不 ...

  3. RGB、YUV和HSV颜色空间模型

    一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...

  4. 06: RGB、YUV和HSV颜色空间模型

    RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间 YUV:Y"表示明亮度(Luminance或Luma),也就是灰阶值:而"U"和&q ...

  5. 颜色空间模型 与 Opencv中的HSV模型范围

    颜色空间总结 RGB.HSV.YUV 什么是颜色 Wiki是这样说的:颜色或色彩是通过眼.脑和我们的生活经验所产生的一种对光的视觉效应.嗯,简单点说,颜色就是人对光的一种感觉,由大脑产生的一种感觉.感 ...

  6. RGB颜色空间、HSV颜色空间的理解

    HSV是把H(色相),S(饱和度),V(亮度)当做色值来定位颜色的空间. 1.HSV模型 色相:取值范围是0~360度,用来表示颜色的类别.其中红色是0度,绿色是120度,蓝色是240度.饱和度:取值 ...

  7. HSV to RGB

    HSV构成: Hue : the color type (red, blue, or yellow) Ranges from 0 to 360° Saturation : the intensity ...

  8. 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)

    [C#]RGB,CMYK,HSB各种颜色表示的转换   一.表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等 1.RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合 ...

  9. 几种颜色模型(颜色空间):HSV CMYK RGB

    RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的. HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. ...

随机推荐

  1. 组件切换方式(Vue.js)

    这里,我用一个注册登录两组件的切换实例来演示: 切换方式一 <!DOCTYPE html> <html lang="zh-CN"> <head> ...

  2. 【函数】Oracle函数系列(1)--字符函数

    [函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识 ...

  3. idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决

    idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...

  4. PS用户配置服务连接出错

    PS用户配置服务连接出错 [2019-07-30 14:58:25.475]-[INFO ]-[xxxx.profileserver.service.ProfileServerImpl:1430][1 ...

  5. Spark 安装教程

    Spark 安装教程 本文原始地址:https://sitoi.cn/posts/45358.html 安装环境 Fedora 29 openjdk version "1.8.0_191&q ...

  6. Python socket基本写法

    TCP:长连接,安全可靠,不会丢包,但是会发生黏包,面向流的传输,超长的数据包会被拆包发送 多条send的小数据会连在一起发送,造成黏包现象,是tcp协议内部的优化算法造成的 如果要发送特别大的数据时 ...

  7. dapi 基于Django的轻量级测试平台一 设计思想

    GitHub:https://github.com/yjlch1016/dapi 一.项目命名: dapi:即Django+API测试的缩写 二.设计思想: 模拟性能测试工具JMeter的思路, 实现 ...

  8. C# 中静态调用C++dll 和C# 中动态调用C++dll

    在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能 ...

  9. flutter 中的样式

    flutter 中的样式 样式 值 width 320.0 height 240.0 color Colors.white,Colors.grey[300] textAlign TextAlign.c ...

  10. NetEQ主要文件简介

    accelerate.h,accelerate.cc 加速操作,对语音信号处理以实现快速播放. Accelerate类继承自父类TimeStretch,大多数功能由TimeStretch实现. Ret ...