Я сделал функцию для поиска цвета в изображении и возврата x, y. Теперь мне нужно добавить новую функцию, в которой я могу найти цвет с заданной толерантностью. Должно быть легко?
Код для поиска цвета в изображении и возврата 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
Результат:
Судя по ответам, обычные методы сравнения двух цветов - евклидово расстояние или расстояние Чебышева.
Я решил в основном использовать (квадратичное) евклидово расстояние, и несколько различных цветовых пространств. LAB, deltaE (LCH), XYZ, HSL и RGB. В моем коде большинство цветовых пространств используют квадратичное евклидово расстояние для вычисления разницы.
Например, для LAB, RGB и XYZ используется простое квадратичное евклидово расстояние:
if ((X-X1)^2 + (Y-Y1)^2 + (Z-Z1)^2) <= (Tol^2) then
...
LCH и HSL немного сложнее, так как оба имеют цилиндрический оттенок, но некоторые математические выкладки решают эту проблему, и тогда мы переходим к использованию квадратичного евклидова расстояния и здесь.
В большинстве этих случаев я добавил "отдельные параметры" для толерантности для каждого канала (используя 1 глобальную толерантность и альтернативные "модификаторы" HueTol := Tolerance * hueMod
или LightTol := Tolerance * LightMod
).
Похоже, что цветовые пространства, построенные поверх XYZ (LAB, LCH), работают лучше во многих моих сценариях. Хотя HSL дает очень хорошие результаты в некоторых случаях, и его гораздо дешевле конвертировать из RGB, RGB также великолепен и удовлетворяет большинство моих потребностей.