Палитра RGB, предназначенная для упорядоченных значений

У меня есть функция f(x,y), в основном монотонная, которая выдает некоторые значения в диапазоне {0.0..100.0}. Я хотел бы нарисовать их, используя разные цвета, в виде 2D-изображения, где (x, y) - координаты, а разные цвета обозначают отличительные значения функции. Проблема в следующем: я не знаю, как сопоставить значения этой функции с цветовым пространством RGB, сохраняя порядок (видимо). я нашел что-л. как:

R = f(x,y) * 10.0f;
G = f(x,y) * 20.0f;
B = f(x,y) * 30.0f;
color = B<<16|G<<8|R; //@low-endian

работает нормально, но результирующее изображение слишком темное. Если я увеличу эти константы, это не улучшит ситуацию, потому что в какой-то момент компонент цвета будет больше 0xFF, поэтому он переполнится (один компонент цвета должен быть в диапазоне {0 .. 0xFF}.

Вы знаете, как сопоставить значения от {0.0 .. 100.0} до
RGB=[{0 .. 0xFF}‹‹16|{0 .. 0xFF}‹‹8|{0 .. 0xFF}] чтобы результирующие значения RGB были визуально в порядке?

PS: может быть, вы знаете, где найти больше информации о связанной теории в Интернете? Я помню только Comp.Graphics от Foley/Van Dam, но этой книги у меня нет.

ОБНОВЛЕНИЕ: я ищу, как создать палитру цветности, подобную той, что справа: введите описание изображения здесь


person psihodelia    schedule 27.10.2011    source источник


Ответы (5)


Вы можете просто попробовать зажать значения максимум до 255 (0xff).

R = min((int)(f(x,y) * 10.0f), 0xff);
G = min((int)(f(x,y) * 20.0f), 0xff);
B = min((int)(f(x,y) * 30.0f), 0xff);

Редактировать. Существует множество различных способов автоматического преобразования цветов, но вы можете обнаружить, что ни один из них не обеспечивает точного прогресса, который вы ищете. Поскольку у вас уже есть изображение приемлемой палитры, одним из способов будет создание таблицы поиска из 256 цветов.

#define RGB(R,G,B) (B<<16|G<<8|R)

int palette[256] = { RGB(0,0,0), RGB(0,0,128), ... };

int greyscale = (int)(f(x,y) * 2.559999);
assert(greyscale >= 0 && greyscale <= 255);
int rgb = palette[greyscale];

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

int interpolate(int from, int to, double ratio)
{
    return from + (int)((to - from) * ratio); 
}
if (greyscale <= 48)
{
    R = 0;
    G = 0;
    B = interpolate(0, 255, greyscale/48.0);
}
else if (greyscale <= 96)
{
    R = 0;
    G = interpolate(0, 255, (greyscale-48)/48.0);
    B = interpolate(255, 0, (greyscale-48)/48.0);
}
else if ...
person Mark Ransom    schedule 27.10.2011
comment
Я уже пробовал, выглядит некрасиво. Например, он не показывает чистый красный цвет, если для синего или/и зеленого установлено значение 0xFF. - person psihodelia; 27.10.2011
comment
Справедливости ради, сначала вы не очень понимали, что ищете - я думал, что переход от черного к темно-красному, затем к желтому и к белому будет в порядке. Добавление образца палитры к вопросу очень помогает. - person Mark Ransom; 27.10.2011
comment
Спасибо, это, вероятно, лучшее решение. - person psihodelia; 02.02.2012

На самом деле вы могли бы использовать цветовую модель YUV, так как она основана на двух координатах, то есть U и В.

Это кажется более подходящим для задачи.

И преобразование YUV -> RGB довольно просто.

person macbirdie    schedule 27.10.2011

Вы можете преобразовать RGB в HSL и увеличить яркость/контрастность. Вы можете найти форумы по конверсиям и другую полезную информацию на этой странице: http://lodev.org/cgtutor/color.html

person Ultimate Gobblement    schedule 27.10.2011

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

YUV или YCrCb могут подойти, поскольку размеры UV или CrCb можно рассматривать как «под прямым углом».

Или HSL/HSV, если одно из ваших измерений обертывается, как оттенок.

person Martin Thompson    schedule 27.10.2011

Я полагаю, вам нужна тепловая карта на основе упорядоченных значений. Тогда у вас есть разные типы тепловых карт. Решение здесь: http://www.andrewnoske.com/wiki/Code_-_heatmaps_and_color_gradients

person Benn Malengier    schedule 24.10.2016