sRGB 恒亮度条纹
sRGB constant luminance stripe
我想创建一个具有恒定感知亮度的色谱。
这是我目前的尝试 (here's the codesandbox):
代码
- 通过 8 位 RGB 值增加色调和恒定(和不相关的)亮度,
- 将三元组转换为相应的线性值 (un-"gamma", code for that taken from here),
- 通过与 sRGB 亮度值形成标量积来计算亮度,
- 通过除以亮度对颜色进行标准化,最后
- 转换回 8 位 RGB(重新“伽玛”)。
正如我在图片中注释的那样,如果你问我的话,从底部开始的第二个条纹是相当亮的蓝色。现在这可能是因为
- 我的屏幕不支持 sRGB(尽管我的 phone 同意),
- 我的眼球超出了人类的平均水平,
- sRGB 亮度值最初不反映亮度感知
我认为更有可能是我犯了一些错误或者没有理解这里的某些内容。
我稍微调整了 sRGB 亮度值以获得接近我预期的底部条纹(虽然蓝色可能仍然有点亮)。
所以我的问题是:
- 你们主观上在屏幕上看到了什么?您认为底部两条条纹中的哪一条更接近感知恒定亮度?
- 假设我不是唯一一个,这是怎么回事?
RGB 色彩空间在感知上不是统一的空间。生成感知均匀的色调条纹需要使用感知均匀的色彩空间或颜色外观模型,例如 ICtCp 或 CAM16.
使用Colour,可以实现如下:
import colour
import numpy as np
def colour_stripe(S=1, samples=360):
H = np.linspace(0, 1, samples)
HSV = colour.utilities.tstack([H, np.ones(samples) * S, np.ones(samples)])
RGB = colour.HSV_to_RGB(HSV)
return RGB[np.newaxis, ...]
RGB = np.resize(colour_stripe(), [36, 360, 3])
colour.plotting.plot_image(colour.cctf_encoding(RGB * 0.5));
CAM16 = colour.convert(RGB, 'RGB', 'CAM16')
CAM16_UL = colour.CAM16_Specification(
np.full(CAM16.J.shape, 0.5), CAM16.C, CAM16.h)
RGB_PU = colour.convert(CAM16_UL, 'CAM16', 'RGB')
colour.plotting.plot_image(colour.cctf_encoding(RGB_PU));
请记住,这里的假设是 sRGB 显示校准和观看条件。
这取决于您希望“感知亮度”建模的内容。当您考虑 Helmholtz-Kohlrausch 效果时,不是由 CAM02 建模的,您应该看到您需要决定一个模型或您希望模型适合的一系列颜色外观效果。
https://en.wikipedia.org/wiki/Helmholtz%E2%80%93Kohlrausch_effect
我想创建一个具有恒定感知亮度的色谱。
这是我目前的尝试 (here's the codesandbox):
代码
- 通过 8 位 RGB 值增加色调和恒定(和不相关的)亮度,
- 将三元组转换为相应的线性值 (un-"gamma", code for that taken from here),
- 通过与 sRGB 亮度值形成标量积来计算亮度,
- 通过除以亮度对颜色进行标准化,最后
- 转换回 8 位 RGB(重新“伽玛”)。
正如我在图片中注释的那样,如果你问我的话,从底部开始的第二个条纹是相当亮的蓝色。现在这可能是因为
- 我的屏幕不支持 sRGB(尽管我的 phone 同意),
- 我的眼球超出了人类的平均水平,
- sRGB 亮度值最初不反映亮度感知
我认为更有可能是我犯了一些错误或者没有理解这里的某些内容。
我稍微调整了 sRGB 亮度值以获得接近我预期的底部条纹(虽然蓝色可能仍然有点亮)。
所以我的问题是:
- 你们主观上在屏幕上看到了什么?您认为底部两条条纹中的哪一条更接近感知恒定亮度?
- 假设我不是唯一一个,这是怎么回事?
RGB 色彩空间在感知上不是统一的空间。生成感知均匀的色调条纹需要使用感知均匀的色彩空间或颜色外观模型,例如 ICtCp 或 CAM16.
使用Colour,可以实现如下:
import colour
import numpy as np
def colour_stripe(S=1, samples=360):
H = np.linspace(0, 1, samples)
HSV = colour.utilities.tstack([H, np.ones(samples) * S, np.ones(samples)])
RGB = colour.HSV_to_RGB(HSV)
return RGB[np.newaxis, ...]
RGB = np.resize(colour_stripe(), [36, 360, 3])
colour.plotting.plot_image(colour.cctf_encoding(RGB * 0.5));
CAM16 = colour.convert(RGB, 'RGB', 'CAM16')
CAM16_UL = colour.CAM16_Specification(
np.full(CAM16.J.shape, 0.5), CAM16.C, CAM16.h)
RGB_PU = colour.convert(CAM16_UL, 'CAM16', 'RGB')
colour.plotting.plot_image(colour.cctf_encoding(RGB_PU));
请记住,这里的假设是 sRGB 显示校准和观看条件。
这取决于您希望“感知亮度”建模的内容。当您考虑 Helmholtz-Kohlrausch 效果时,不是由 CAM02 建模的,您应该看到您需要决定一个模型或您希望模型适合的一系列颜色外观效果。
https://en.wikipedia.org/wiki/Helmholtz%E2%80%93Kohlrausch_effect