Eu me deparei com uma implementação bastante trigonométrica para converter cores de RGB para HSI. Em particular, converter de RGB para o "espaço de cores HSI, dado por um cone duplo ", que eu presumo ser outro nome para o modelo bi-hexcone de HSL .
Os autores descrevem equações para "sua escolha preferida de transformação" de RGB-->HSI, que implementei em Python como abaixo. Nada é dado a transformação reversa, 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]
Tanto o algoritmo quanto minha implementação parecem estar corretos e fornecem resultados que estão de acordo com este diagrama (ou seja, red ( rgb(1,0,0) ) fornece [0.0, 1, 0.5]
):
Mas não consigo encontrar ou derivar um inverso funcional dessa conversão – um hsi_to_rgb()
método.
Tentei algumas implementações, mas elas tendem a mapear hsi(0.0, 1, 0.5)
( rgb(0.5, 0, 0)
vermelho com metade do brilho, em vez de brilho total).
Suspeito que isso ocorra porque a maioria das implementações de HSL usa o modelo cilíndrico de HSL, e não o modelo de cone duplo – isso é verdade?
De qualquer forma, qual é um algoritmo funcional (e idealmente trigonométrico) para conversões do modelo de cone duplo HSL para RGB?
Aqui você vai: