¿Cómo se organizan secuencias de colores terminales en grados de color amigables para los humanos?

¿Cómo se organizan secuencias de colores terminales en grados de color amigables para los humanos?

Hice este script para mostrar los colores del terminal, pero no entiendo la disposición de los colores.

Aquí está el guión que es bastante básico. Simplemente incrementa el código de color para la paleta de 256 colores y los organiza en filas de 6.

#!/bin/env python3

def fg(n):
    assert -1 < n < 256, f"{n} value outside (0,255)"
    return f"\x1b[38;5;{n}m"

def bg(n):
    assert -1 < n < 256, f"{n} value outside (0,255)"
    return f"\x1b[48;5;{n}m"
    
RESET = "\x1b[0m"

print("The 1st 16 colors")
for i in range(0,16):
    print(f"{fg(0)}{bg(i)}[{i:03d}]{bg(0)}" , end = RESET)

print("\nthe rest\n")
for i in range(16,255,6):
    for j in range(0,6):
        print(f"{fg(0)}{bg(i + j)}[{i + j:03d}]", end = RESET)
    print()

Lo que genera esta cuadrícula y creo que podría ser mejor.

ingrese la descripción de la imagen aquí

Pero me gustaría saber cómo puedo arreglar esto de una manera más amigable para los humanos. Algo similar a esta cuadrícula a continuación, donde los colores son grados del mismo tono. ¿Existe algún proceso para hacer eso?

ingrese la descripción de la imagen aquí

El objetivo de esto es poder tener una función de gradación de color que pueda aplicarse a la codificación de terminales.

Respuesta1

Según el comentario de @DavidPostill, entendí que estoy mirando capas de un bloque de color RGB. Entonces esta respuesta responde parcialmente a mi propia pregunta. Sin embargo, tuve que seleccionar los valores de cada tono en varias listas, que preferiría encapsular en una función que pudiera tomar 2 colores en el bloque y determinar los tonos intermedios.

Para visualizar el bloque de color, aquí hay un gráfico en el que etiqueté el código de color del terminal correspondiente en cada esquina.

ingrese la descripción de la imagen aquí

Me di cuenta de que dibujar una línea desde cualquier número a cualquier otro número te dará un degradado de color. La esquina opuesta al blanco (231) sería la negra (16).

Al reorganizar la cuadrícula de colores del terminal de esta manera, es más fácil ver que cada capa es una porción del bloque 3D de arriba (yendo de la cara izquierda a la derecha) y ahora es obvio cómo se pueden trazar colores a lo largo y ancho de este bloque aplanado.

ingrese la descripción de la imagen aquí

agregando este código a mi código original:

def print_color_range(name, clist):
    rangelen = len(clist)
    fore = fg(0) # black pen
    for i in range(rangelen):
        code = clist[i]
        back = bg(clist[i])
        print(f"{fore}{back}[{clist[i]:03d}]",  end = RESET)
    print(name)

WHITE_BLACK = [231,188,145,102,59,16]
WHITE_RED_BLACK     = [231,224,217,210,203,196,160,124,88,52,16]
WHITE_BLUE_BLACK    = [231,189,147,105,63,21,20,19,18,17,16]
WHITE_GREEN_BLACK   = [231,194,157,120,83,46,40,34,28,22,16]
WHITE_CYAN_BLACK    = [231,195,159,123,87,51,44,37,30,23,16]
WHITE_MAGENTA_BLACK = [231,225,219,213,207,201,164,127,90,53,16]
WHITE_YELLOW_BLACK = [231,230,229,228,227,226,184,142,100,58,16]
GREYS = [231,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,16]

print_color_range('reds', WHITE_RED_BLACK )
print_color_range('yellows', WHITE_YELLOW_BLACK    )
print_color_range('greens', WHITE_GREEN_BLACK  )
print_color_range('cyans', WHITE_CYAN_BLACK   )
print_color_range('blues', WHITE_BLUE_BLACK   )
print_color_range('magentas', WHITE_MAGENTA_BLACK)
print_color_range('white to black', WHITE_BLACK)
print_color_range('grays', GREYS)

produjo esto

ingrese la descripción de la imagen aquí

información relacionada