3

画像合成用のカラー ルックアップ テーブルの作成に関して、誰かアドバイスや良いリソースを教えてくれる人はいないかと思っていました。私のアプリケーションでは、RGB 空間にマッピングする必要がある -1.0 から 1.0 までの浮動小数点値があります。問題は、これらの浮動小数点値の精度が事前にわからないため、ルックアップ テーブルに入力するエントリの数や、それらがどうあるべきかがわからないことです。この形式のデータを色にマッピングするために一般的に使用される手法はありますか? 画像データのドメイン内の値の範囲に基づいて、各画像の新しいカラー テーブルを作成するのはコストがかかりすぎるようです。

マッピングの値の範囲を定義するとうまくいくと思いますが、考えを教えてください。また、カラー ルックアップ テーブルを作成するための既存のツール (できれば Python ベース) を誰かが知っていれば、役立つでしょう。

4

2 に答える 2

1

ルックアップ テーブルを使用する必要があり、浮動小数点データを扱っている場合は、浮動小数点データを個別の範囲に量子化し、テーブル内の各範囲をルックアップする必要があります。

ただし、ここではルックアップ テーブルを使用するのは適切ではないようです。float 値を入力として受け取り、RGB 値を返すマッピング関数を定義してみませんか? これをフラクタルの色付けに使用しました ( http://jk.ozlabs.org/projects/lca2008-hackfest/の「色付け」セクションを参照)。

基本的に、私のアプローチは、彩度と値に定数値を使用し、色相に浮動小数点入力データを使用して、単純化された HSV から RSB への変換を行うことです。これにより、値に次の RGB 出力が与えられます。

i から RGB への変換

このマッピング関数を使用して色付けされたフラクタルについては、 http://jk.ozlabs.org/blog/post/65/hackfest08-solution-2/を参照してください。

これを行うためのCコードがいくつかありますが、これは簡単にPythonに変換できます。これは 0 <= i <= 1 を想定していますが、おそらく -1 <= i <= 1 が必要であることに注意してください。

/* 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;
}
于 2011-02-15T03:55:51.690 に答える
1

あなたが探している用語はfalse color imageです。

カラー バンドの選択方法は、何を表示しようとしているかによって異なります。簡単な方法は、データを中間範囲の上と下の 2 つの半分に分割することです。

下半分には赤= 0、次に青=(255 - あなたの値)、緑=(あなたの値)を設定します。これにより、最も低い値のほとんどの青と最も高い値の緑の間の色が得られます。

次に、高い範囲で、青 = 0、赤 = あなたの値、緑 = 255-(あなたの値) を設定します。これにより、最高値が赤、最低値が緑の色が得られます。

曲線の形状を変更して、特定の範囲を強調することもできます

于 2011-02-09T00:06:31.597 に答える