2009-11-05 27 views
27

Tengo una matriz de alrededor de 200 colores en formato RGB. Quiero escribir un programa que tome cualquier color RGB e intente hacer coincidir un color de la matriz que sea más "similar".El mejor algoritmo para unir colores.

Necesito una buena definición para "similar", que es lo más cercano posible a la percepción humana.

También quiero mostrar información sobre la precisión de coincidencia. Por ejemplo, blanco y negro: 100% y para un color similar con un tono ligeramente diferente: -4%.

¿Necesito usar redes neuronales? ¿Hay una alternativa más fácil?

+0

es la pregunta acerca de una sugerencia en cuanto a lo que puede ser una buena función de similitud, o se trata acerca de un algoritmo para encontrar rápidamente el color más similar (s) en el array, en relación con un color dan ? – mjv

+0

Ambos. Si primero necesito alguna definición de similitud antes de poder probar el algoritmo de encajamiento. Creo que "perceptualmente similar" es lo que estaba buscando. –

Respuesta

34

convertir todos los colores a la CIE Lab color space y calcular la distancia en que el espacio

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2) 

colores con el más bajo delta E son los más perceptualmente similares entre sí.

+0

Gracias, eso es exactamente lo que necesito. –

+11

Tenga en cuenta que no necesita hacer el sqrt - sqrt es una función creciente, por lo tanto, este paso es superfluo. – Rooke

+2

Tienes razón, si no haces nada más que ordenar, el cuadrado de la distancia es tan bueno como la distancia misma. Si desea comparar "cómo diferente", déjelo. – hobbs

4

No, no necesita redes neuronales aquí! Basta con tener en cuenta un valor de color HSL un vector y definir una función de módulo ponderado para el vector de la siguiente manera:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1); 

where a,b,c are weights you should decide based on your visual definition of what 
creates a bigger difference in perceived color - a 1% change in Hue or a 1% 
change in Saturation 

Yo sugeriría que utilice a = b = 0,5 y c = 1

Por último, averiguar el Rango de su módulo tomaría y definiría colores similares para ser aquellos que tienen sus módulos muy cerca el uno del otro (digamos 5%)

+2

Esa es una buena alternativa simple. La conversión de RGB para HSL es mucho más simple que la conversión de RGB a Lab. :) – hobbs

+0

Ok, entonces lo intentaré primero. –

+0

Crimson, ¿puede usted? ¿Comprueba las matemáticas en su módulo allí? No creo que esté bien. ¿Quieres algo más como 'a * (H1 - H2) ** 2 +' ..., sí? – hobbs

1

También señalaría el método least squares, simplemente como algo un poco más simple. Es decir, tomas la diferencia de un número, lo cuadras, luego sumas todas estas diferencias al cuadrado.

0

Estaba buscando algo pero no encontré muchas respuestas, decidí crear esta pequeña biblioteca.

https://github.com/sebastienjouhans/c-sharp-colour-utilities

+0

Tenga mucho cuidado al publicar respuestas que promuevan su propio trabajo. Asegúrese de responder la pregunta aquí y solo usar su blog/fuente como respaldo y referencia. En este momento, es probable que se marque como spam. – ChrisF

Cuestiones relacionadas