颜色模型工具
项目描述
色彩研究工具。
安装
从 PyPI安装colorio
pip install colorio
光源、观察者、白点
| 光源 | CIE 1931 观察员 |
|---|---|
import colorio
import matplotlib.pyplot as plt
illu = colorio.illuminants.d65()
plt.plot(illu.lmbda_nm, illu.data)
plt.xlabel("wavelength [nm]")
plt.show()
提供以下光源:
- 光源 A(“室内灯”,
colorio.illuminants.a(resolution_in_nm)) - 光源 C(已过时,“北天日光”,
colorio.illuminants.c()) - 光源 D(“自然日光”
colorio.illuminants.d(nominal_temp)等colorio.illuminants.d65()) - 光源 E(等能量,
colorio.illuminants.e()) - F系列光源(“荧光灯”
colorio.illuminants.f2()等)
观察员:
- CIE 1931 标准 2 度观察者 (
colorio.observers.colorio.observers.cie_1931_2()) - CIE 1964 标准 10 度观察者 (
colorio.observers.colorio.observers.cie_1964_10())
颜色坐标和空间
颜色坐标被处理为 NumPy 数组或作为ColorCoordinates数据的薄包装器,它保留了颜色空间信息并具有一些方便的辅助方法。颜色空间可以从 中的类实例化
colorio.cs,例如,
import colorio
colorio.cs.CIELAB()
大多数接受这种颜色空间的方法也接受字符串,例如
cielab.
例如,在 OKLAB 中插入两种 sRGB 颜色,并返回 sRGB:
from colorio.cs import ColorCoordinates
# you can also plug in large numpy arrays instead of two lists here
c0 = ColorCoordinates([1.0, 1.0, 0.0], "srgb1") # yellow
c1 = ColorCoordinates([0.0, 0.0, 1.0], "srgb1") # blue
# naive interpolation gives [0.5, 0.5, 0.5], a mid gray
# convert to OKLAB
c0.convert("oklab")
c1.convert("oklab")
# interpolate
c2 = (c0 + c1) * 0.5
c2.convert("srgbhex", mode="clip")
print(c2.color_space)
print(c2.data)
<colorio color space sRGB-hex>
#6cabc7
所有色彩空间都实现了这两种方法
vals = colorspace.from_xyz100(xyz)
xyz = colorspace.to_xyz100(vals)
用于从和到 XYZ100 的转换。添加新的色彩空间就像编写一个提供这两种方法的类一样简单。以下色彩空间已经实现:
-
XYZ (
colorio.cs.XYZ(100), 决定缩放的参数) -
xyY ( , 决定)
colorio.cs.XYY(100)缩放的参数Y -
sRGB (
colorio.cs.SRGBlinear(),colorio.cs.SRGB1(),colorio.cs.SRGB255(),colorio.cs.SRGBhex()) -
HSL 和 HSV (
colorio.cs.HSL(),colorio.cs.HSV()) 这些类有两个方法from_srgb1() to_srgb1()用于标准 RGB 的转换。
-
OSA-UCS (
colorio.cs.OsaUcs()) -
CIELAB (
colorio.cs.CIELAB()) -
CIELUV (
colorio.cs.CIELUV()) -
RLAB (
colorio.cs.RLAB()) -
DIN99 及其变体 DIN99{b,c,d} (
colorio.cs.DIN99()) -
ICtCp (
colorio.cs.ICtCp()) -
IPT (
colorio.cs.IPT()) -
CIECAM02 / CAM02-UCS
import math import colorio ciecam02 = colorio.cs.CIECAM02(0.69, 20, 100) cam02 = colorio.cs.CAM02("UCS", 0.69, 20, 100)
该实现包含对 CIECAM02 规范的一些改进(参见 此处)。
-
CAM16 / CAM16-UCS
import math import colorio cam16 = colorio.cs.CAM16(0.69, 20, 100) cam16ucs = colorio.cs.CAM16UCS(0.69, 20, 100)
该实现包含对 CAM16 规范的一些改进(参见此处)。
-
J z a z b z (
colorio.cs.JzAzBz()) -
奥克拉 (
colorio.cs.OKLAB()) -
专业实验室 (
colorio.cs.PROLAB()) -
SRLAB2 (
colorio.cs.SRLAB2())
colorio 中的所有方法都是完全矢量化的,即计算速度非常快。
色差公式
colorio 实现了以下色差公式:
- CIE76
colorio.diff.cie76(lab1, lab2)
- CIE94
colorio.diff.cie94(lab1, lab2)
- CIEDE2000
colorio.diff.ciede2000(lab1, lab2)
- CMC l:c
colorio.diff.cmc(lab1, lab2)
色适应变换
colorio 实现了以下 CAT:
- 冯·克里斯
cat, cat_inv = colorio.cat.von_kries(whitepoint_source, whitepoint_destination) xyz1 = cat @ xyz0
- 布拉德福德 (
colorio.cat.bradford) - 尖锐的 (
colorio.cat.sharp) - CMCCAT2000 (
colorio.cat.cmccat2000) - CAT02 (
colorio.cat.cat02) - 十六类 (
colorio.cat.cat16) - 比安科-谢蒂尼 (
colorio.cat.bianco_schettini)
色域可视化
colorio 提供了许多有用的工具来分析和可视化色彩空间。
sRGB色域
| CIELAB | CAM16-UCS | 奥克实验室 |
|---|---|---|
sRGB 色域是 sRGB 空间中的完美立方体,在转换为其他颜色空间时会呈现出奇怪的形状。上图显示了不同色彩空间中的 sRGB 色域。
import colorio
p = colorio.plot_rgb_gamut(
"cielab", # or colorio.cs.CIELAB()
n=51,
show_grid=True,
)
p.show()
如需更多可视化选项,您可以将 sRGB 数据存储在文件中
import colorio
colorio.save_rgb_gamut("srgb.vtk", "cielab", n=51)
# all formats supported by https://github.com/nschloe/meshio
并使用您选择的工具打开它。请参阅 此处了解如何在ParaView中打开文件。
对于 sRGB 色域的亮度切片,使用
import colorio
p = colorio.plot_rgb_slice("cielab", lightness=50.0, n=51)
p.show()
# or
# p.screenshot("screenshot.png")
表面色域
| XYZ | CIELAB | CAM16-UCS |
与上述相同,但在给定光源下表面色域可见。
import colorio
illuminant = colorio.illuminants.d65()
observer = colorio.observers.cie_1931_2()
p = colorio.plot_surface_gamut(
"xyz100", # or colorio.cs.XYZ(100)
observer,
illuminant,
)
p.show()
色域显示为灰色,因为 sRGB 屏幕无论如何都无法显示颜色。
可见色域
| xyy | JzAzBz | 奥克实验室 |
|---|---|---|
与上面相同,但可见颜色的色域达到给定的亮度Y。
import colorio
observer = colorio.observers.cie_1931_2()
colorspace = colorio.cs.XYZ(100)
p = colorio.plot_visible_gamut(colorspace, observer, max_Y1=1)
p.show()
色域显示为灰色,因为 sRGB 屏幕无论如何都无法显示颜色。
对于切片,使用
import colorio
plt = colorio.plot_visible_slice("cielab", lightness=0.5)
plt.show()
颜色渐变
使用 colorio,您可以轻松地可视化任何颜色空间的基本颜色渐变。这可能会使色彩空间中的缺陷变得明显,例如众所周知的 CIELAB 和相关空间的蓝色失真。(与下面的色调线性数据进行比较。)
import colorio
plt = colorio.plot_primary_srgb_gradients("cielab")
plt.show()
| CIELAB | DIN99 | OKLAB |
实验数据
colorio 包含许多实验数据集,其中一些可用于评估色彩空间的某些属性。大多数数据集也可以可视化。
颜色差异
| xyy | CIELAB | CAM16 |
来自MacAdam (1974)的色差数据。上图显示了亮度相当的 43 种颜色对。如果面对的线存根在一点相遇,则数据完美匹配。
import colorio
data = colorio.data.MacAdam1974()
cs = colorio.cs.CIELAB
plt = data.plot(cs)
plt.show()
print(colorio.data.MacAdam1974().stress(cs))
24.54774029343344
同样适用于
colorio.data.BfdP()
colorio.data.Leeds()
colorio.data.RitDupont()
colorio.data.Witt()
colorio.data.COMBVD() # a weighted combination of the above
孟塞尔
| xyy | CIELAB | CAM16 |
孟塞尔颜色数据可视化
import colorio
cs = colorio.cs.CIELUV
plt = colorio.data.Munsell().plot(cs, V=5)
plt.show()
要以 xyY 格式检索 Munsell 数据,请使用
import colorio
munsell = colorio.data.Munsell()
# munsell.h
# munsell.V
# munsell.C
# munsell.xyy
椭圆
麦克亚当椭圆 (1942)
| xyY(在 Y=0.4 时) | CIELAB(L=50) | CAM16(在 L=50 时) |
著名的麦克亚当椭圆(来自这篇文章)可以用
import colorio
cs = colorio.cs.CIELUV
plt = colorio.data.MacAdam1942(50.0).plot(cs)
plt.show()
颜色空间与数据匹配得越好,椭圆越接近相同大小的圆。
罗-里格椭圆
| xyy | CIELAB | CAM16 |
洛里格也是如此。
import colorio
# xyy = colorio.cs.XYY(100)
# colorio.data.LuoRigg(8).show(xyy, 0.4)
# colorio.data.LuoRigg(8).savefig("luo-rigg-xyy.png", xyy, 0.4)
cieluv = colorio.cs.CIELUV()
plt = colorio.data.LuoRigg(8).plot(cieluv, 50)
plt.show()
色调线性
艾伯纳-仙童
| xyy | CIELAB | CAM16 |
例如
import colorio
colorspace = colorio.cs.JzAzBz
plt = colorio.data.EbnerFairchild().plot(colorspace)
plt.show()
显示了来自Ebner-Fairchild 实验在某些颜色空间的色调平面中的恒定色调数据。(理想情况下,一组中的所有颜色都排成一行。)
洪伯恩斯
同样对于Hung-Berns:
| xyy | CIELAB | CAM16 |
注意 CIELAB 和 CAM16 中的深蓝色失真。
import colorio
colorspace = colorio.cs.JzAzBz
plt = colorio.data.HungBerns().plot(colorspace)
plt.show()
肖等人。
肖等人也是如此。:
| xyy | CIELAB | CAM16 |
import colorio
colorspace = colorio.cs.CIELAB
plt = colorio.data.Xiao().plot(colorspace)
plt.show()
亮度
仙童陈
| xyy | CIELAB | CAM16 |
Fairchild-Chen的亮度实验。
import colorio
cs = colorio.cs.CIELAB
plt = colorio.data.FairchildChen("SL2").plot(cs)
plt.show()