He hecho una función para encontrar un color dentro de una imagen, y devuelvo x, y. Ahora necesito agregar una nueva función, donde puedo encontrar un color con una tolerancia dada. Debería ser fácil?Python - Encuentra colores similares, la mejor manera
código para encontrar el color de la imagen, y x regresar, y:
def FindColorIn(r,g,b, xmin, xmax, ymin, ymax):
image = ImageGrab.grab()
for x in range(xmin, xmax):
for y in range(ymin,ymax):
px = image.getpixel((x, y))
if px[0] == r and px[1] == g and px[2] == b:
return x, y
def FindColor(r,g,b):
image = ImageGrab.grab()
size = image.size
pos = FindColorIn(r,g,b, 1, size[0], 1, size[1])
return pos
Resultado:
Tomado de las respuestas de los métodos normales de comparación de dos colores se encuentran en la distancia euclídea , o la distancia Chebyshev.
Decidí usar sobre todo la distancia euclidiana (cuadrada) y varios espacios de color diferentes. LAB, deltaE (LCH), XYZ, HSL y RGB. En mi código, la mayoría de los espacios de color usan la distancia euclidiana al cuadrado para calcular la diferencia.
Por ejemplo, con LAB, RGB y XYZ un simple euc cuadrado. la distancia hace el truco:
if ((X-X1)^2 + (Y-Y1)^2 + (Z-Z1)^2) <= (Tol^2) then
...
LCH, y HSL es un poco más complicado ya que ambos tienen una tonalidad cilíndrica, pero alguna pieza de matemáticas resuelve que, a continuación, se pasa a utilizar EuCl cuadrado. aquí también.
En la mayoría de estos casos he agregado "parámetros separados" para la tolerancia para cada canal (usando 1 tolerancia global, y "modificadores" alternativos HueTol := Tolerance * hueMod
o LightTol := Tolerance * LightMod
).
parece como espacios de colores creados por encima de XYZ (LAB, LCH) no funcionará mejor en muchas de mis escenarios. Tho HSL produce muy buenos resultados en algunos casos, y es mucho más barato convertir a RGB, RGB también es excelente, y satisface la mayoría de mis necesidades.
Debe devolver algo si usted no encuentra el color en la imagen. es decir, un código de error. –
¿Cómo está definiendo la tolerancia? Rangos separados para 'r',' g' y 'b'? –
Estoy con John: ¿qué has probado ya? Puede ver [similitud coseno] (https://en.wikipedia.org/wiki/Cosine_similarity) y buscar implementaciones de Python. –