Страницы

Поиск по вопросам

среда, 10 октября 2018 г.

Как отнести полученный цвет в RGB к основному

Есть набор цветов в формате 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 sources; sources.push_back(color("red", 255, 0, 0)); sources.push_back(color("green", 0, 255, 0)); sources.push_back(color("blue", 0, 0, 255)); sources.push_back(color("yellow", 255, 255, 0)); sources.push_back(color("purple", 255, 0, 255)); sources.push_back(color("black", 0, 0, 0)); sources.push_back(color("white", 255, 255, 255));
// интересующий цвет 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 << "
";

Более точный результат можно получить сравнивая цвета по оттенку, яркости и насыщенности. Но в большинстве случаев хватит и сравнения по обычным каналам.

Комментариев нет:

Отправить комментарий