usando saber que pantone online illustrator hexadecimal estoy como color buscar sql algorithm colors

sql - saber - hex color palette



Dado un valor RGB, ¿cuál sería la mejor manera de encontrar la coincidencia más cercana en la base de datos? (8)

Tengo un valor rgb y si no existe en la tabla de colores de mi base de datos, necesito encontrar el color más cercano. Estaba pensando en comparar todos los valores y encontrar la diferencia (en rojo, verde y azul) y luego tomar el promedio. La desviación media más baja debe ser el color más cercano. Me parece que debería haber una mejor manera. ¿Algunas ideas?


Al mirar la página de Wikipedia sobre la diferencia de color , la idea es tratar los colores RGB como puntos en tres dimensiones. La diferencia entre dos colores es la misma que la distancia entre dos puntos:

difference = sqrt((red1 - red2)^2 + (green1 - green2)^2 + (blue1 - blue2)^2)


Calcula tanto el promedio como la distancia de esta manera:

(r + g + b) / 3 = average (r - average) + (g - average) + (b - average) = distance

Esto debería darle una buena idea del valor más cercano.


Considere un color como un vector en el espacio tridimensional, luego puede calcular fácilmente la diferencia mediante el uso de pitágoras 3d:

d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)

Sin embargo, tenga en cuenta que debido a que los colores están sujetos a la interpretación de los ojos no tan perfectos, es posible que desee ajustar los colores para evitar que tengan la misma importancia.

Por ejemplo, utilizando un enfoque ponderado típico :

d = sqrt(((r2-r1)*0.3)^2 + ((g2-g1)*0.59)^2 + ((b2-b1)*0.11)^2)

Como los ojos son más sensibles al verde y menos sensibles al azul, dos colores que difieren solo en el componente azul deben tener una diferencia numérica mayor para que se considere "más diferente" que uno que sea la misma diferencia numérica en el componente verde.

También hay varias formas de optimizar este cálculo. Por ejemplo, como no está realmente interesado en el valor real de d , puede prescindir de la raíz cuadrada:

d = ((r2-r1)*0.30)^2 + ((g2-g1)*0.59)^2 + ((b2-b1)*0.11)^2

Tenga en cuenta que en muchos lenguajes de programación basados ​​en la sintaxis C (como C #), ^ no significa "aumentar la potencia de", sino más bien "binario exclusivo o".

Entonces, si esto fuera C #, Math.Pow para calcular esa parte, o simplemente expandir y hacer la multiplicación.

Agregado : a juzgar por la página sobre la diferencia de color en Wikipedia , hay varios estándares que tratan de manejar las diferencias de percepción. Por ejemplo, el llamado CIE94 utiliza una fórmula diferente, en el modelo de color L*C*h que parece que vale la pena analizarlo, pero depende de la precisión con la que lo desee.


Deja que la base de datos lo haga por ti:

select top 1 c.r, c.b, c.g from color c order by (square(c.r - @r) + square(c.g - @g) + square(c.b - @b))

Donde @r , @g y @b son los valores r, g, b del color que está buscando (sintaxis de parámetros de SQL Server, ya que no especificó una base de datos). Tenga en cuenta que esto todavía tendrá que hacer un escaneo de tabla ya que el order by tiene una llamada de función en él.

Tenga en cuenta que la llamada de la raíz cuadrada adicional no es realmente necesaria, ya que es una función monotónica. No es que probablemente importe mucho, pero aún así.


La difference = sqrt(sqr(red1 - red2) + sqr(green1 - green2) + sqr(blue1 - blue2)) distancia euclidiana difference = sqrt(sqr(red1 - red2) + sqr(green1 - green2) + sqr(blue1 - blue2)) es la forma estándar de determinar la similitud de dos colores.

Sin embargo, si tiene sus colores en una lista simple, para encontrar el color más cercano es necesario calcular la distancia desde el nuevo color con cada color de la lista. Esta es una operación O (n).

El sqrt() es una operación costosa, y si solo está comparando dos distancias, simplemente puede omitir el sqrt() .

Si tiene una paleta de colores muy grande, es potencialmente más rápido organizar los colores en un árbol kd (o una de las alternatives ) para reducir la cantidad de diferencias que requieren la computación.


La comparación de una muestra de color con toda la lista de colores cada vez no es óptima. Esto se puede optimizar al colocar los colores en la lista de colores en un árbol de búsqueda. Si está comparando la muestra de color en su valor Rojo, Verde y Azul (RGB), colocaría los colores en la lista de colores en un árbol de búsqueda tridimensional. El árbol de búsqueda podría crearse una vez y guardarse en un archivo (json, xml) o en una base de datos. Esto puede valer la pena si la velocidad es importante, por ejemplo, hay muchos puntos para comparar.


Lo siguiente hace exactamente lo que usted describe:

select (abs(my_R - t.r) + abs(my_G - t.g) + abs(my_B - t.b)) / 3 as difference, t.* from RGBtable t order by difference desc;

Sin embargo, puede obtener mejores resultados con algo que no es lineal. En el enfoque de "tomar los promedios", si el color objetivo es (25, 25, 25), el color (45, 25, 25) estaría más cerca que (35, 35, 35). Sin embargo, apuesto a que el segundo realmente se vería más cerca, ya que también sería gris.

Algunas ideas vienen a la mente: puede intentar cuadrar las diferencias antes de promediarlas. O podría hacer algo complicado para encontrar el color con la relación más cercana entre los diferentes valores. Encontrar las relaciones más cercanas lo acercará al tono correcto, pero no tendrá en cuenta la saturación (si recuerdo los términos correctos ...)


Un paso mejor que el promedio es la raíz cuadrada más cercana:

((delta red)^2 + (delta green)^2 + (delta blue)^2)^0.5

Esto minimiza la distancia en el espacio de color 3D.

Como una raíz está aumentando estrictamente, puedes buscar el máximo del cuadrado en su lugar. La forma en que expreses esto en SQL dependerá de qué RDBMS estés usando.