Я сделал функцию, чтобы найти цвет внутри изображения и вернуть 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 простой квадрат euc. Расстояние делает трюк:
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), лучше всего работают во многих моих сценариях. Tho HSL дает очень хорошие результаты в некоторых случаях, и гораздо дешевле конвертировать в RGB, RGB также отлично подходит для большинства моих потребностей.