Создание визуально разных цветов с неизвестным размером коллекции цветов - PullRequest
5 голосов
/ 05 октября 2011

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

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

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

Вот где я нахожусь:

  • Использование цветового пространства HSV.
  • Оттенок - это значение от [0-360], где 0 и 360 одинаковы (красноватые).
  • Оттенок начинается с 0, я объявления 27 (так что когда он вращается вокруг него не приземляется на тот же цвет, он начал ) возьмите MOD 360.
  • Для S и V (оба между 0 и 1) я начинаю с небольшого числа, например +0,25
  • пробег около 20 оттенков
  • Тогда возьмите большое число, например .85
  • пробег через 20 оттенков
  • Тогда начните делить пополам, чтобы получить самые отдаленные значения, которые еще не использовались.

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

Есть идеи, как сделать это элегантно?

(Это не должно иметь значения, но я использую C #, и я отправлю код, когда вернусь к своему компьютеру, на котором все это включено.)

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Я считаю, что ваш вопрос следует разделить на два вопроса:

  1. Как отобразить цвета в n-мерном декартовом пространстве и определить евклидову функцию расстояния между цветами, чтобы расстояние отражало разницу для человека-наблюдателя.
  2. Учитывая n-мерный кубоид, сгенерируйте последовательность точек так, чтобы минимальное евклидово расстояние между любыми двумя точками, сгенерированными до сих пор, было максимизировано.

А теперь ответы:

  1. Разница в цветах рассчитывается по формуле CIEDE2000 для цветовых различий . Формула CIEDE2000 основана на цветовом пространстве LCH (яркость, цветность и оттенок). Цветовое пространство LCH представлено в виде цилиндра (см. Изображение здесь ).

    Тем не менее, формула различий очень нелинейная. Поэтому было бы невозможно отобразить цвета в квадратную сетку таким образом, чтобы евклидово расстояние давало разницу в цвете CIEDE2000.

    Выбирая менее точную модель, мы можем использовать формулу CIE76 Color-Difference, основанную на цветовом пространстве Lab (L * a * b *) . Мы можем использовать евклидово расстояние непосредственно в этом цветовом пространстве, чтобы измерить разницу. Простых формул для преобразования между значениями RGB или CMYK и L * a * b * не существует, поскольку цветовые модели RGB и CMYK зависят от устройства. Сначала необходимо преобразовать значения RGB или CMYK в определенное абсолютное цветовое пространство, такое как sRGB или Adobe RGB. Эта настройка будет зависеть от устройства, но результирующие данные преобразования будут независимы от устройства, что позволит преобразовать данные в цветовое пространство CIE 1931, а затем преобразовать в L * a * b *. Эта статья объясняет процедуру и формулы.

  2. Для цветового пространства L * a * b * и формулы цветовых различий CIE76 - нам нужно решить проблему для трехмерного куба.

    Я считаю, что вашей лучшей стратегией было бы разделить куб на 8 кубов, что даст 27 очков. Используйте эти точки. Теперь разделите каждый из 8 кубов на еще 8 кубов. Для каждого из этих кубов 12 из 27 очков уже были использованы, так что у вас осталось 15 * 8 новых очков. На каждом дополнительном шаге n вы можете создать 15 * 8 ^ n дополнительных очков.

    Точки, установленные на каждом шаге, должны быть отсортированы таким образом, чтобы минимальное расстояние между двумя последовательными точками было максимальным. Я не знаю, как это сделать - Я только что опубликовал вопрос .

Edit:

Я поставил на https://cstheory.stackexchange.com/ и получил хороший ответ. См https://cstheory.stackexchange.com/questions/8609/sorting-points-such-that-the-minimal-euclidean-distance-between-consecutive-poin.

2 голосов
/ 11 октября 2011

Если вы отобразите все цветовое пространство линейно, тогда ваш следующий цвет отобразится в нем с использованием степеней 2. Ваш первый выбор будет центром, а второй - между началом и центром.Ваш третий выбор будет между центром и концом.

Некоторый JavaScript для иллюстрации.

// initialize start and end of our linear transform
var START = 0;
var END = 100;

// next function
var _level = 1;
var _index = 1;
function next() {
    var pow2 = 2 << (_level - 1);
    var result = (END-START) / pow2;
    result = result * _index
    _index = (_index + 2) % pow2;
    if(_index == 1) {
        _level++;
    }
    return result;
}

// testing
for(var i=0; i<32; i++) 
    console.log(next());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...