Алгоритм цветовой логики - PullRequest
24 голосов
/ 20 января 2010

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

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

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

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

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

Спасибо

Ответы [ 6 ]

41 голосов
/ 20 января 2010

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

И алгоритм в 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));
}
26 голосов
/ 20 января 2010

Вот алгоритм 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);
} 
5 голосов
/ 20 января 2010

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

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

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

5 голосов
/ 20 января 2010

Я бы использовал 3d расстояние между двумя цветами, где 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 голосов
/ 20 января 2010

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

Существует также этот предыдущий вопрос StackOverflow: Нахождение точного «расстояния» между цветами

2 голосов
/ 20 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...