如何绘制CIE1931xy色度图
文章目录
转载请注明出处
一点点介绍
色度学和CIE1931xyY色空间
既然要绘制这个图,大家应该对xy色品坐标有所了解。
如果不是很了解的可以参考这个CIE1931xyY色度图-复旦大学.ppt了解一下基本的色度学知识。
简单说明一下:
- 色度图中的外形轮廓线是可见光范围里(约380nm-760nm)单色光颜色轨迹线
- 等能白点E的坐标xy(0.3333,0.3333)
一点点补充说明
大家在网上应该可以找到五花八门的色度图,让人很难分辨到底哪个才是标准的。
对于部分问题,大家可能会有所疑惑的,在这里简单说明:
- 真正意义上的色度图在现有的显示设备上根本显示不了,所以相比于纠结图中的颜色是否准确,应该更加关注坐标数据,这才是将颜色量化为xy坐标的意义。不过能画的好看一些确实有助于理解相关概念。
- 颜色是三维的,色品图是二维的,所以色度图不包含亮度信息。等能白点周围的颜色并不是只有白色,所有灰色、黑色都位于这里。
这里附上几种常见色域在色品图上的位置,图片来源:深入理解 sRGB\Adobe RGB\NTSC\DCI-P3\REC.2020\ProPhoto RGB 色域
获取途径和绘制方法
这部分主要来介绍一下如何获取这个图以及如何在科研、项目里用这个图。
SVG格式
维基百科上提供的SVG格式的图片,以及不同分辨率的PNG图片,可以自行取用。
https://commons.wikimedia.org/wiki/File:CIE1931xy_blank.svg
Matlab自带函数
在matlab 2017b
及之后的版本中引入了函数plotChromaticity
用于绘制色度图。
最简单的用法,直接调用函数,hold on
之后自己就可以在上面涂涂画画了。
plotChromaticity
hold on
## your code ...
绘制结果如下图所示:
简单说下matlab的实现思路
matlab绘制色度图的方法是将上面的区域分割成一个个小四边形,从4个顶点的xy值计算颜色,并对内部进行插值填充。matlab使用patch函数绘制填充颜色,
patch('Vertices',v, 'Faces',f, 'EdgeColor','none', 'FaceVertexCData',xy4rgb(i:i+3,3:5),'FaceColor','interp');
我们将其中控制线条的'EdgeColor','none'
参数改为'EdgeColor','k'
可以得到以下结果,方便大家更加形象的了解渐变填充过程。
因为其实每个点只能得到xyz坐标( z = 1 − x − y z=1-x-y z=1−x−y),是计算不了对应的RGB颜色的,还缺少一个Y来控制亮度信息。matlab里实现时候调用了以下代码来将xyz值转为srgb数值:
rgb = images.internal.testchart.xyz2srgb(xyz');
所以可以看到,matlab版本的绘制结果在等能白点周围都是以灰色填充,这取决里matlab具体的换算实现。这个说明顺便帮忙解答我师弟博客下的提问:为什么matlab绘制的色度图白点周围不是白色填充?当然了,我在前面就说了,所有无彩色都集中在这个区域。
另外,这个函数还有几个带参数的重载版本,可以用于绘制一些额外的数据上去,有兴趣的朋友可以参考官方文档中的example学习。
顺便一提,在matlab里进入该函数,里面包含了单色光轨迹线上的63对xy坐标值可用。
更加详细的光谱色度坐标可以参考1931CIE-XYZ标准色度系统。
Qt下用C++绘制的两种思路
由于可能需要在项目里用到,就需要自己实现一下啦,这里给出了在两种在Qt框架下的绘制方法。
- 借助了Qt的线性渐变类
QLinearGradient
来进行颜色填充。
QGradient Class
是Qt的渐变填充类,结合QBrush可对任意区域实现快速渐变填充。目前Qt支持三种渐变模式,这里采用线性渐变进行填充。
受matlab填充方式启发,这里选择从等能白点处,即xy(0.3333,0.3333)向单色光轮廓线进行三角区域填充。
QLinearGradient
需要设置填充起点坐标和填充终点坐标,填充起点颜色和填充终点颜色,现有数据为:
- 填充起点坐标:白点(已知)
- 填充终点坐标:曲线轮廓点(已知,需要插值扩充,下方的直线在已知端点的情况下可自行选择填充点的数量)
- 填充起点颜色:可以人为设定白色或者偏灰色,仅为了方便显示和理解(已知)
- 填充终点颜色:人为选取单色光谱中近似对应的蓝色、青色、绿色、黄色、红色五个点,其余点通过插值计算。(已知+计算)
填充颜色的计算方法,即最简单的线性插值计算。但实际上轮廓线是曲线,线性插值会存在一点误差。颜色插值混合可以近似采用格拉斯曼颜色混合定律,假设曲线上蓝色 B B B和青色 C C C之间任意一点,与蓝色距离 d 1 d_1 d