13

0〜100の範囲のfloatの特定の配列(Python)があります。色が緑(0に対応)から赤(100)に変化するように、疑似カラー画像を作成したいと思います。これはmatplotlibのpcolorに似ています。ただし、pcolorは使いたくありません。

pseudocolorForValue(val,(minval,maxval))の疑似カラー値に対応するRGBトリプルを返すような関数はありますvalか?また、この機能には、色を緑から赤に表示するか、赤から緑に表示するかを選択する柔軟性がありますか?

ありがとう、ニック

4

3 に答える 3

18

値0…100→0…120度を変換し、その値をHSV(またはHLS)色空間の色のH(または角度)として使用する独自の関数を作成できます。次に、これを表示用にRGBカラーに変換できます。線形に解釈された色は、この色空間で計算すると見栄えがよくなります。HSV色空間は次のようになります。

hsv色空間図

アップデート:

朗報ですが、Pythonの組み込みcolorsysモジュールに色空間変換ルーチンがあることを発見して嬉しく思いました(これらは実際には「バッテリーが含まれている」という意味です)。これの良いところは、以下に示すように、私が説明したことを実行する関数をかなり簡単に作成できることです。

from colorsys import hsv_to_rgb

def pseudocolor(val, minval, maxval):
    """ Convert val in range minval..maxval to the range 0..120 degrees which
        correspond to the colors Red and Green in the HSV colorspace.
    """
    h = (float(val-minval) / (maxval-minval)) * 120

    # Convert hsv color (h,1,1) to its rgb equivalent.
    # Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
    r, g, b = hsv_to_rgb(h/360, 1., 1.)
    return r, g, b

if __name__ == '__main__':
    steps = 10

    print('val       R      G      B')
    for val in range(0, 100+steps, steps):
        print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                                                val, *pseudocolor(val, 0, 100)))

出力:

val       R      G      B
  0 -> (1.000, 0.000, 0.000)
 10 -> (1.000, 0.200, 0.000)
 20 -> (1.000, 0.400, 0.000)
 30 -> (1.000, 0.600, 0.000)
 40 -> (1.000, 0.800, 0.000)
 50 -> (1.000, 1.000, 0.000)
 60 -> (0.800, 1.000, 0.000)
 70 -> (0.600, 1.000, 0.000)
 80 -> (0.400, 1.000, 0.000)
 90 -> (0.200, 1.000, 0.000)
100 -> (0.000, 1.000, 0.000)

出力がどのように見えるかを示すサンプルを次に示します。

HSV色空間での色補間を示すサンプル

私の他の答えよりも、生成された色の方が良いと思うかもしれません。

一般化:

現在ハードコーディングされている赤と緑以外の色で機能するという意味で、この関数をもう少し一般的なものに変更することができます。

その方法は次のとおりです。

def pseudocolor(val, minval, maxval, start_hue, stop_hue):
    """ Convert val in range minval..maxval to the range start_hue..stop_hue
        degrees in the HSV colorspace.
    """
    h = (float(val-minval) / (maxval-minval)) * (stop_hue-start_hue) + start_hue

    # Convert hsv color (h,1,1) to its rgb equivalent.
    # Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
    r, g, b = hsv_to_rgb(h/360, 1., 1.)
    return r, g, b

if __name__ == '__main__':
    # angles of common colors in hsv colorspace
    RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA = range(0, 360, 60)
    steps = 10

    print('val       R      G      B')
    for val in range(0, 100+steps, steps):
        print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                val, *pseudocolor(val, 0, 100, YELLOW, BLUE)))

結果:

黄色と青の間のHSV色空間での色補間を示すサンプル

于 2012-06-05T18:03:59.473 に答える
7

HLSまたはHSV色空間でHを補間するほどきれいではありませんが、実装するアプローチがはるかに簡単なのは、RGBのred (1,0,0)完全な緑と完全な緑の間の線形補間された色に対応する3つのコンポーネントに単一の値をマッピングする関数を作成することです。(0,1,0)色空間。

これが私が意味することです:

def pseudocolor(val, minval, maxval):
    """ Convert value in the range minval...maxval to a color between red
        and green.
    """
    f = float(val-minval) / (maxval-minval)
    r, g, b = 1-f, f, 0.
    return r, g, b

if __name__ == '__main__':
    steps = 10
    print('val       R      G      B')
    for val in xrange(0, 100+steps, steps):
        print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                    val, *pseudocolor(val, 0, 100)))

出力:

val       R      G      B
  0 -> (1.000, 0.000, 0.000)
 10 -> (0.900, 0.100, 0.000)
 20 -> (0.800, 0.200, 0.000)
 30 -> (0.700, 0.300, 0.000)
 40 -> (0.600, 0.400, 0.000)
 50 -> (0.500, 0.500, 0.000)
 60 -> (0.400, 0.600, 0.000)
 70 -> (0.300, 0.700, 0.000)
 80 -> (0.200, 0.800, 0.000)
 90 -> (0.100, 0.900, 0.000)
100 -> (0.000, 1.000, 0.000)

浮動小数点のr、g、bコンポーネントは、0..255の範囲の整数など、必要に応じて変換できます。

出力がどのように見えるかを示すサンプルを次に示します。

RGB色空間での補間を示す画像

緑から赤に変更する場合は、関数のrgの計算を逆にします。追加の労力をあまりかけずに、概念を一般化して、任意の2つの色の間で線形補間を行うことができます。

これを行う方法は次のとおりです。

def pseudocolor(val, minval, maxval, startcolor, stopcolor):
    """ Convert value in the range minval...maxval to a color in the range
        startcolor to stopcolor. The colors passed and the the one returned are
        composed of a sequence of N component values.
    """
    f = float(val-minval) / (maxval-minval)
    return tuple(f*(b-a)+a for (a, b) in zip(startcolor, stopcolor))

if __name__ == '__main__':
    YELLOW, BLUE = (1, 1, 0), (0, 0, 1)
    steps = 10

    print('val       R      G      B')
    for val in range(0, 100+steps, steps):
        print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                    val, *pseudocolor(val, 0, 100, YELLOW, BLUE)))

提供された色を使用したサンプル出力:

異なる色のRGB色空間での補間を示す画像

于 2012-06-06T03:36:51.080 に答える
5

matplolibの組み込みカラーマップに直接アクセスできます。これは、pcolorがカラーマッピングを決定するために使用するものとまったく同じです。各マップは、範囲[0、1]のfloatを受け取り、コンポーネント(R、G、B、A)を含む範囲[0、1]のfloatの4要素タプルを返します。jet標準のカラーマップを使用してRGBAタプルを返す関数の例を次に示します。

from matplotlib import cm

def pseudocolor(val, minval, maxmal):
    # Scale val to be in the range [0, 1]
    val = (val - minval) / (maxval - minval)
    # Return RGBA tuple from jet colormap
    return cm.jet(val)

pseudocolor(20, 0, 100)
# Returns: (0.0, 0.3, 1.0, 1.0)

pseudocolor(80, 0, 100)
# Returns: (1.0, 0.4074, 0.0, 1.0)

これは、下の画像に示されている色の範囲にマップされます。

ここに画像の説明を入力してください

この方法の便利な機能の1つは、、、など に変更することで、matplotlibカラーマップのいずれかに簡単に切り替えることができることです。cm.jetcm.rainbowcm.nipy_spectralcm.Accent

于 2016-09-07T12:31:00.997 に答える