studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java colors

java - programacion - encontrar colores similares programáticamente



manual de programacion android pdf (12)

Encuentro que los valores de HSL son más fáciles de entender. HSL Color explica cómo funcionan y proporciona las rutinas de conversión. Al igual que la otra respuesta, necesitarás determinar qué significa similar para ti.

Tengo una imagen en búfer en java y quiero registrar qué tan similar es cada píxel a otro en función del valor del color. por lo que los píxeles con colores "similares" tendrán un mayor valor de similitud. por ejemplo, el rojo y el rosa tendrán un valor de similitud de 1000, pero el rojo y el azul tendrán algo así como 300 o menos.

Cómo puedo hacer esto. cuando obtengo el RGB de un píxel de imagen con búfer, devuelve un número entero negativo. No estoy seguro de cómo implementar esto con eso.


Lo más fácil es convertir ambos colores al valor HSV y encontrar la diferencia en los valores H. Cambios mínimos significa que los colores son similares. Depende de usted definir un umbral sin embargo.


Probablemente esté llamando a getRGB () en cada píxel que devuelve el color como 4 8 bits de bytes, el byte alto alfa, el siguiente byte rojo, el siguiente byte verde, el siguiente byte azul. Debes separar los canales. Incluso entonces, la similitud de color en el espacio RGB no es tan grande: puede obtener resultados mucho mejores utilizando el espacio HSL o HSV. Vea aquí el código de conversión.

En otras palabras:

int a = (argb >> 24) & 0xff; int r = (argb >> 16) & 0xff; int g = (argb >> 8) & 0xff; int b = argb & 0xff;

No sé el orden específico de bytes en las imágenes en java, pero creo que es correcto.


Puede obtener los bytes separados de la siguiente manera:

int rgb = bufferedImage.getRGB(x, y); // Returns by default ARGB. int alpha = (rgb >>> 24) & 0xFF; int red = (rgb >>> 16) & 0xFF; int green = (rgb >>> 8) & 0xFF; int blue = (rgb >>> 0) & 0xFF;


Te sugiero que comiences a leer aquí

Fórmulas de diferencia de color si quieres hacer esto bien. Explica las fórmulas de ΔE*ab , ΔE*94 , ΔE*00 y ΔE*CMC para calcular la diferencia de color.


lo probé el valor HSL / HSV definitivamente no es útil. por ejemplo:

  • todos los colores con L = 0 son ''negros'' (RGB 000000), aunque su diferencia de HSL puede implicar una distancia de color alta.

  • todos los colores con S = 0 tienen un tono de "gris", aunque su diferencia de HSL puede implicar una distancia de color alta.

  • el rango H (tono) comienza y termina con un tono de ''rojo'', por lo que H = 0 y H = [máximo] (360 ° o 100% o 240, dependiendo de la aplicación) son rojos y relativamente similares entre sí , pero la distancia Euclidean HSL es cercana al máximo.

así que mi recomendación es usar la distancia euclidiana RGB (r2-r1) ² + (g2-g1) ² + (b2-b1) ² sin raíz. el umbral (subjetivo) de 1000 funciona bien para colores similares. los colores con diferencias> 1000 son bien distinguibles por el ojo humano. Además, puede ser útil ponderar los componentes de forma diferente (consulte la publicación anterior).


Si vas a utilizar HSV, debes darte cuenta de que los HSV no son puntos en un espacio tridimensional, sino más bien el ángulo, la magnitud y la distancia desde la parte superior de un cono. Para calcular la distancia de un valor HSV, debe determinar sus puntos en un espacio 3D mediante transformación.

X = Cos (H) * S * V

Y = Sin (H) * S * V

Z = V

Para ambos puntos y luego tomar la distancia euclidiana entre ellos:

Sqrt((X0 - X1)*(X0 - X1) + (Y0 - Y1)*(Y0 - Y1) + (Z0 - Z1)*(Z0 - Z1))

