Есть набор цветов в формате RGB например "150 145 16", мне нужно узнать к какому основному цвет отнести и соответственно выполнить некие действия например: если это желтый или все его оттенки то выполнить некое действие. Проблема заключается в том что я не понимаю как можно отнести цвет к какому-то основному как в примере желтому. Если кратко то нужно следующее нужно определить к какому цвету из:
синий.
зеленый
красный
желтый.
фиолетовый
коричневый.
черный
серый
Можно отнести полученный цвет в RGB.
Нужно очень срочно, если есть куски кода или алгоритм или кто знает как можно такое сделать подскажите, пожалуйста.
Ответ
Самый простой способ — посчитать разницу между RGB-каналами образцов и тестового цвета. Примерно так:
// класс цвета
class color {
public:
string _name;
char _r, _g, _b;
// конструктор
color (string name, char r, char g, char b) {
_name = name;
_r = r;
_g = g;
_b = b;
}
// сравнение с другим цветом
int distanceTo (color &another) {
return (abs(another._r - _r) + abs(another._g - _g) + abs(another._b - _b));
}
}
...
// набор цветов для сравнения
vector
// интересующий цвет
color test("test", 64, 32, 32);
// лучшее совпадение
color *best = nullptr;
int dst = 1024;
// поиск
for (auto it = sources.begin; it != sources.end(); it++) {
int current = (*it).distanceTo(test);
if (current < dst) {
dst = current;
best = *(*it);
}
}
// вывод ближайшего совпадения
cout << "Best match: " << best->name << "
";
Более точный результат можно получить сравнивая цвета по оттенку, яркости и насыщенности. Но в большинстве случаев хватит и сравнения по обычным каналам.
Комментариев нет:
Отправить комментарий