如何绘制CIE1931xy色度图

如何绘制CIE1931xy色度图


转载请注明出处

一点点介绍

色度学和CIE1931xyY色空间

既然要绘制这个图,大家应该对xy色品坐标有所了解。

如果不是很了解的可以参考这个CIE1931xyY色度图-复旦大学.ppt了解一下基本的色度学知识。

简单说明一下:

  • 色度图中的外形轮廓线是可见光范围里(约380nm-760nm)单色光颜色轨迹线
  • 等能白点E的坐标xy(0.3333,0.3333)

一点点补充说明

大家在网上应该可以找到五花八门的色度图,让人很难分辨到底哪个才是标准的。

对于部分问题,大家可能会有所疑惑的,在这里简单说明:

  • 真正意义上的色度图在现有的显示设备上根本显示不了,所以相比于纠结图中的颜色是否准确,应该更加关注坐标数据,这才是将颜色量化为xy坐标的意义。不过能画的好看一些确实有助于理解相关概念。
  • 颜色是三维的,色品图是二维的,所以色度图不包含亮度信息。等能白点周围的颜色并不是只有白色,所有灰色、黑色都位于这里。

这里附上几种常见色域在色品图上的位置,图片来源:深入理解 sRGB\Adobe RGB\NTSC\DCI-P3\REC.2020\ProPhoto RGB 色域

gamut

获取途径和绘制方法

这部分主要来介绍一下如何获取这个图以及如何在科研、项目里用这个图。

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=1xy),是计算不了对应的RGB颜色的,还缺少一个Y来控制亮度信息。matlab里实现时候调用了以下代码来将xyz值转为srgb数值:

rgb = images.internal.testchart.xyz2srgb(xyz');

所以可以看到,matlab版本的绘制结果在等能白点周围都是以灰色填充,这取决里matlab具体的换算实现。这个说明顺便帮忙解答我师弟博客下的提问:为什么matlab绘制的色度图白点周围不是白色填充?当然了,我在前面就说了,所有无彩色都集中在这个区域。

另外,这个函数还有几个带参数的重载版本,可以用于绘制一些额外的数据上去,有兴趣的朋友可以参考官方文档中的example学习。

顺便一提,在matlab里进入该函数,里面包含了单色光轨迹线上的63对xy坐标值可用。

更加详细的光谱色度坐标可以参考1931CIE-XYZ标准色度系统

Qt下用C++绘制的两种思路

由于可能需要在项目里用到,就需要自己实现一下啦,这里给出了在两种在Qt框架下的绘制方法。

  1. 借助了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

  • 30
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值