¿Cómo puedo saber el color básico al que más se acerca un código hexadecimal?

Los siguientes valores hexadecimales probablemente serían considerados "rojos" por el ojo del profano:

ingrese la descripción de la imagen aquí

¿Hay alguna manera, usando solo el código hexadecimal, de determinar a qué color básico se parece más un color dado? Me gustaría poder hacer esto también para rojo, azul, verde, amarillo, verde, morado, marrón, rosa, negro y blanco.

Le sugiero que lea la encuesta de color de xkcd y comprenderá que no solo es difícil sino imposible lograr que la gente esté de acuerdo.
Esta pregunta ya se hizo en el lado hermano "code golf". Pueden mostrar un nombre legible por humanos para un código de color. Pero tenga en cuenta que este es un concurso de popularidad, por lo que la gente va a mover todo tipo de influencias extrañas para obtener efectos geniales. Es posible que no desee copiar su implementación, pero creo que lo coloca en el camino correcto.

Respuestas (5)

Tendrá que definir qué significa 'más cercano' y cuáles son sus colores de destino. Se puede pensar en el color como un cubo, un cilindro y muchas otras formas, y su objetivo es esencialmente encontrar el color más cercano dentro de esa forma tridimensional.

Si se restringe solo a los colores primarios, la forma más sencilla sería convertir sus colores al espacio de color HSV .

Agregar rosa lo hace un poco más complicado, porque en HSV Pink y red tendrían el mismo tono. Ahora tendría que tener en cuenta la luminancia/valor. Podría hacer un proceso de dos etapas en el que solo compare la luminancia entre dos colores objetivo del mismo tono.

Se realizaría una prueba similar para el blanco y el negro. En HSV, los blancos y los negros pueden tener tonalidades que varían extrañamente, por lo que querrás ignorar la tonalidad cuando pruebes eso.

Dicho todo esto, es posible que pueda sacar la raíz cuadrada de las sumas de las diferencias en los canales RGB entre su muestra y un objetivo, usar eso como una medida de distancia, comparar todos sus objetivos y seleccionar el que tenga la distancia mínima. . Calcular las distancias en diferentes espacios de color puede producir diferentes características de resultados.

Si entiendo la pregunta, diría "Por supuesto". Simplemente necesita familiarizarse más con el maleficio. Pero esto solo funciona hasta ahora.

Sabes que FF 00 00 es 100% rojo y cero verde y azul. A medida que disminuye la intensidad del FF, la sombra se oscurece.

El color se entiende mejor que los números de la misma manera que un gráfico funciona mejor que una columna de números. Entendemos intelectualmente lo que significa un número hexadecimal o una tabla de números, pero nuestras mentes captan los colores y los gráficos en otro nivel.

La verdadera pregunta sería cuán necesario sería conocer el código hexadecimal más allá de R - G - B y más oscuro y más claro. Es más rápido y más fácil usar un selector de color.

No creo que esto sea posible. Debería definir qué significa "rojo, azul, verde, morado, marrón, rosa". Porque significan cosas diferentes para cada persona a la que le preguntarías.

Las únicas constantes allí son el blanco y el negro. El negro es siempre negro. El blanco es siempre blanco. No hay lugar para una interpretación diferente de lo que es "negro".

Todos los demás colores tienen matices y las sombras nunca son una constante. Por lo tanto, no puede definir una constante universal cuando no la hay.

Puede elegir las constantes que desee para esos colores. Pero esos pueden ser completamente inexactos para cualquier otra persona . Puede que veas "rojo" como siempre #ff0000... Personalmente creo que #aa0000 es un rojo mejor...

Simplemente no puede determinar definiciones universales de términos inherentemente ambiguos.

