Цветовой логический алгоритм

Мы создаем спортивное приложение и хотели бы включать цвета команды в различные части приложения.

Теперь каждая команда может быть представлена ​​несколькими разными цветами.

Что бы я хотел сделать, так это выполнить проверку, чтобы проверить, находятся ли цвета двух команд в определенном диапазоне друг от друга, так что я не показываю два одинаковых цвета.

Итак, если основной цвет команды команды 1 имеет значение rgb (255,0,0) (или # FF0000), а основной цвет команды 2 аналогичен, скажем, rgb (250,0,0), тогда мы выберите другой цвет для одной из команд.

Если возможно, какой подход я мог бы предпринять для проверки?

Спасибо

Ответ 1

Вот теоретическое объяснение

И алго в C:

typedef struct {
    unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
    long rmean = ( (long)e1.r + (long)e2.r ) / 2;
    long r = (long)e1.r - (long)e2.r;
    long g = (long)e1.g - (long)e2.g;
    long b = (long)e1.b - (long)e2.b;
    return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

Ответ 2

Вот алгоритм pgras в Java:

public double ColourDistance(Color c1, Color c2)
{
    double rmean = ( c1.getRed() + c2.getRed() )/2;
    int r = c1.getRed() - c2.getRed();
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    double weightR = 2 + rmean/256;
    double weightG = 4.0;
    double weightB = 2 + (255-rmean)/256;
    return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
} 

Ответ 3

Я бы использовал трехмерное расстояние между двумя цветами, где x, y, z - значения R, G, B.

Взгляните на эту библиотеку Perl:

http://metacpan.org/pod/Color::Similarity::RGB

Это легко реализовать.

Просто убедитесь, что (R1-R2) ^ 2 + (G1-G2) ^ 2 + (B1-B2) ^ 2 >= порог ^ 2

Ответ 4

В большинстве ответов на этот вопрос предлагается рассчитать расстояние между двумя цветами при сопоставлении значений RGB в 3D-пространстве. Проблема с этим методом заключается в том, что два цвета с похожими оттенками, но разные уровни насыщенности или яркости могут отображаться дальше друг от друга в пространстве 3D RGB, чем два цвета с разными оттенками, но очень похожими уровня насыщенности и яркости. Другими словами, синий и зеленый могут быть ближе в пространстве 3D RGB, чем два оттенка красного. В этом приложении, чтобы цвета команды отличались друг от друга, различия оттенков должны весить гораздо больше, чем яркость и насыщенность.

Итак, я бы преобразовал цветовое отображение из RGB в оттенки, насыщенность и уровни яркости, а затем проверил только значения оттенков на достаточном расстоянии.

В Wikipedia есть объяснение для преобразования RGB в HSV. LiteratePrograms имеет некоторые пример кода.

Ответ 6

С точки зрения алгоритма это довольно просто. Каждый цвет представляет собой точку в трехмерном пространстве, а разница между цветами - это расстояние между этими точками.

Предположительно, здесь нужно убедиться, что цвета заметно отличаются. Если это дело, решение о минимальном расстоянии, вероятно, будет довольно сложно. Проблема в том, что (по крайней мере для людей с нормальным зрением) некоторые различия легче увидеть, чем другие. Например, большинство людей более чувствительны к небольшим различиям в оттенках зеленого, чем одинаково небольшие изменения в оттенках красного или синего. Есть алгоритмы, чтобы принять это во внимание, но они основаны на среднем человеческом видении, поэтому никто из них не гарантированно будет точно правильным для любого человека.

Просто для удовольствия, вы можете взглянуть на X-rite онлайн-тест цветного зрения.