Палитра RGB предназначена для упорядоченных значений - PullRequest
2 голосов
/ 27 октября 2011

У меня есть функция 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 были в порядке? </p>

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

ОБНОВЛЕНИЕ: я ищу, как создать палитру цветности, как справа: enter image description here

Ответы [ 5 ]

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

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

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

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

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

Вы можете просто попробовать ограничить значения максимум 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 ...
1 голос
/ 27 октября 2011

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

0 голосов
/ 24 октября 2016

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

0 голосов
/ 27 октября 2011

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

YUV или YCrCb могут подойти, поскольку размеры УФ или CrCb могут рассматриваться как "под прямым углом"

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

...