我遇到了一种将颜色从 RGB 转换为 HSI 的相当三角函数式的实现。具体来说,就是从 RGB 转换为“由双锥体给出的 HSI 颜色空间”,我猜想这是HSL 的双六锥体模型的另一个名称。
作者描述了“他们首选的变换”RGB-->HSI 的方程式,我已在 Python 中将其实现如下。没有给出反向变换,HSI-->RGB。
def rgb_to_hsi(r, g, b):
# r, g, b in [0..1]
x = min(r, g, b)
y = max(r, g, b)
I = (x + y) / 2.0
S = y - x
c1 = r - (g + b) / 2.0
c2 = (np.sqrt(3) * (b - g)) / 2.0
H = np.arctan2(c2, c1)
H = np.mod(-H, 2 * pi) # re-range to [0..2PI], rotating from red at 0 to green at 2/3PI, etc.
return [H, S, I] # H in [0..2PI], S in [0..1], I in [0..1]
该算法和我的实现似乎都是正确的,并提供符合该图的结果(即红色(rgb(1,0,0))给出[0.0, 1, 0.5]
):
但我无法找到或推导出这种转换的逆向工作方法hsi_to_rgb()
。
我尝试了几种实现方式,但它们倾向于映射hsi(0.0, 1, 0.5)
到rgb(0.5, 0, 0)
(半亮度的红色,而不是全亮度的红色)。
我怀疑这是因为大多数 HSL 实现使用HSL 的圆柱模型,而不是双圆锥模型——这是真的吗?
无论哪种方式,将 HSL 双锥模型转换为 rgb 的有效算法(理想情况下是三角算法)是什么?
干得好: