El mejor algoritmo para unir colores.

Tengo una matriz de alrededor de 200 colores en formato RGB. Quiero escribir un progtwig que tome cualquier color RGB e intente hacer coincidir un color de la matriz que sea más “similar”.

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?

Convierta todos los colores al espacio de color CIE Lab y calcule la distancia en ese espacio

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

Los colores con el deltaE más bajo son los más perceptualmente similares entre sí.

No, no necesitas redes neuronales aquí! Simplemente considere un valor de color HSL como un vector y defina una función de módulo ponderado para el vector de esta 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 

Sugeriría que use a = b = 0.5 yc = 1

Finalmente, descubra el rango que tomaría su módulo y defina colores similares para que sean aquellos que tienen sus módulos muy cerca el uno del otro (digamos 5%)

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

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

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

La manera más rápida que he logrado esto es agregar los colores a un octárbol y luego, al igual que con la cuantización, utiliza cada bit para guiarlo al nodo secundario más profundo. Una vez que no puede profundizar más, o está en el nivel más profundo (el bit más bajo), en cuyo caso ha tocado el color exacto, o el siguiente nodo secundario que necesita no existe, en ese punto simplemente necesita al niño con la broca más cercana a la broca que está buscando y ese es su color más cercano. Es muchísimo más rápido que convertir todo a HSL y viceversa, o calcular cada distancia euclidiana.

Aquí está mi código en CodeProject: https://www.codeproject.com/tips/1046574/octtree-based-nearest-color-search