Q:

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

Есть набор цветов в формате RGB например "150 145 16", мне нужно узнать к какому основному цвет отнести и соответственно выполнить некие действия например: если это желтый или все его оттенки то выполнить некое действие. Проблема заключается в том что я не понимаю как можно отнести цвет к какому-то основному как в примере желтому. Если кратко то нужно следующее нужно определить к какому цвету из:

синий.
зеленый
красный
желтый.
фиолетовый
коричневый.
черный
серый

Можно отнести полученный цвет в RGB.
Нужно очень срочно, если есть куски кода или алгоритм или кто знает как можно такое сделать подскажите, пожалуйста.

A:

Самый простой способ — посчитать разницу между 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> 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";

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

A:

Переведите цвет в HSV, затем посмотрите на значение H - оно как раз и означает цвет.
Не получится с HSV, посмотрите HSL. 