Seguro que hay espacio para diferentes interpretaciones del blanco y negro, como con cualquier otro color. Al igual que creo que todos estarán de acuerdo en que #FF0000 es rojo, todos estarán de acuerdo en #000000 y #FFFFFF. Pero, ¿qué pasa con #0D0D0D? ¿Es negro o simplemente gris oscuro?
En hexadecimal... cualquier cosa que no sea #000000 y #FFFFFF es un tinte de gris o un color. Incluso si es casi imperceptible visualmente en blanco y negro (que en realidad es el resultado de la calibración del monitor más que nada). -- > :) ¿Puedes ver el cuadrado #0D0D0D contra el respaldo #000000?
Sí, si nos guiamos por definiciones puramente numéricas o matemáticas. Cualquier cosa que no sea #FF0000 tampoco es roja. El punto es que se trata de la percepción del ojo humano , y así como identificamos mucho más que solo #FF0000 como 'rojo', también identificamos mucho más que solo #000000 y #FFFFFF como 'negro' y 'blanco', y la mayoría de las personas tendrán diferentes cortes de tinte para ellos. No es que solo haya dos constantes, sino que no hay constantes para algo como esto, ni siquiera blanco o negro.
Puedo ver ese punto. Pero siento que los valores uniformes hexadecimales son algo más constantes. Principalmente porque cuando los 6 dígitos son iguales... es negro, blanco o gris. Puede argumentar que 0D0D0D es un "negro", pero no lo es porque los dígitos hexadecimales no son los mismos. Es por eso que afirmo que el blanco y el negro son constantes. Pero reconozco que algunos pueden llamar "negro" a un color que en realidad no es negro. Sin embargo, generalmente no puede transponer ese sentimiento a otros colores. Todo el mundo está de acuerdo en que rojo es rojo... pero nunca estarán de acuerdo con la definición hexadecimal de rojo.
Sin embargo, veo absolutamente tu punto.
Pero eso es exactamente lo mismo para otros colores. También hay una sola definición hexadecimal de rojo, y es #FF0000. El otro que mencionaste, por ejemplo, #AA0000, no es “Red” sino “Free Speech Red” (¡qué nombre!). Editar: Oh, veo que eliminaste tu último comentario. Estoy de acuerdo con la parte esencial de su respuesta que dice que esto no es posible: mi único problema fue con la afirmación de que existen constantes totalmente predecibles. :-)
Por eso empiezo mi respuesta "No creo que esto sea posible" :)

No, porque los ojos humanos varían

Dado que está preguntando cómo se percibiría el color (en lugar de su valor matemático), la respuesta es que esto sería demasiado problemático, ya que las personas (incluso aquellas con una visión del color "normal") perciben los colores de manera diferente.

Prueba esta prueba . Esta prueba y otras similares muestran que lo que las personas perciben como naranja y amarillo no tiene una "línea clara": la línea entre el amarillo y el naranja es diferente, no como una cuestión de gusto, sino fisiológicamente, para diferentes personas.

Prueba interesante. Acerté 7/7, pero me tomó mucho tiempo encontrar los bordes del n.° 6, y no pude ver la más mínima diferencia en el último: puras conjeturas.

Encontré una respuesta relacionada aquí . Usando los colores de la quinta fila de esta tabla de colores , y los nombres de este sitio web "Nombra ese color" , y el algoritmo de la respuesta anterior, escribí el siguiente script, hexcode-rounding.php:

<?php

function distance_3d($rgb_1, $rgb_2) {
  return sqrt(pow($rgb_1[0] - $rgb_2[0], 2) +
              pow($rgb_1[1] - $rgb_2[1], 2) +
              pow($rgb_1[2] - $rgb_2[2], 2));
}

if (isset($_POST["hexcode"])) {
  $hexcode = $_POST["hexcode"];
  $r = hexdec(substr($hexcode, 0, 2));
  $g = hexdec(substr($hexcode, 2, 2));
  $b = hexdec(substr($hexcode, 4, 2));
  $rgb = [$r, $g, $b];

  $basic_colors = [
    'black' => [0, 0, 0],
    'white' => [255, 255, 255],
    'red' => [255, 0, 0],
    'orange' => [255, 128, 0],
    'yellow' => [255, 255, 0],
    'chartreuse' => [128, 255, 0],
    'green' => [0, 255, 0],
    'spring green' => [0, 255, 128],
    'cyan' => [0, 255, 255],
    'azure' => [0, 128, 255],
    'blue' => [0, 0, 255],
  ];

  foreach ($basic_colors as $color_name => $color_rgb) {
    echo "<p>$color_name: " . distance_3d($rgb, $color_rgb) . "</p>";
  }

} else {
?>

<form action="hexcode-rounding.php" method="post">
<p>Hex code: <input type="text" name="hexcode" /><br />
<p><input type="submit" value="Round!"></p>
</form>

<?php

}

Imprime una lista que muestra qué tan cerca está el color dado de cada color "básico" en el espacio RGB tridimensional. El valor más bajo de la lista es aquel al que el color se acerca más. En particular, faltan el púrpura, el marrón y el rosa, pero no sería difícil agregarlos.

Este enfoque tiene algunos problemas porque trata las tres dimensiones de la distancia como igualmente importantes. Dado que la visión humana es logarítmica (no lineal) y que somos dos veces más sensibles al verde que al rojo o al azul, terminará con algunas asignaciones extrañas. Sugeriría comenzar con el espacio de color YUV y trabajar desde allí.
@Bevan, ¿por qué YUV en lugar de HCL como se sugiere en la pregunta SO a la que hice referencia?