#cpp #алгоритм #opencv
Есть набор цветов в формате RGB например "150 145 16", мне нужно узнать к какому основному цвет отнести и соответственно выполнить некие действия например: если это желтый или все его оттенки то выполнить некое действие. Проблема заключается в том что я не понимаю как можно отнести цвет к какому-то основному как в примере желтому. Если кратко то нужно следующее нужно определить к какому цвету из: синий. зеленый красный желтый. фиолетовый коричневый. черный серый Можно отнести полученный цвет в RGB. Нужно очень срочно, если есть куски кода или алгоритм или кто знает как можно такое сделать подскажите, пожалуйста.
Ответы
Ответ 1
Самый простой способ — посчитать разницу между 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)); } } ... // набор цветов для сравнения vectorsources; 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 << "\n"; Более точный результат можно получить сравнивая цвета по оттенку, яркости и насыщенности. Но в большинстве случаев хватит и сравнения по обычным каналам. Ответ 2
Переведите цвет в HSV, затем посмотрите на значение H - оно как раз и означает цвет. Не получится с HSV, посмотрите HSL.Ответ 3
h, s, v = rgb_to_hsv(r, g, b) if s < 0.25 // или какая константа больше нравится if v < 0.25 черный elsif v > 0.75 белый else серый end else { какой цвет из радуги ближе всего по abs(h1-h2) mod 360 } end Либо https://ru.wikipedia.org/wiki/Формула_цветового_отличия
Комментариев нет:
Отправить комментарий