Создание таблицы соответствия цветов переменной длины - PullRequest
3 голосов
/ 11 августа 2010

Мне было интересно, есть ли у кого-нибудь какие-либо советы или я мог бы указать мне на какие-нибудь хорошие ресурсы в отношении создания таблиц поиска цветов для синтеза изображений.В моем приложении у меня есть значения с плавающей запятой между -1.0 и 1.0, которые должны быть отображены в пространство RGB.Проблема в том, что я не знаю заранее, какую точность будут иметь значения с плавающей запятой, поэтому я не знаю, сколько записей нужно поместить в таблицу поиска или какими они должны быть.Существуют ли какие-либо общепринятые методы для сопоставления данных в этой форме с цветами?Кажется, было бы слишком дорого создавать новую таблицу цветов для каждого изображения на основе диапазона значений в области данных изображения.

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

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

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

Однако использование таблицы поиска здесь неуместно;почему бы не определить функцию отображения, которая принимает ваше значение с плавающей точкой в ​​качестве входных данных и возвращает значение RGB?Я использовал это для раскраски фракталов (см. Раздел «Раскраска» в http://jk.ozlabs.org/projects/lca2008-hackfest/).

). По сути, мой подход заключается в упрощенном преобразовании HSV в RSB с использованием постоянных значений для Насыщенности и Значения и плавающеготочечные входные данные для оттенка. Это даст вашим значениям следующие выходные данные RGB:

i to RGB conversion

См. http://jk.ozlabs.org/blog/post/65/hackfest08-solution-2/ для некоторых фракталов, окрашенных с использованием этой функции отображения.

У меня есть некоторый код на C для этого, который можно легко преобразовать в python. Обратите внимание, что здесь предполагается, что 0 <= i <= 1, тогда как вы, вероятно, хотите -1 <= i <= 1: </p>

/* for a value x (which is between x_min and x_max), interpolate a y value
 * (between y_min and y_max) of the same proportion.
 */
static float interpolate(float x, float x_min, float x_max,
        float y_min, float y_max)
{
    x = (x - x_min) / (x_max - x_min);
    return x * (y_max - y_min) + y_min;

}

/*
 * given a the i and i_max values from a point in our (x,y) coordinates,
 * compute the colour of the pixel at that point.
 *
 * This function does a simplified Hue,Saturation,Value transformation to
 * RGB. We take i/i_max as the Hue, and keep the saturation and value
 * components fixed.
 */
void colour_map(struct pixel *pix, float i, float i_max)
{
    const float saturation = 0.8;
    const float value = 0.8;
    float v_min, hue;

    hue = i / (i_max + 1);
    v_min = value * (1 - saturation);

    /* create two linear curves, between value and v_min, of the
     * proportion of a colour to include in the rgb output. One
     * is ascending over the 60 degrees, the other descending
     */

    if (hue < 0.25) {
        pix->r = value * 255;
        pix->g = interpolate(hue, 0.0, 0.25, v_min, value) * 255;
        pix->b = v_min * 255;

    } else if (hue < 0.5) {
        pix->r = interpolate(hue, 0.25, 0.5, value, v_min) * 255;
        pix->g = value * 255;
        pix->b = v_min * 255;

    } else if (hue < 0.75) {
        pix->r = v_min * 255;
        pix->g = value * 255;
        pix->b = interpolate(hue, 0.5, 0.75, v_min, value) * 255;

    } else {
        pix->r = v_min * 255;
        pix->g = interpolate(hue, 0.75, 1.0, value, v_min) * 255;
        pix->b = value * 255;
    }

    pix->a = 255;
}
1 голос
/ 09 февраля 2011

Термин, который вы ищете, это ложное цветное изображение .

Как выбрать цветные полосы зависит от того, что вы пытаетесь показать. Простой способ - разделить данные на две половины, выше и ниже среднего диапазона

Для нижней половины вы устанавливаете красный = 0, затем синий = (255 - ваше значение), зеленый = (ваше значение). Это даст вам цвет между самым синим для самого низкого значения и зеленым для самого высокого.

Затем в верхнем диапазоне установите синий = 0, красный = ваше значение, зеленый = 255- (ваше значение), это даст вам красный цвет для самого высокого значения и зеленый для самого низкого.

Вы также можете изменить форму кривой, чтобы подчеркнуть определенные диапазоны

...