Algoritmo para generar aleatoriamente una paleta de colores estéticamente agradable [cerrado]

Resuelto Brian Gianforcaro asked hace 16 años • 16 respuestas

Estoy buscando un algoritmo simple para generar una gran cantidad de colores aleatorios y estéticamente agradables. Así que nada de locos colores neón, colores que recuerden a las heces, etc.

Encontré soluciones a este problema, pero se basan en paletas de colores alternativas a RGB. Prefiero usar RGB directo que mapear de un lado a otro. Estas otras soluciones también pueden generar como máximo sólo 32 colores aleatorios agradables.

Cualquier idea sería genial.

Brian Gianforcaro avatar Sep 04 '08 08:09 Brian Gianforcaro
Aceptado

Podrías promediar los valores RGB de colores aleatorios con los de un color constante:

(ejemplo en Java)

public Color generateRandomColor(Color mix) {
  Random random = new Random();
  int red = random.nextInt(256);
  int green = random.nextInt(256);
  int blue = random.nextInt(256);

  // mix the color
  if (mix != null) {
      red = (red + mix.getRed()) / 2;
      green = (green + mix.getGreen()) / 2;
      blue = (blue + mix.getBlue()) / 2;
  }

  Color color = new Color(red, green, blue);
  return color;
}

La mezcla de colores aleatorios con blanco (255, 255, 255) crea pasteles neutros al aumentar la luminosidad y mantener el tono del color original. Estos pasteles generados aleatoriamente suelen combinar bien, especialmente en grandes cantidades.

Aquí hay algunos colores pastel generados usando el método anterior:

Primero

También puedes mezclar el color aleatorio con un pastel constante, lo que da como resultado un conjunto teñido de colores neutros. Por ejemplo, usar un azul claro crea colores como estos:

Segundo

Yendo más allá, podrías agregar heurísticas a tu generador que tengan en cuenta colores complementarios o niveles de sombreado, pero todo depende de la impresión que quieras lograr con tus colores aleatorios.

Algunos recursos adicionales:

  • http://en.wikipedia.org/wiki/Color_theory
  • http://en.wikipedia.org/wiki/Complementary_color
David Crow avatar Sep 04 '2008 06:09 David Crow

Yo usaría una rueda de colores y, dada una posición aleatoria, podría agregar el ángulo dorado (137,5 grados)

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

para conseguir colores diferentes cada vez que no se superpongan.

Al ajustar el brillo de la rueda de colores también se pueden obtener diferentes combinaciones de colores brillantes/oscuros.

Encontré esta publicación de blog que explica muy bien el problema y la solución utilizando la proporción áurea.

http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

ACTUALIZACIÓN: Acabo de encontrar este otro enfoque:

Se llama método RYB (rojo, amarillo, azul) y se describe en este documento:

http://tresreyes.tk/mirror/ryb_TR.pdf

como "Composición de colores inspirada en pintura".

El algoritmo genera los colores y cada nuevo color se elige para maximizar su distancia euclidiana a los previamente seleccionados.

Aquí puedes encontrar una buena implementación en javascript:

http://afriggeri.github.com/RYB/

ACTUALIZACIÓN 2:

Sciences Po Medialb acaba de lanzar una herramienta llamada "I want Hue" que genera paletas de colores para científicos de datos. Usando diferentes espacios de color y generando las paletas usando agrupamiento de k-medias o vectores de fuerza (gráficos de repulsión). Los resultados de esos métodos son muy buenos, muestran la teoría y una implementación en su página web.

http://tools.medialab.sciences-po.fr/iwanthue/index.php

Fgblanch avatar Feb 15 '2011 19:02 Fgblanch

En javascript:

function pastelColors(){
  var r = (Math.round(Math.random()* 127) + 127).toString(16);
  var g = (Math.round(Math.random()* 127) + 127).toString(16);
  var b = (Math.round(Math.random()* 127) + 127).toString(16);
  return '#' + r + g + b;
}

Vi la idea aquí: http://blog.functionalfun.net/2008/07/random-pastel-color-generator.html

motobói avatar Sep 04 '2012 15:09 motobói

Convertir a otra paleta es una forma muy superior de hacerlo. Hay una razón por la que hacen eso: otras paletas son "perceptuales", es decir, juntan colores aparentemente similares y al ajustar una variable se cambia el color de una manera predecible. Nada de eso es cierto para RGB, donde no existe una relación obvia entre colores que "van bien juntos".

Nick Johnson avatar Jun 07 '2009 20:06 Nick Johnson

Tuve éxito al usar TriadMixing y CIE94 para evitar colores similares. La siguiente imagen utiliza colores de entrada rojo, amarillo y blanco. Mira aquí .

// http://devmag.org.za/2012/07/29/how-to-choose-colours-procedurally-algorithms/#:~:text=120%20and%20240.-,7.%20Triad%20Mixing,-This%20algorithm%20takes

public static Color RandomMix(Color color1, Color color2, Color color3, 
   float greyControl)
{
   int randomIndex = random.NextByte() % 3;
   float mixRatio1 =
      (randomIndex == 0) ? random.NextFloat() * greyControl : random.NextFloat();
   float mixRatio2 = 
      (randomIndex == 1) ? random.NextFloat() * greyControl : random.NextFloat();
   float mixRatio3 = 
      (randomIndex == 2) ? random.NextFloat() * greyControl : random.NextFloat();
   float sum = mixRatio1 + mixRatio2 + mixRatio3;

   mixRatio1 /= sum;
   mixRatio2 /= sum;
   mixRatio3 /= sum;

   return Color.FromArgb(
      255,
      (byte)(mixRatio1 * color1.R + mixRatio2 * color2.R + mixRatio3 * color3.R),
      (byte)(mixRatio1 * color1.G + mixRatio2 * color2.G + mixRatio3 * color3.G),
      (byte)(mixRatio1 * color1.B + mixRatio2 * color2.B + mixRatio3 * color3.B));
}

Mezcla de tríadas + CIE94

Moriarty avatar Dec 09 '2016 20:12 Moriarty