Как генерировать п различных цветов для любого натурального числа п?

голоса
35

Скажем, п = 100; Как создать 100 различных цветов визуально? Является ли это математически возможно?

Задан 24/02/2010 в 19:09
источник пользователем
На других языках...                            


6 ответов

голоса
4

Вы хотите преобразовать в HSL, а затем перебирать значения цветового тона (Н), сохраняя при этом постоянная 2 других значений.

Для каждого значения преобразования из HSL обратно в RGB .

Смотрите мои ответы здесь и здесь .

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

Ответил 24/02/2010 в 19:11
источник пользователем

голоса
4

100 много цветов, но вы можете быть в состоянии сделать это, распределяя их редко, насколько это возможно в HSB или HSL пространства; делать это в RGB, вероятно, трудно.

Например, вы можете решить использовать 10 различных оттенков, 4 уровня насыщения, и 3 различных настроек яркости, что даст вам до 120 цветов. Вам необходимо тщательно выбирать значение насыщенности и яркости; человеческие глаза сложные и запутанные датчики. Если рассматривать цветовое пространство в виде конуса, вы, вероятно, хотите различное количество оттенков на каждом уровне легкость / насыщения.

Вот ссылка на википедии запись на HSB .

Ответил 24/02/2010 в 19:11
источник пользователем

голоса
33

Редактировать:

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

Цвет разница

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

RGB

Наиболее распространенное представление цвета в компьютерных системах является вектором (г, г, б) , который предполагает простую функцию расстояния , как

разница в цвета RGB

Позволяет установить диапазон для г , г и б к [0, 1] и посмотреть , как это работает:

  1. Красный (1, 0, 0) и красный (1, 0, 0) имеет расстояние 0 , которое должно быть очевидно ,
  2. Красный (1, 0, 0) и желтый (1, 1, 0) имеет расстояние 1 , которое меньше , чем расстояние
  3. Красный (1, 0, 0) и синий (0, 0, 1) , который является SQRT (2) , который является вероятным

Все идет нормально. Однако проблема в том , что синий и красный на одинаковом расстоянии 1 от черного (0, 0, 0) , но при взгляде на изображение это , кажется, не верны:

синий и красный на черном

Кроме того, желтый (1, 1, 0) и пурпурного (1, 0, 1) оба имеют на одинаковом расстоянии 1 от белого (1, 1, 1) , который , кажется, не имеет смысла либо:

желтого и пурпурного на белом

HSL и HSV

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

CIEDE2000

К счастью, есть ученые уже пытаются найти хороший способ для сравнения цвета. Они придумали некоторые сложные методы, последние одно существо CIEDE2000

CIEDE2000

(полная формула описана в статье огромное )

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

Цвет Выбор алгоритма

Наивное решение

Некоторые ответы предложили следующий алгоритм

colors = []
for n in range(n):
    success=False
    while not success:
        new_color = random_color()
        for color in colors:
            if distance(color, new_color)>far_enough:
                colors.append(new_color)
                success = True
                break

Этот алгоритм имеет некоторые проблемы:

  1. Расстояние между цветами не является оптимальным. Если мы представим себе цвет, чтобы быть похожими номера на линии, три цифры будет оптимально расположена следующим образом:

    | ----- ----- б с |

    Упаковка дополнительно один номера в там без перемещения, Ь, с явно хуже, чем перепрофилированием всех цветов.

  2. Алгоритм не гарантируется прекратить . Что делать , если нет цвета , что достаточно далеко формируют существующие цвета в списке? Цикл будет продолжаться вечно

Правильное решение

Ну .. я не один.

Ответил 24/02/2010 в 19:17
источник пользователем

голоса
2

Не ответ на ваш вопрос, но, если п имеет максимальное значение , и ваше приложение позволяет, вы можете использовать предопределенный список цветов , как это:

http://en.wikipedia.org/wiki/List_of_colors

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

Ответил 24/02/2010 в 19:31
источник пользователем

голоса
1

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

Если вы используете Lab пространство, есть перцептивные цветовые модели (CIE 1996? И CIE 2000) для измерения визуальной близости цветов (для печати и отображения соответственно).

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

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

Ответил 24/02/2010 в 20:19
источник пользователем

голоса
34

Да. Определение отчетливым является продуктом откладывая в цветовом пространство, то, когда мы говорим максимально различные цветы, что мы имеем в виду сказать, цвет, которые, как далеко от всех других цветов, как это возможно. Но так как цветовое пространство не меняет ответ не изменится. И реализация что-то, что лучше подходит с человеческими глазами и, как глаза человеческими видеть цвет, как CIE-лабораторного расстояние de2000 цвета делает переделку всех расчетов трудно, но делает статический список легко. Вот 128 записей.

private static final String[] indexcolors = new String[]{
        "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",

        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
};

Вот первые 256 как изображение.

максимальное расстояние

(Слева направо) (сверху-вниз). Вы можете быть в состоянии получить еще несколько различных цветов, если вы сделали, что каждый цвет был равноудалены как можно в цветовом. Этот просмотр таблица выбирает каждый дополнительный цвет, как максимально отличный от всех предыдущих цветов, а не обозначающий N в начале, а затем намечая цветовое пространство. Так что да, перебор и алгоритм цвета dsitance высокого уровня, и вы установите, чтобы сделать этот же набор цветов самостоятельно. В течение дня или около того.

Ответил 30/11/2013 в 09:18
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more