Python - Найти похожие цвета, лучший способ

Я сделал функцию для поиска цвета в изображении и возврата 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 также великолепен и удовлетворяет большинство моих потребностей.

13
задан JHolta 5 February 2015 в 12:03
поделиться