colour-science是专门用来进行颜色空间计算的python模块,用此模块可绘制CIE色域图。下面是CIE 1976色域图的绘制,记录如下:

安装python colour-science模块,用于绘制色域图

git clone https://github.com/colour-science/colour.git   #把colour-science模块拷贝到colour目录下
pip install --user        

安装plotting option

pip install --user ‘colour-science[plotting]

安装完成。这里
–user 选项告诉pip将软件包安装在用户的本地目录下而不是系统范围内,这意味着安装的软件包只对当前用户可用。
pip install --user ‘colour-science[plotting]’:
这个命令通过pip安装了名为"colour-science"的Python软件包,并额外安装了该软件包的一个名为"plotting"的可选部分。
如此,colour-science的Python包安装在/home/user_name/colour/colour下,plotting是其中的一个,放在/home/user_name/colour/colour下。程序中引用如下:
from colour.plotting import *

绘制步骤:
1 colour-science函数画出CIE1976UCS色域图;
2 将CIE1931 xy点坐标转换成CIE1976 u’v’坐标;因为先得到是CIE1931,xy坐标,在CIE1976UCS坐标系中,需要进行转换,将xy坐标转换成u’v’坐标。
3 matplotlib绘制ITU-R BT.709,ITU-R BT.2020,DCI-P3色域空间多边形,以及pointer 色域空间;
4 附加曲线标注,修改坐标范围;
5 显示

import colour
from colour.plotting import *
colour_style()
import numpy as np
# 1  colour-science函数画出CIE1976UCS色域图
plot_chromaticity_diagram_CIE1976UCS(standalone=False)

import matplotlib.pyplot as plt
import matplotlib.patches as patches

ax = plt.gca()       # 获取CIE1976UCS的坐标系
# 2  将CIE1931 xy坐标转换成CIE1976 u'v'坐标
# 坐标转换函数
# colour.xy_to_Luv_uv        convert  CIE 1931 xy to CIE 1976UCS u'v'
# colour.xy_to_UCS_uv       convert CIE 1931 xy to CIE 1960UCS uv            
#  xy: CIE 1931 xy;    UCS_uv: CIE 1960UCS uv;  Luv_uv: CIE 1976 u'v'
ITUR_709=([[.64, .33], [.3, .6], [.15, .06]])
ITUR_709_uv=colour.xy_to_Luv_uv(ITUR_709)
ITUR_2020=([[.708, .292], [.170, .797], [.131, .046]])
ITUR_2020_uv=colour.xy_to_Luv_uv(ITUR_2020)
DCI_P3=([[.68, .32], [.265, .69], [.15, .06]])
DCI_P3_uv=colour.xy_to_Luv_uv(DCI_P3)
pointer_bound= ([[ 0.508, 0.226], [ 0.538, 0.258], [ 0.588, 0.280], [ 0.637, 0.298], [ 0.659, 0.316], 
                                      [ 0.634, 0.351], [ 0.594, 0.391], [ 0.557, 0.427], [ 0.523, 0.462], [ 0.482, 0.491], 
                                      [ 0.444, 0.515], [ 0.409, 0.546], [ 0.371, 0.558], [ 0.332, 0.573], [ 0.288, 0.584], 
                                      [ 0.242, 0.576], [ 0.202, 0.530 ], [ 0.177, 0.454], [ 0.151, 0.389],[ 0.151, 0.330 ],
                                      [ 0.162, 0.295], [ 0.157, 0.266], [ 0.159, 0.245], [ 0.142, 0.214], [ 0.141, 0.195], 
                                      [ 0.129, 0.168], [ 0.138, 0.141], [ 0.145, 0.129], [ 0.145, 0.106], [ 0.161, 0.094], 
                                      [ 0.188, 0.084], [ 0.252, 0.104], [ 0.324, 0.127], [ 0.393, 0.165], [ 0.451, 0.199], [ 0.508, 0.226]])
pointer_bound_uv=colour.xy_to_Luv_uv(pointer_bound)
# 3 matplotlib绘制ITU-R BT.709,ITU-R BT.2020,DCI-P3色域空间多边形,以及pointer 色域空间
gamut_709=patches.Polygon(ITUR_709_uv, linewidth=2, color='green', fill=False)
gamut_2020=patches.Polygon(ITUR_2020_uv, linewidth=2, color='yellow', fill=False)
gamut_DCI_P3=patches.Polygon(DCI_P3_uv, linewidth=1, color='blue', fill=False)
gamut_pointer=patches.Polygon(pointer_bound_uv, linewidth=2, color='white', fill=False)
ax.add_patch(gamut_709)
ax.add_patch(gamut_2020)
ax.add_patch(gamut_DCI_P3)
ax.add_patch(gamut_pointer)
# 4 附加曲线标注,修改坐标范围
plt.legend([gamut_709,gamut_2020, gamut_DCI_P3, gamut_pointer],
    ['ITU-R BT.709','ITU-R BT.2020', 'DCI-P3', 'pointer gamut'],
    loc='upper right')  # 对曲线的标注
plt.axis([-0.1, 0.7, -0.1, 0.7])    #改变坐标轴范围
# 5 显示
plt.show()

在这里插入图片描述

图1 plot_chromaticity_diagram_CIE1976UCS函数绘制的CIE 1976UCS色域图

也可以采用plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS()函数绘制,不需要进行xy坐标到u’v’坐标转换。在此函数中将不同颜色空间(‘ITU-R BT.2020’,‘ITU-R BT.709’,‘dci-p3’, ‘pointer_gamut’)作为参数输入。

RGB = np.random.random((3, 3, 3))  #(32,32,3) 定义点数少,可减少RGB对图形的干扰。
plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS(RGB,colourspaces=['ITU-R BT.2020','ITU-R BT.709','dci-p3'],show_pointer_gamut=True)

在这里插入图片描述

图2 用plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS绘制的CIE1976UCS色域图

注:
函数plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS()和函数plot_chromaticity_diagram_CIE1976UCS(standalone=False)不同,前者完成函数时,按照给定参数,直接显示出所绘制的图形,这样就不能在图中用matplotlib添加任何元素,不方便自定义改变显示方式。后者运行函数时,并未显示图像,由此可以通过matplotlib添加自定义的元素。最后运行plt.show(),显示合成的图像。

两图比较,pointer色域图略有不同,见point色域的右上角处。原因是colour-science提供的colour.POINTER_GAMUT_BOUNDARIES数据有误,其中少了三个点。根据colour-science github网站提供的PointerData.xls则共有35个点,由此构成自定义的point色域点"pointer_bound"。因此,图1绘制的色域图更准确。此xls文件由pointer博士提供,具有权威性。

根据色度学,pointer色域是自然界常见的颜色范围,目前所用的几种颜色空间都是围绕pointer色域来定义,使之尽可能多的包含pointer色域。

BT.709色域是HDTV采用的标准,对CIE1976色域的覆盖率为33.2%,对pointer色域的覆盖率为70.2%。
DCI-P3是美国数字影院系统采用的色域,对CIE1976和pointer色域的覆盖率分别是41.7%和85.5%。
BT.2020是超高清UHDTV和高动态范围HDR电视规定的宽色域,对CIE1976和pointer色域的覆盖率分别是57.3%和99.7%。
目前的液晶显示器,基本能够覆盖BT.709色域;性能优异的液晶显示器,对DCI-P3色域的覆盖可达到98%;而采用纯净激光RGB光源的 DLP投影机,则可覆盖BT.2020色域达到97%。
可参见:
RTINGS.com

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