Задача C Найти наиболее близкое соответствие цвета (rgb)

У меня есть предопределенный массив значений RGB. Я хочу иметь возможность сравнивать определенный пользователем цвет с моим массивом и возвращать наиболее близкое совпадение в Objective C.

Любая помощь приветствуется.


person yesimarobot    schedule 20.11.2009    source источник


Ответы (4)


Вам нужно решить, в каком цветовом пространстве вы тестируете.

HSL, возможно, является лучшим цветовым пространством, чем RGB, потому что вы можете придать больше значения «разнице оттенков» и меньше «яркости». В пространстве RGB вам нужно исказить свои различия, потому что глаз лучше различает оттенки зеленого, чем другие цвета.

person Jeff    schedule 20.11.2009

Вы можете попробовать найти Sum-of-Squared-Differences между вашим предопределенным цветом и цветом, определенным пользователем, и выбрать предопределенный цвет с минимальным «расстоянием».

Например. предположим, что заданный пользователем цвет равен [120 300 200], а предопределенный цвет — [100 250 150], тогда сумма квадратов разностей и оценка равна:

(120-100)*(120-100) + (300-250)*(300-250) + (200-150)*(200-150) = 5400 - и выберите предустановленный цвет с наименьшей разницей.

person Jacob    schedule 20.11.2009
comment
Спасибо Джейкоб. Могу ли я сохранить значение UIColor для каждого предопределенного цвета и выполнить самое близкое сравнение на основе его значения с плавающей запятой? - person yesimarobot; 20.11.2009
comment
Да, вы можете это сделать. Если вы хотите сделать это очень быстро, вы можете построить KD-дерево из предопределенных цветов - это сделает запросы очень быстрыми. В противном случае вы могли бы сделать это а-ля брутфорс - сравнить каждый цвет. - person Jacob; 20.11.2009
comment
Прохладный. Я смотрю на менее 1000 комарисонов макс. Я реализовал ваше предложение в php, и оно работает хорошо. Я хочу реализовать это для iPhone. Стоит ли KD-дерево моего времени? - person yesimarobot; 20.11.2009
comment
Компромисс — это время, затрачиваемое на построение KD-дерева, а не количество запросов к нему. Я предлагаю сначала реализовать наивный метод, а если он медленный, подумайте о KD-дереве. - person Jacob; 20.11.2009

Напрашивается вопрос, а что такое близость в цветах.

Вам нужно будет попробовать это, цвета - это не только математика. Если кто-то хочет найти расстояние между двумя точками в трехмерном пространстве (есть три цвета), математика, заданная color1 и color2, будет: ((r2-r1)^2 + (b2-b1)^2 + (g2-g1) ^ 2) ^ 0,5 (конечный квадратный корень не требуется для целей сравнения).

Возможно, лучшим способом было бы выполнить расчеты в пространстве HSB, возможно, просто взглянув на оттенок.

person zaph    schedule 20.11.2009

Во-первых, вы должны определить функцию расстояния. Тривиальная функция — это функция длины вектора: сумма квадратов разностей по всем измерениям.

Затем просто пробегитесь по своему массиву и выберите ближайший (с минимальным расстоянием).

person Elalfer    schedule 20.11.2009