Страницы

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

суббота, 7 декабря 2019 г.

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

#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)); } } ... // набор цветов для сравнения 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 << "\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/Формула_цветового_отличия

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

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