文章目录

  • 1 光
  • 2 人眼
  • 3 颜色
    • 3.1 感知亮度
    • 3.2 三原色
  • 4 颜色空间
    • 4.1 XYZ color space
    • 4.2 rgb color space
    • 4.3 Hue color space

1 光

  视觉系统要从光开始说起。光作为电磁波在空间中传播,也是一种粒子流(光子)。

图1 电磁波光谱

可见光区大致为 380 ~ 740 nm.

2 人眼

眼睛主要有2种感光细胞:

  • cone cells:视锥细胞。细节,色彩视觉,需要很多光子激活,亮光。集中在视网膜中心位置。
  • rod cells:视杆细胞。低光,单色视觉。分散在视网膜两外边。

图 2 人眼简单结构

3 颜色

3.1 感知亮度

波长不同,感知的亮度也是不同的。感知亮度和波长曲线如下图:

图3 感知亮度波长曲线    绿色比 蓝色亮度高很多,所以一般黑色背景下人们更容易看清绿色,而不是蓝色,比如安全出口警示牌则一般为绿色,以更容易引起人们注意。

This is hard to see
This is easy to see

3.2 三原色

每个感光细胞都有一个响应曲线,对不同波长光反应有所不同:

  • 视杆细胞:峰值在498nm附近。
  • 视锥细胞:3种,短的峰值在420nm附近,中等的峰值在530nm附近,长的峰值在560nm附近。

图 4 感光细胞的波长反应光谱   色彩的感知来自视锥细胞,是我们对波的感知。

  1920s年代末期,William Wright 和 John Guild等认为三种视锥细胞的感知峰值分别在蓝色,绿色,红色上(现在技术已经证明这一结论并不是完全准确,但对他们得出的结论并不影响),通过实验发现控制3中“基本光”可以获得所有的颜色。

图 5 RGB颜色匹配曲线 即三原色:R, G, B. 图 6 三原色

4 颜色空间

  颜色空间用来表示尽可能多的视觉系统可以感知的颜色,不同的颜色空间可以表示的颜色范围可能是不同的。

4.1 XYZ color space

   XYZ color space是根据人类视觉系统对颜色的响应而做的,即视锥细胞对可见光谱的响应。CIE通过大量实验获得了CIE标准观察颜色匹配函数

图 7 XYZ颜色匹配曲线
可以用以下公式将光谱转化为X, Y, Z 三个值:
X=1∫Y(λ)dλ∫λSe(λ)Xˉ(λ)dλY=1∫Y(λ)dλ∫λSe(λ)Yˉ(λ)dλZ=1∫Y(λ)dλ∫λSe(λ)Zˉ(λ)dλ\begin{array}{l} X={\dfrac{1}{\int Y(\lambda)d \lambda}} \int_\lambda S_e(\lambda) \bar{X}(\lambda) d \lambda \\ Y={\dfrac{1}{\int Y(\lambda)d \lambda}} \int_\lambda S_e(\lambda) \bar{Y}(\lambda) d \lambda \\ Z={\dfrac{1}{\int Y(\lambda)d \lambda}} \int_\lambda S_e(\lambda) \bar{Z}(\lambda) d \lambda \\ \end{array} X=∫Y(λ)dλ1​∫λ​Se​(λ)Xˉ(λ)dλY=∫Y(λ)dλ1​∫λ​Se​(λ)Yˉ(λ)dλZ=∫Y(λ)dλ1​∫λ​Se​(λ)Zˉ(λ)dλ​
其中 Se(λ)S_e(\lambda)Se​(λ) 代表光谱强度。 图 8 XYZ空间色域

4.2 rgb color space

  图5展示了rgb的颜色匹配函数,其中在438.1~546.1nm之间R值出现了负值,这说明有一部分颜色是rgb空间不能包含的。

图 9 RGB颜色空间

  • XYZ →\rightarrow→ RGB