A un costo de 2 Cos, 2 Sin y una raíz cuadrada.

Alternativamente, puede calcular la distancia un poco más fácilmente si lo desea, al darse cuenta de que cuando se aplana al espacio 2D simplemente tiene dos vectores del origen y aplica la ley de cosign para encontrar la distancia en el espacio XY:

C² = A² + B² + 2*A*B*Cos(Theta)

Donde A = S * V del primer valor, y B = S * V del segundo y cosigno es la diferencia theta o H0-H1

Luego, factoriza Z, para expandir el espacio 2D al espacio 3D.

A = S0*V0 B = S1*V1 dTheta = H1-H0 dZ = V0-V1 distance = sqrt(dZ*dZ + A*A + B*B + 2*A*B*Cos(dTheta);

Tenga en cuenta que debido a que la ley de cosigns nos da C² simplemente lo conectamos allí mismo con el cambio en Z. Lo que cuesta 1 Cos y 1 Sqrt. HSV es muy útil, solo necesitas saber qué tipo de espacio de color está describiendo. No puedes simplemente ponerlos en una función euclidiana y obtener algo coherente de ello.


Primero, ¿cómo está obteniendo el valor entero?

Una vez que obtenga los valores RGB, podría intentar

((r2 - r1) 2 + (g2 - g1) 2 + (b2 - b1) 2 ) 1/2

Esto le daría la distancia en el espacio 3D desde los dos puntos, cada uno designado por (r1, g1, b1) y (r2, g2, b2).

O hay formas más sofisticadas de usar el valor HSV del color.


Hay un documento interesante sobre exactamente este problema:

Un nuevo espacio de color perceptualmente uniforme con una medida de similitud de color asociada para la recuperación de imágenes y videos basados ​​en contenido por M. Sarifuddin y Rokia Missaoui

Puede encontrar esto fácilmente usando Google o en particular [Google Scholar.] [1]

En resumen, algunos espacios de color (por ejemplo, RGB, HSV, Lab) y medidas de distancia (como la media geométrica y la distancia euclidiana) son mejores representaciones de la percepción humana de la similitud de color que otras. El documento habla sobre un nuevo espacio de color, que es mejor que el resto, pero también proporciona una buena comparación de los espacios de color existentes comunes y las medidas de distancia. Cualitativamente *, parece que la mejor medida para la distancia de percepción usando espacios de color comúnmente disponibles es: el espacio de color HSV y una medida de distancia cilíndrica.

* Al menos, de acuerdo con la Figura 15 en el documento al que se hace referencia.

La medida de distancia cilíndrica es (en notación de látex):

D_ {cyl} = / sqrt {/ Delta V ^ {2} + S_1 ^ {2} + S_2 ^ {2} -2S_1S_2cos (/ Delta H)}


Esta es una pregunta similar a la # 1634206 .

Si está buscando la distancia en el espacio RGB, la distancia euclidiana funcionará, suponiendo que trate los valores rojo, verde y azul por igual.

Si desea ponderarlos de forma diferente, como suele hacerse al convertir el color / RGB a escala de grises, debe ponderar cada componente por una cantidad diferente. Por ejemplo, usando la popular conversión de RGB a escala de grises de 30% rojo + 59% verde + 11% azul:

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;

Cuanto menor es el valor de d2 , más se acercan los colores (r1,g1,b1) y (r2,g2,b2) .

Pero hay otros espacios de color para elegir que solo RGB, que puede ser más adecuado para su problema.



HSL es un mal movimiento. L * a * b es un espacio de color diseñado para representar cómo se percibe realmente el color, y se basa en datos de cientos de experimentos que involucran personas con ojos reales que miran diferentes colores y que dicen: "Puedo notar la diferencia entre esos dos. esos dos".

La distancia en L * a * b espacio representa la distancia real percibida de acuerdo con las predicciones derivadas de esos experimentos.

Una vez que convierte a L * a * b solo necesita medir la distancia lineal en un espacio 3D.