Ho fatto una funzione per trovare un colore all'interno di un'immagine, e restituire x, y. Ora ho bisogno di aggiungere una nuova funzione, dove posso trovare un colore con una tolleranza data. Dovrebbe essere facile?Python - Trova colori simili, meglio
codice per trovare il colore in immagine, e tornare x, 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
Risultato:
Tratto dalle risposte normali metodi di confronto tra due colori sono in distanza euclidea o distanza Chebyshev.
ho deciso di utilizzare per la maggior parte (al quadrato) distanza euclidea, e molteplici colori-spazi diversi. LAB, deltaE (LCH), XYZ, HSL e RGB. Nel mio codice, la maggior parte degli spazi colore usa la distanza euclidea quadrata per calcolare la differenza.
Ad esempio con LAB, RGB e XYZ semplice euc quadrata. distanza fa il trucco:
if ((X-X1)^2 + (Y-Y1)^2 + (Z-Z1)^2) <= (Tol^2) then
...
LCH, e HSL è un po 'più complicato come entrambi hanno una tonalità cilindrica, ma qualche pezzo di matematica risolve questo, allora è su all'utilizzo eucl quadrata. anche qui.
Nella maggior parte dei casi, ho aggiunto "parametri separati" per la tolleranza per ciascun canale (utilizzando 1 tolleranza globale e "modificatori" alternativi HueTol := Tolerance * hueMod
o LightTol := Tolerance * LightMod
).
sembra spazi colore costruiti sulla cima di XYZ (LAB, LCH) non eseguire meglio in molti dei miei scenari. Anche se in alcuni casi l'HSL produce ottimi risultati, ed è molto più economico convertire da RGB, anche l'RGB è ottimo e soddisfa gran parte delle mie esigenze.
Si dovrebbe restituire qualcosa se non si trova il colore nell'immagine. cioè, un codice di errore. –
Come si definisce la tolleranza? Intervalli separati per 'r',' g' e 'b'? –
Sono con John: cosa hai già provato? Potresti guardare a [cosine similarity] (https://en.wikipedia.org/wiki/Cosine_similarity) e cercare le implementazioni Python. –