У меня есть предопределенный массив значений RGB. Я хочу иметь возможность сравнивать определенный пользователем цвет с моим массивом и возвращать наиболее близкое совпадение в Objective C.
Любая помощь приветствуется.
У меня есть предопределенный массив значений RGB. Я хочу иметь возможность сравнивать определенный пользователем цвет с моим массивом и возвращать наиболее близкое совпадение в Objective C.
Любая помощь приветствуется.
Вам нужно решить, в каком цветовом пространстве вы тестируете.
HSL, возможно, является лучшим цветовым пространством, чем RGB, потому что вы можете придать больше значения «разнице оттенков» и меньше «яркости». В пространстве RGB вам нужно исказить свои различия, потому что глаз лучше различает оттенки зеленого, чем другие цвета.
Вы можете попробовать найти Sum-of-Squared-Differences между вашим предопределенным цветом и цветом, определенным пользователем, и выбрать предопределенный цвет с минимальным «расстоянием».
Например. предположим, что заданный пользователем цвет равен [120 300 200]
, а предопределенный цвет — [100 250 150]
, тогда сумма квадратов разностей и оценка равна:
(120-100)*(120-100) + (300-250)*(300-250) + (200-150)*(200-150) = 5400
- и выберите предустановленный цвет с наименьшей разницей.
Напрашивается вопрос, а что такое близость в цветах.
Вам нужно будет попробовать это, цвета - это не только математика. Если кто-то хочет найти расстояние между двумя точками в трехмерном пространстве (есть три цвета), математика, заданная color1 и color2, будет: ((r2-r1)^2 + (b2-b1)^2 + (g2-g1) ^ 2) ^ 0,5 (конечный квадратный корень не требуется для целей сравнения).
Возможно, лучшим способом было бы выполнить расчеты в пространстве HSB, возможно, просто взглянув на оттенок.
Во-первых, вы должны определить функцию расстояния. Тривиальная функция — это функция длины вектора: сумма квадратов разностей по всем измерениям.
Затем просто пробегитесь по своему массиву и выберите ближайший (с минимальным расстоянием).