[RGB]=[2.3706743−0.9000405−0.4706338−0.51388501.42530360.08858140.0052982−0.01469491.0093968][XYZ]\begin{bmatrix} R \\ G \\ B \\ \end{bmatrix} = \begin{bmatrix} 2.3706743 & -0.9000405 & -0.4706338 \\ -0.5138850 & 1.4253036 & 0.0885814 \\ 0.0052982 & -0.0146949 & 1.0093968 \\ \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ \end{bmatrix} ⎣⎡​RGB​⎦⎤​=⎣⎡​2.3706743−0.51388500.0052982​−0.90004051.4253036−0.0146949​−0.47063380.08858141.0093968​⎦⎤​⎣⎡​XYZ​⎦⎤​

4.3 Hue color space

  • Hue: 色调,从红色开始按逆时针方向计算,红色为0. 范围取[0,1)
  • Saturation: 饱和度,表示颜色接近光谱色的程度。
  • Value:明度,表示颜色明亮的程度。

图 10 HSV 颜色空间

  将红,黄,绿,青,蓝,品红6种颜色均匀放在一条轴上,再采用线性插值的办法得到色调。

图 11 Hue展开图

  • RGB →\rightarrow→ HSV

V=max(R,G,B)m=min(R,G,B)delta=V−mS=delta/V{\color{Red}V} = max(R, G, B) \\ m = min(R, G, B) \\ delta = V - m \\ {\color{Red}S} = delta / V V=max(R,G,B)m=min(R,G,B)delta=V−mS=delta/V
H={0,delta=0G−Bdelta,V=RB−Rdelta+2,V=GR−Gdelta+4,V=B{\color{Red}H} = \begin{cases} 0, & delta=0 \\ \tfrac{G - B}{delta}, & V = R \\ \tfrac{B - R}{delta} + 2, & V = G \\ \tfrac{R - G}{delta} + 4, & V = B \end{cases} H=⎩⎪⎪⎪⎨⎪⎪⎪⎧​0,deltaG−B​,deltaB−R​+2,deltaR−G​+4,​delta=0V=RV=GV=B​
H={H6+1,ifH<0H6,otherwise{\color{Red}H} = \begin{cases} \tfrac{H}{6} + 1, & if H < 0 \\ \tfrac{H}{6}, & otherwise \end{cases} H={6H​+1,6H​,​ifH<0otherwise​
参考C代码:
定义简单的image结构体:

typedef struct{int w,h,c;float *data;
} image;

色彩空间转换函数:

void rgb_to_hsv(image im)
{assert(im.c == 3);int i, j;float r, g, b;float h, s, v;for(j = 0; j < im.h; j++) {for(i = 0; i < im.w; i++) {r = get_pixel(im, i, j, 0);g = get_pixel(im, i, j, 1);b = get_pixel(im, i, j, 2);float maxVal = three_way_max(r, g, b);float minVal = three_way_min(r, g, b);float delta = maxVal - minVal;// compute Valuev = maxVal;// compute Saturation and Hueif(maxVal == 0) {s = 0;h = 0;} else {s = delta / maxVal;if(delta == 0) {h = 0;} else if(v == r) {h = (g - b) / delta;} else if (v == g) {h = (b - r) / delta + 2;} else if (v == b) {h = (r - g) / delta + 4;}if(h < 0) h += 6;h /= 6;}set_pixel(im, i, j, 0, h);set_pixel(im, i, j, 1, s);set_pixel(im, i, j, 2, v);}}
}
  • HSV →\rightarrow→ RGB
    H=6∗HH = 6 * HH=6∗H
    max=Vmax = Vmax=V
    min=V∗(1−S)min = V * (1 - S)min=V∗(1−S)
    delta=V∗Sdelta = V * Sdelta=V∗S
    deltaH=H−⌊H⌋deltaH = H - \left \lfloor H \right \rfloordeltaH=H−⌊H⌋
    p=min+delta∗deltaHp = min + delta * deltaHp=min+delta∗deltaH
    q=min+delta∗(1−deltaH)q = min + delta * (1 - deltaH)q=min+delta∗(1−deltaH)

{R=max,B=min,G=p,0≤H<1G=max,B=min,R=q,1≤H<2G=max,R=min,B=p,2≤H<3B=max,R=min,G=q,3≤H<4B=max,G=min,R=p,4≤H<5R=max,G=min,B=q,5≤H<6\begin{cases} {\color{Red}R} = max, {\color{Red}B} = min, {\color{Red}G} = p, & 0 \leq H < 1 \\ {\color{Red}G} = max, {\color{Red}B} = min, {\color{Red}R} = q, &1 \leq H < 2 \\ {\color{Red}G} = max, {\color{Red}R} = min, {\color{Red}B} = p, & 2 \leq H < 3 \\ {\color{Red}B} = max, {\color{Red}R} = min, {\color{Red}G} = q, &3 \leq H < 4 \\ {\color{Red}B} = max, {\color{Red}G} = min, {\color{Red}R} = p, & 4 \leq H < 5 \\ {\color{Red}R} = max, {\color{Red}G} = min, {\color{Red}B} = q, &5 \leq H < 6 \\ \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​R=max,B=min,G=p,G=max,B=min,R=q,G=max,R=min,B=p,B=max,R=min,G=q,B=max,G=min,R=p,R=max,G=min,B=q,​0≤H<11≤H<22≤H<33≤H<44≤H<55≤H<6​
参考C代码:

void hsv_to_rgb(image im)
{assert(im.c == 3);int i, j;float h, s, v;float r, g, b;for(j = 0; j < im.h; j++) {for(i = 0; i < im.w; i++) {h = 6 * get_pixel(im, i, j, 0);s = get_pixel(im, i, j, 1);v = get_pixel(im, i, j, 2);float maxVal = v;float minVal = v * (1 - s);float delta = v * s;int hInt = floor(h);// float deltaH = h - hInt;// float p = minVal + delta * deltaH;// float q = minVal + delta * (1 - deltaH);float val = minVal + delta * (1 - fabs(fmod(h, 2) - 1));switch(hInt) {case 0:r = maxVal; b = minVal; g = val; break; // g = p;case 1:g = maxVal; b = minVal; r = val; break; // r = q;case 2:g = maxVal; r = minVal; b = val; break; // b = p;case 3:b = maxVal; r = minVal; g = val; break; // g = q;case 4:b = maxVal; g = minVal; r = val; break; // r = p;default:r = maxVal; g = minVal; b = val;        // b = q;}set_pixel(im, i, j, 0, r);set_pixel(im, i, j, 1, g);set_pixel(im, i, j, 2, b);}}
}

CV(1) : 光 颜色 颜色空间相关推荐

  1. three.js方向光DirectionalLight使用,调整方向光颜色、光源位置、光照强度、光照指向、是否可见、是否产生阴影属性(vue中使用three.js10)

    方向光DirectionalLight使用 一.方向光介绍 二.如何使用方向光 1.创建方向光 2.方向光的属性 2.1颜色-color 2.2是否可见-visible 2.3强度-intensity ...

  2. 【opencv】14.cv::cvtColor函数转换颜色空间时使用CV_RGB2BGR与CV_BGR2RGB结果一样的原因

    看下面一段代码: cv::Mat img1 = imread("./lena_bgr.png",1); cv::Mat img2,img3; cv::cvtColor(img1, ...

  3. CV笔记1:颜色空间介绍及转换

    目录 一.颜色空间介绍 1.1 RGB模型 1.2 CMYK模型 1.3 YUV(YCbCr)模型 1.4 HSI模型 1.5 HSV(HSB)模型 二.颜色空间转换 2.1 RGB转灰度图 2.2 ...

  4. 光 颜色 波长 眼睛

    在人的视网膜中有两种主要感光细胞,即所谓的杆状细胞和锥状细胞. 杆状细胞负责低照明情况下的视觉,能感觉物体的大小和形状,而锥状细胞确保色觉. 锥状细胞有三种类型,锥状细胞的感光性峰值处于光谱中的红色. ...

  5. c语言比例法颜色,颜色空间RGB与 色调、饱和度、亮度(ESL)转换的完整C语言算法...

    满意答案 lfhzwb 推荐于 2017.09.22 采纳率:54%    等级:12 已帮助:7054人 你把0-240 按比例 缩放 一下 到 HSL 的 范围,用 HSL-RGB 转换. HSL ...

  6. opencv颜色空间缩减

    #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp& ...

  7. OpenCV - C++实战(05) — 颜色检测

    目录 第5章  颜色检测 5.1 实现原理 5.2 Lab颜色模型 5.3 cv :: threshold() 阈值函数 5.4 计算图像之间的距离 5.4.1 公式计算 5.4.2 cv::absd ...

  8. 计算机图形学【GAMES-101】13、光场、颜色与感知

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  9. 像素颜色和颜色向量相加相乘的理解

    首先计算机图形学的一条原则是,如果它看上去是对的,那它就是对的.所以,对于一些计算模型来说,最重要的是最后拟合的效果.它不一定符合物理,但通常计算都以物理上的考虑为基础. 像素颜色和相关运算的理解 我 ...

  10. Opengl-光照-颜色(其实要想做出好看的东西这章最重要了)

    前言 前面的基础章节说了下Opengl入门的一些基础知识,通过这些基础知识你可以制作Camera或者让物体移动啊又或者放一张图片上去当做纹理贴图丰富物体的显示 但是其实不论怎么折腾你会发现略微呆板,没 ...

最新文章

  1. C++多继承中重写不同基类中相同原型的虚函数
  2. [luogu 2324][SCOI 2005] 骑士精神 (A*算法)
  3. 阿呆做网站(3)--建数据库
  4. 生病了女朋友说要「陪床」,结果真的是陪床不是陪我......
  5. java并发调用_Java并发教程–可调用,将来
  6. 全球最大的LoRaWAN智能路灯项目刚刚启动
  7. 解决VMware6.5 以上版本安装RHEL 5的自动安装的问题
  8. 宏碁笔记本linux,Acer宏碁(Acer宏碁)Acer 4752G-2332G50Mnkk Linux笔记本电脑整体评测-ZOL中关村在线...
  9. esri-leaflet入门教程(4)-加载各类图层
  10. MATLAB简介与桌面系统
  11. 2022最新ES面试题整理(Elasticsearch面试指南系列)
  12. cad相对坐标快捷键_cad角度快捷键(cad角度命令怎么输入)
  13. 解密区块链最强心脏 迅雷链共识算法详解
  14. java 手动触发gc_java触发full gc的几种情况整理
  15. Arduino学习笔记(14)-- Arduino使用增量编码器测速
  16. i511320h和锐龙r75800h性能 r7 5800h和 i5 11320h 评测
  17. ip设置与防火墙外网映射
  18. 常用计算机二级题库,17年计算机二级office选择题题库
  19. ios label文字行间距_UILabel UITextField调整行间距【原创】
  20. 数据代码如何“产地直销”,做到持续集成持续发布?

热门文章

  1. 在线购物系统分析类图
  2. 网上百度的题目,随手写了一下
  3. Jointly Extracting Multiple Triplets with Multilayer Translation Constraints [论文研读]
  4. 数字系统设计, 8个经典计数器电路方案合辑
  5. 485通讯问题及解决调试方案提炼
  6. 金仓数据库 KingbaseES 插件参考手册(23. dbms_utility)
  7. 本地安全管理审核UDF 第2版 - lsasecur.au3
  8. WSDM2021推荐系统论文集锦
  9. python绘制象棋棋盘图片_如何用Python画一个中国象棋棋盘?
  10. 明天(10分)C语言