online algorithms algorithm colors pseudocode perception

algorithms - Cómo generar n colores diferentes para cualquier número natural n?



quicksort visualization (6)

100 es una gran cantidad de colores, pero puede hacerlo distribuyéndolos tan poco como sea posible en el espacio HSB o HSL; hacerlo en RGB es probablemente difícil.

Por ejemplo, puede decidir usar 10 tonos diferentes, 4 niveles de saturación diferentes y 3 configuraciones de brillo diferentes, que le darían hasta 120 colores. Deberá elegir cuidadosamente los valores de saturación y brillo; los ojos humanos son sensores complicados y confusos. Si trata el espacio de color como un cono, probablemente querrá una cantidad diferente de tonos en cada nivel de luminosidad / saturación.

Aquí hay un enlace a la entrada de wikipedia en HSB .

Esta pregunta ya tiene una respuesta aquí:

Diga n = 100; ¿Cómo puedo generar 100 colores visualmente distintos? ¿Esto es matemáticamente posible?


Desea convertir a HSL y luego iterar a través de los valores del tono (H) mientras mantiene los otros 2 valores constantes.

Para cada valor, convierte de HSL a RGB .

Vea mis respuestas here y here .

Si su N es muy grande y, por lo tanto, los colores NO son visualmente distintos, en ese momento podría iterar sobre todos los mismos matices y cambiar los otros componentes para variar la saturación o luminosidad. Así que, básicamente, podría tener una cantidad máxima de valores de tono para usar, y una vez que se golpea, puede comenzar de nuevo con una saturación o luminosidad diferente.


Editar:

No tengo ninguna experiencia en esta área y mis habilidades matemáticas son bastante promedio. Pero tengo la opinión de que la solución a este problema es más compleja e interesante de lo que sugieren muchas respuestas aquí, ya que intenté hacer algo similar recientemente y no encontré una solución.

Diferencia de color

La percepción del color es, por supuesto, subjetiva, pero existe un acuerdo significativo entre los humanos. Por ejemplo, todos podemos estar de acuerdo en que el rojo, el verde y el azul son colores muy diferentes, e incluso las personas daltónicas concuerdan en que el blanco y el negro son muy diferentes.

RGB

La representación más común de color en los sistemas informáticos es el vector (r, g, b) que sugiere una función de distancia simple como

Permite establecer el rango para r , g y b en [0, 1] y ver cómo funciona esto:

  1. Rojo (1, 0, 0) y rojo (1, 0, 0) tiene la distancia de 0 , lo que debería ser obvio
  2. Rojo (1, 0, 0) y amarillo (1, 1, 0) tiene la distancia de 1 , que es más pequeña que la distancia de
  3. Rojo (1, 0, 0) y azul (0, 0, 1) que es sqrt (2) , lo cual es plausible

Hasta aquí todo bien. Sin embargo, el problema es que el azul y el rojo tienen la misma distancia 1 del negro (0, 0, 0) , pero al mirar la imagen, esto no parece ser cierto:

También el amarillo (1, 1, 0) y el magenta (1, 0, 1) tienen la misma distancia 1 del blanco (1, 1, 1) , lo que tampoco parece tener sentido:

HSL y HSV

Creo que es seguro suponer que las métricas analógicas para los esquemas de color HSL y HSV tienen los mismos problemas. Estos esquemas de color no están diseñados para comparar el color.

CIEDE2000

Afortunadamente, hay científicos que ya están tratando de encontrar una buena forma de comparar colores. CIEDE2000 algunos métodos elaborados, el último de los CIEDE2000 es CIEDE2000

(la fórmula completa descrita en el artículo es enorme )

Esta métrica tiene en cuenta la percepción humana, como el hecho de que parece que no podemos distinguir muy bien los tonos azules. Entonces diría que usamos esto como nuestra función de diferencia de color.

El algoritmo de selección de color

Solución ingenua

Algunas respuestas sugirieron el siguiente algoritmo

colors = [] for n in range(n): success=False while not success: new_color = random_color() for color in colors: if distance(color, new_color)>far_enough: colors.append(new_color) success = True break

Este algoritmo tiene algunos problemas:

  1. El espaciado de los colores no es óptimo. Si imaginamos que los colores son como los números en una línea, tres números estarían espaciados de manera óptima así:

    | a ----- b ----- c |

    Empacar un número adicional allí sin mover a, byc es claramente peor que realinear todos los colores.

  2. El algoritmo no está garantizado para terminar . ¿Qué sucede si no hay un color lo suficientemente amplio como para formar los colores existentes en la lista? El ciclo continuará por siempre

Solución adecuada

Bueno ... no tengo uno.


No es una respuesta a su pregunta, pero si n tiene un valor máximo y su aplicación lo permite, puede usar una lista predefinida de colores como esta:

http://en.wikipedia.org/wiki/List_of_colors

Una ventaja es que puede mostrar un nombre de color legible humanamente en una información sobre herramientas para personas con daltonismo.


Para empezar, no use el espacio RGB; es difícil encontrar un peor espacio de color para este problema. (Dependiendo de si está usando los colores para mostrar o imprimir, tiene un gran número de colores indistinguibles cerca del negro o casi blanco).

Si usa espacio de laboratorio, existen modelos de color perceptual (CIE 1996 y CIE 2000) para medir la cercanía visual de los colores (para imprimir y visualizar, respectivamente).

No dice si va a calcular los colores una vez y almacenar el resultado, o si necesitan ser recalculados sobre la marcha (y en ese caso si tiene que ser determinista o no). Obviamente, cualquier discusión sobre la mejor forma de generar el conjunto dependería de eso.

Aunque sugeriría que dividir equitativamente los ejes del espacio de color (digamos en 8) y utilizarlos como puntos iniciales sería mucho más eficiente que cualquier proceso aleatorio. Ciertamente, solo necesita comparar cualquier punto con sus vecinos (y solo si ya están en el conjunto), lo que le ahorrará una gran cantidad de comparaciones.


Sí. Definir distintas es un producto de diferir a un espacio de color, entonces cuando decimos colores máximos distintos, lo que queremos decir es colores que están lo más lejos posible de todos los demás colores. Pero dado que el espacio de color no cambia, la respuesta no va a cambiar. E implementar algo que se ajuste mejor a los ojos humanos y la forma en que los ojos humanos ven el color, como la distancia de color CIE-lab de2000, hace que volver a hacer todos los cálculos sea difícil, pero hace que una lista estática sea fácil. Aquí hay 128 entradas.

private static final String[] indexcolors = new String[]{ "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059", "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87", "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80", "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100", "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F", "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09", "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66", "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C", "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81", "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00", "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700", "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329", "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C", "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800", "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51", "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58" };

Aquí está el primer 256 como una imagen.

(de izquierda a derecha) (arriba a abajo). Es posible que pueda obtener algunos colores más distintos si se asegura de que cada color sea lo más equidistante posible dentro del espacio de color. Esa tabla de búsqueda selecciona cada color adicional como máximo distinto de todos los colores anteriores en lugar de designar el N al inicio y luego mapear el espacio de color. Así que sí, la fuerza bruta y un algoritmo de resolución de color de alto nivel y usted mismo está configurado para hacer el mismo conjunto de colores. En el transcurso de un día más o menos.