Значение как представление цвета - PullRequest
0 голосов
/ 25 августа 2011

Преобразование значения в цвет хорошо известно, я понимаю следующие два подхода (очень хорошо описанные в изменение значений цвета rgb для представления значения )

  1. Значениев оттенках серого
  2. Значение в качестве яркости основного цвета (например, яркость синего )

Но какой алгоритм лучше?когда я хочу использовать полную цветовую гамму («все цвета»).Когда я использую «серые» с 8-битными значениями RGB, у меня фактически есть представление 256 оттенков (от белого до черного).Но если бы я использовал весь диапазон, я мог бы использовать больше оттенков.Что-то вроде это .Также это было бы легче распознать.

В основном мне нужен алгоритм в Javascript, но я думаю, что весь код, такой как C #, Java, псевдокод, тоже подойдет.Легенда внизу показывает кодировку, и я ищу алгоритм для этого.

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

Это визуальная демонстрация (требуется вспышка).Учитывая значения, представленные в цветовой схеме, моя цель состоит в том, чтобы вычислить цвета.

У меня есть линейный диапазон цветов, например, от 1-30000

- Обновление -

Здесь Я обнаружил, что здесь есть нечто, называемое LabSpace:

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

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

Ответы [ 4 ]

1 голос
/ 26 августа 2011

Что вам нужно, так это передаточная функция.
учитывая число с плавающей точкой, передаточная функция может генерировать цвет.

см. Это:

http://http.developer.nvidia.com/GPUGems/gpugems_ch39.html

и это:

http://graphicsrunner.blogspot.com/2009/01/volume-rendering-102-transfer-functions.html

Во второй статье говорится, что значение находится между [0,255]. Но это не должно быть в этом диапазоне.

Обычно мы масштабируем любое число с плавающей точкой до диапазона [0,1] и применяем передаточную функцию для получения значения цвета.

1 голос
/ 25 августа 2011

Horst,

В приведенном вами примере не создаются градиенты.Вместо этого они используют N предустановленных цветов из массива и выбирают следующий цвет, как указывает зонтик.Примерно так:

a = { "#ffffff", "#ff00ff", "#ff0000", "#888888", ... };
c = a[pos / 1000];

где pos - это ваше значение от 1 до 30 000, а c - это цвет, который вы хотите использовать.(вам нужно лучше определить индекс, чем pos / 1000, чтобы он работал правильно во всех ситуациях.)

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

В JavaScript это будет очень медленным.(с OpenGL это было бы мгновенно, и вам даже не пришлось бы вычислять градиенты, и это было бы «быстрее, чем в реальном времени».)

1 голос
/ 25 августа 2011

Существует два основных способа задания цвета. Один из них - это заранее определенный список цветов (палитра), а затем ваше значение цвета является указателем в этом списке. Вот как работали старые 8-битные цветовые системы и как по-прежнему работают изображения GIF. Есть списки веб-безопасных цветов, например http://en.wikipedia.org/wiki/Web_colors,, которые обычно вписываются в 8-битное значение. Часто похожие цвета соседствуют, а иногда нет. Преимущество палитры состоит в том, что требуется небольшое количество данных на пиксель, но недостатком является то, что вы ограничены в количестве разных цветов, которые могут быть на экране одновременно.

Другой основной способ - указать координаты цвета. Одним из способов является RGB, с отдельным значением для каждого основного цвета. Другим является оттенок / насыщенность / яркость. CMYK (голубой, пурпурный, желтый и иногда черный) используется для печати. Это то, что обычно называют истинным цветом, и когда вы используете фразу типа «все цвета», кажется, что вы ищете решение, подобное этому. Для градиентов и такого HSL может быть идеально подходит для вас. Например, градиент от цвета к серому просто уменьшает значение насыщенности. Если вам нужны только «чистые» цвета, то исправьте значения насыщенности и яркости и измените оттенок. Почти все системы рисования требуют RGB, но преобразование из HSL в RGB не вызывает затруднений. http://en.wikipedia.org/wiki/HSL_and_HSV

Если вы не можете сэкономить все 24 бита на цвет (8 бит на цвет, 32-битный цвет такой же, но добавляет канал прозрачности), вы можете использовать 15 или 16-битный цвет. Это то же самое, но вместо 8 бит на цвет вы получаете 5 (15 бит) или 5-6-5 (16 бит, зеленый получает дополнительный бит, потому что наши глаза более чувствительны к зеленым оттенкам). Это вписывается в короткое целое число.

1 голос
/ 25 августа 2011

Это зависит от целей ваших наборов данных.Например, вы можете назначить цвет каждому диапазону значений (0-100 - красный, 100-200 - зеленый, 200-300 - синий), изменив яркость в этом диапазоне.

...