Я написал два метода ниже, чтобы автоматически выбрать N различных цветов. Он работает путем определения кусочно-линейной функции на кубе RGB. Преимущество этого состоит в том, что вы также можете получить прогрессивную шкалу, если вы этого хотите, но когда N становится большим, цвета могут начать выглядеть одинаково. Я также могу представить себе равномерное подразделение куба RGB на решетку и затем рисование точек. Кто-нибудь знает какие-либо другие методы? Я исключаю определение списка, а затем просто перебираю его. Я также должен сказать, что мне все равно, сталкиваются ли они или не выглядят красиво, они просто должны быть визуально различимы.
public static List<Color> pick(int num) {
List<Color> colors = new ArrayList<Color>();
if (num < 2)
return colors;
float dx = 1.0f / (float) (num - 1);
for (int i = 0; i < num; i++) {
colors.add(get(i * dx));
}
return colors;
}
public static Color get(float x) {
float r = 0.0f;
float g = 0.0f;
float b = 1.0f;
if (x >= 0.0f && x < 0.2f) {
x = x / 0.2f;
r = 0.0f;
g = x;
b = 1.0f;
} else if (x >= 0.2f && x < 0.4f) {
x = (x - 0.2f) / 0.2f;
r = 0.0f;
g = 1.0f;
b = 1.0f - x;
} else if (x >= 0.4f && x < 0.6f) {
x = (x - 0.4f) / 0.2f;
r = x;
g = 1.0f;
b = 0.0f;
} else if (x >= 0.6f && x < 0.8f) {
x = (x - 0.6f) / 0.2f;
r = 1.0f;
g = 1.0f - x;
b = 0.0f;
} else if (x >= 0.8f && x <= 1.0f) {
x = (x - 0.8f) / 0.2f;
r = 1.0f;
g = 0.0f;
b = x;
}
return new Color(r, g, b);
}
java
colors
color-scheme
color-picker
работа
источник
источник
Ответы:
Вы можете использовать цветовую модель HSL для создания своих цветов.
Если все, что вам нужно, это разные оттенки (вероятнее всего) и небольшие колебания яркости или насыщенности, вы можете распределить оттенки следующим образом:
источник
Этот вопрос появляется в нескольких SO обсуждениях:
Предлагаются разные решения, но ни одно из них не является оптимальным. К счастью, наука приходит на помощь
Произвольный N
Последние 2 будут бесплатными через большинство университетских библиотек / прокси.
N конечно и относительно мало
В этом случае можно пойти на список решений. Очень интересная статья в теме находится в свободном доступе:
Есть несколько списков цветов для рассмотрения:
Я также столкнулся с этой Палитрой студентом MIT. Наконец, следующие ссылки могут быть полезны при преобразовании между различными системами цветов / координатами (например, некоторые цвета в статьях не указаны в RGB):
Что касается списка Келли и Бойнтона, я уже сделал преобразование в RGB (за исключением белого и черного, что должно быть очевидно). Некоторый код C #:
А вот значения RGB в шестнадцатеричном и 8-битном представлениях канала:
Для всех вас, разработчиков Java, вот цвета JavaFX:
Ниже приведены несортированные цвета Келли в порядке, указанном выше.
ниже приведены отсортированные цвета келли по оттенкам (обратите внимание, что некоторые желтые цвета не очень контрастны)
источник
Как и ответ Ури Коэна, но вместо этого - генератор. Начнем с использования цветов далеко друг от друга. Детерминированный.
Образец, оставленные цвета сначала:
источник
Вот идея. Вообразите цилиндр HSV
Определите верхний и нижний пределы для яркости и насыщенности. Это определяет квадратное кольцо поперечного сечения в пространстве.
Теперь разбросим N точек случайно в этом пространстве.
Затем примените к ним алгоритм итеративного отталкивания либо для фиксированного числа итераций, либо до стабилизации точек.
Теперь у вас должно быть N точек, представляющих N цветов, которые настолько различны, насколько это возможно в цветовом пространстве, которое вас интересует.
Хьюго
источник
Ради грядущих поколений добавляю здесь принятый ответ на Python.
источник
Кажется, что все упустили существование очень полезного цветового пространства YUV, которое было разработано, чтобы представлять воспринимаемые цветовые различия в зрительной системе человека. Расстояния в YUV представляют различия в человеческом восприятии. Мне нужна была эта функциональность для MagicCube4D, который реализует 4-мерные кубики Рубика и неограниченное количество других 4D извилистых головоломок с произвольным числом граней.
Мое решение начинается с выбора случайных точек в YUV, а затем итеративного разбиения ближайших двух точек и преобразования только в RGB при возврате результата. Метод O (n ^ 3), но это не имеет значения для небольших чисел или тех, которые могут быть кэшированы. Конечно, это можно сделать более эффективным, но результаты кажутся отличными.
Функция позволяет опционально задавать пороговые значения яркости, чтобы не создавать цвета, в которых ни один компонент не является более ярким или темным, чем заданные значения. То есть вы можете не захотеть значения, близкие к черному или белому. Это полезно, когда результирующие цвета будут использоваться в качестве базовых цветов, которые затем затеняются с помощью освещения, наслоения, прозрачности и т. Д. И все же должны отличаться от своих базовых цветов.
источник
Цветовая модель HSL может хорошо подходить для «сортировки» цветов, но если вы ищете визуально отличающиеся цвета, вам определенно нужна цветовая модель Lab .
Как только вы узнаете, что поиск оптимального подмножества из N цветов из широкого диапазона цветов все еще остается трудной задачей (NP), она похожа на проблему коммивояжера и все решения, использующие алгоритмы k-среднего или что-то еще Помогите.
Тем не менее, если N не слишком велико, и если вы начнете с ограниченного набора цветов, вы легко найдете очень хорошее подмножество различий цветов в соответствии с расстоянием Lab с простой случайной функцией.
Я написал такой инструмент для собственного использования (вы можете найти его здесь: https://mokole.com/palette.html ), вот что я получил за N = 7:
Это все javascript, так что не стесняйтесь взглянуть на источник страницы и адаптировать его под свои нужды.
источник
L
от 0 до 128 , аa
иb
от -128 до 128. ¶ Я начал сL
= 0,a
= -128,b
= -128 , который является ярко - синим. Затем я увеличился вa
три раза. Change Большое изменение (+128)a
= 50 приводит к получению лишь немного более темного синего цвета. ❷ (+85)a
= 85 результаты по-прежнему синим цветом. ❸ Однако, относительно небольшое изменение (+43)a
= 128 полностью меняет цвет на фуксию.Вот решение для решения вашей «отдельной» проблемы, которая полностью преувеличена:
Создайте единичную сферу и отбрасывайте на нее точки с отталкивающими зарядами. Запускайте систему частиц до тех пор, пока они не перестанут двигаться (или дельта не станет «достаточно маленькой»). В этот момент каждая из точек находится как можно дальше друг от друга. Преобразовать (x, y, z) в rgb.
Я упоминаю об этом, потому что для определенных классов проблем этот тип решения может работать лучше, чем грубая сила.
Я изначально видел этот подход здесь для тесселяции сферы.
Опять же, наиболее очевидные решения обхода пространства HSL или RGB, вероятно, будут работать просто отлично.
источник
Я бы попытался установить насыщенность и яркость на максимум и сосредоточиться только на оттенке. Как я вижу, H может перейти от 0 до 255, а затем оборачивается. Теперь, если бы вы хотели два контрастных цвета, вы бы выбрали противоположные стороны этого кольца, то есть 0 и 128. Если бы вы хотели 4 цвета, вы бы взяли некоторые, разделенные на 1/4 длины круга 256, то есть 0, 64,128,192. И, конечно, как другие предлагали, когда вам нужно N цветов, вы можете просто разделить их на 256 / N.
Я хотел бы добавить к этой идее использование обратного представления двоичного числа для формирования этой последовательности. Посмотри на это:
... таким образом, если вам нужно N разных цветов, вы можете просто взять первые N чисел, поменять их местами, и вы получите как можно больше удаленных точек (для N степень двойки), сохраняя при этом каждый префикс Последовательность сильно отличается.
Это было важной целью в моем случае использования, так как у меня была диаграмма, где цвета были отсортированы по области, покрытой этим цветом. Я хотел, чтобы самые большие области диаграммы имели большой контраст, и я был в порядке с некоторыми небольшими областями, чтобы иметь цвета, похожие на цвета из топ-10, так как для читателя было очевидно, какой из них какой, просто наблюдая за областью.
источник
getfracs
. Но ваш подход быстро и «просто» на языках низкого уровня: бит реверсивный в C .Если N достаточно велик, вы получите несколько похожих цветов. В мире их так много.
Почему бы просто не распределить их равномерно по спектру, вот так:
Если вы хотите смешать последовательность так, чтобы похожие цвета не были рядом друг с другом, вы можете перемешать результирующий список.
Я думаю об этом?
источник
Это тривиально в MATLAB (есть команда hsv):
источник
Я написал пакет для R под названием qualpalr, который разработан специально для этой цели. Я рекомендую вам взглянуть на виньетку, чтобы узнать, как она работает, но я постараюсь обобщить основные моменты.
Qualpalr берет спецификацию цветов в цветовом пространстве HSL (которое было описано ранее в этой теме), проецирует его в цветовое пространство DIN99d (которое является перцепционно однородным) и находит то,
n
которое максимизирует минимальное расстояние между ними.источник
Я думаю, что этот простой рекурсивный алгоритм дополняет принятый ответ, чтобы генерировать различные значения оттенка. Я сделал это для HSV, но можно использовать и для других цветовых пространств.
Он генерирует оттенки в циклах, максимально отдельных друг от друга в каждом цикле.
Я не смог найти такой алгоритм здесь. Надеюсь, это поможет, это мой первый пост здесь.
источник
Эта функция OpenCV использует цветовую модель HSV для генерации
n
равномерно распределенных цветов вокруг 0 <= H <= 360º с максимальным S = 1,0 и V = 1,0. Функция выводит цвета BGR вbgr_mat
:источник