我遇到过一种将颜色从 RGB 转换为 HSI 的三角函数实现。特别是,从 RGB 转换为“HSI 颜色空间,由双锥体给出”,我认为这是 HSLbi-hexcone 模型的另一个名称。
作者描述了 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 的工作(理想情况下是三角)算法是什么?
def hsi_to_rgb(H, S, I):
c2 = math.sin(-H)
c1 = math.cos(-H)
# (r,g,b) = A*c1*(1, -.5, -.5) + A*c2*(0, -1, 1) + B*(1,1,1)
r = c1
g = c1*-0.5 - c2
b = c1*-0.5 + c2
# multiply to match S
fac = S/(max(r,g,b)-min(r,g,b))
r *= fac
g *= fac
b *= fac
# add white to match I
x = I - (S / 2.0)
w = x - min(r,g,b)
r += w
g += w
b += w
return [r, g, b]