color java javascript algorithm colors

java - color - hsl js



Algoritmo de lógica de color (6)

Aquí está el algoritmo de pgras en Java:

public double ColourDistance(Color c1, Color c2) { double rmean = ( c1.getRed() + c2.getRed() )/2; int r = c1.getRed() - c2.getRed(); int g = c1.getGreen() - c2.getGreen(); int b = c1.getBlue() - c2.getBlue(); double weightR = 2 + rmean/256; double weightG = 4.0; double weightB = 2 + (255-rmean)/256; return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b); }

Estamos construyendo una aplicación deportiva y nos gustaría incorporar los colores del equipo en varias partes de la aplicación.

Ahora cada equipo puede ser representado usando varios colores diferentes.

Lo que me gustaría hacer es realizar una verificación para verificar si los dos colores del equipo están dentro de un cierto rango entre sí, para que no muestre dos colores similares.

Entonces, si el color primario del equipo del equipo 1 tiene un valor de rgb (255,0,0) (o # FF0000), y el color primario del equipo 2 es similar, digamos rgb (250,0,0), entonces elegiríamos un color diferente. Color para uno de los equipos.

Si es posible, ¿qué enfoque podría tomar para realizar la verificación?

Gracias


Aquí hay una explicación teórica.

Y el algo en C:

typedef struct { unsigned char r, g, b; } RGB; double ColourDistance(RGB e1, RGB e2) { long rmean = ( (long)e1.r + (long)e2.r ) / 2; long r = (long)e1.r - (long)e2.r; long g = (long)e1.g - (long)e2.g; long b = (long)e1.b - (long)e2.b; return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8)); }


Desde el punto de vista de un algoritmo, esto es bastante simple. Cada color representa un punto en un espacio 3D, y la diferencia entre los colores es la distancia entre esos puntos.

Presumiblemente, el punto aquí es asegurar que los colores sean visiblemente diferentes. Si ese es el caso, decidir la distancia mínima probablemente será bastante difícil. El problema es que (al menos para las personas con visión normal) algunas diferencias son más fáciles de ver que otras. Por ejemplo, la mayoría de las personas son más sensibles a las pequeñas diferencias en los tonos de verde que a los cambios igualmente pequeños en los tonos de rojo o azul. Hay algoritmos para tener esto en cuenta, pero se basan en la visión humana promedio, por lo que no se garantiza que ninguno de ellos sea exactamente correcto para ninguna persona.

Solo por diversión, es posible que desee echar un vistazo a la prueba de visión de color en línea de X-rite .


La mayoría de las respuestas para esta pregunta sugerirán calcular la distancia entre dos colores al asignar los valores RGB a un espacio 3D. El problema con esta técnica es que dos colores con tonalidades similares, pero diferentes niveles de saturación o brillo pueden proyectarse más lejos uno del otro en el espacio 3D RGB que dos colores con diferentes tonalidades, pero niveles muy similares de saturación y brillo. En otras palabras, un azul y un verde pueden estar más cerca en el espacio 3D RGB que los dos tonos de un rojo. En esta aplicación, al garantizar que los colores del equipo difieran, las diferencias de matiz deberían pesar mucho más que el brillo y la saturación.

Así que convertiría la asignación de colores de RGB a niveles de matiz, saturación y brillo, y luego verificaría solo los valores de matiz para una distancia suficiente.

Wikipedia tiene una explicación para convertir RGB a HSV. LiteratePrograms tiene algunos ejemplos de código.


Yo usaría la distancia 3d entre dos colores donde x, y, z son valores R, G, B.

Echa un vistazo a esta biblioteca de Perl:

http://metacpan.org/pod/Color::Similarity::RGB

Esto es fácil de implementar usted mismo.

Solo asegúrese de que (R1-R2) ^ 2 + (G1-G2) ^ 2 + (B1-B2) ^ 2> = umbral ^ 2