14

ケルビン/摂氏で温度を取得してRGBを返すアルゴリズムを知っている人はいますか?

赤外線カメラのように。

私はいくつかのリンクを見つけました:

http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_T.html

http://www.fourmilab.ch/documents/specrend/specrend.c

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

しかし、XYZ色が何であるかわかりませんか?

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

気温は摂氏だけです。

私はそれを任意の温度に変換することができます温度変換式

更新: 黒体カラーデータファイル 私はこれを見つけました..しかし、それらのケルビン度は不可能です..つまり、赤は暑いと思われます..だから、なぜ8000kは青で、1000kは赤です...

4

5 に答える 5

9

最良のオプションは、GetPixelで画像を使用することです。

温度勾配

private void UpdateTemp()
{
    Bitmap temps = (Bitmap)Properties.Resources.temp;
    if (curTemp >= 0)
    {
        int i = curTemp;
        if (i < 0)
            i = 0;
        if (i > temps.Width-1)
            i = temps.Width-1;
        this.BackColor = temps.GetPixel(i, 10);
    }
}

または、アレイを構築します。ソース

    private static Color[] colors = 
    {
        Color.FromArgb(155, 188, 255), //    40000
        Color.FromArgb(155, 188, 255), //    39500
        Color.FromArgb(155, 188, 255), //    39000
        Color.FromArgb(155, 188, 255), //    38500
        Color.FromArgb(156, 188, 255), //    38000
        Color.FromArgb(156, 188, 255), //    37500
        Color.FromArgb(156, 189, 255), //    37000
        Color.FromArgb(156, 189, 255), //    36500
        Color.FromArgb(156, 189, 255), //    36000
        Color.FromArgb(157, 189, 255), //    35500
        Color.FromArgb(157, 189, 255), //    35000
        Color.FromArgb(157, 189, 255), //    34500
        Color.FromArgb(157, 189, 255), //    34000
        Color.FromArgb(157, 189, 255), //    33500
        Color.FromArgb(158, 190, 255), //    33000
        Color.FromArgb(158, 190, 255), //    32500
        Color.FromArgb(158, 190, 255), //    32000
        Color.FromArgb(158, 190, 255), //    31500
        Color.FromArgb(159, 190, 255), //    31000
        Color.FromArgb(159, 190, 255), //    30500
        Color.FromArgb(159, 191, 255), //    30000
        Color.FromArgb(159, 191, 255), //    29500
        Color.FromArgb(160, 191, 255), //    29000
        Color.FromArgb(160, 191, 255), //    28500
        Color.FromArgb(160, 191, 255), //    28000
        Color.FromArgb(161, 192, 255), //    27500
        Color.FromArgb(161, 192, 255), //    27000
        Color.FromArgb(161, 192, 255), //    26500
        Color.FromArgb(162, 192, 255), //    26000
        Color.FromArgb(162, 193, 255), //    25500
        Color.FromArgb(163, 193, 255), //    25000
        Color.FromArgb(163, 193, 255), //    24500
        Color.FromArgb(163, 194, 255), //    24000
        Color.FromArgb(164, 194, 255), //    23500
        Color.FromArgb(164, 194, 255), //    23000
        Color.FromArgb(165, 195, 255), //    22500
        Color.FromArgb(166, 195, 255), //    22000
        Color.FromArgb(166, 195, 255), //    21500
        Color.FromArgb(167, 196, 255), //    21000
        Color.FromArgb(168, 196, 255), //    20500
        Color.FromArgb(168, 197, 255), //    20000
        Color.FromArgb(169, 197, 255), //    19500
        Color.FromArgb(170, 198, 255), //    19000
        Color.FromArgb(171, 198, 255), //    18500
        Color.FromArgb(172, 199, 255), //    18000
        Color.FromArgb(173, 200, 255), //    17500
        Color.FromArgb(174, 200, 255), //    17000
        Color.FromArgb(175, 201, 255), //    16500
        Color.FromArgb(176, 202, 255), //    16000
        Color.FromArgb(177, 203, 255), //    15500
        Color.FromArgb(179, 204, 255), //    15000
        Color.FromArgb(180, 205, 255), //    14500
        Color.FromArgb(182, 206, 255), //    14000
        Color.FromArgb(184, 207, 255), //    13500
        Color.FromArgb(186, 208, 255), //    13000
        Color.FromArgb(188, 210, 255), //    12500
        Color.FromArgb(191, 211, 255), //    12000
        Color.FromArgb(193, 213, 255), //    11500
        Color.FromArgb(196, 215, 255), //    11000
        Color.FromArgb(200, 217, 255), //    10500  
        Color.FromArgb(204, 219, 255), //    10000
        Color.FromArgb(208, 222, 255), //    9500
        Color.FromArgb(214, 225, 255), //    9000
        Color.FromArgb(220, 229, 255), //    8500
        Color.FromArgb(227, 233, 255), //    8000
        Color.FromArgb(235, 238, 255), //    7500
        Color.FromArgb(245, 243, 255), //    7000
        Color.FromArgb(255, 249, 253), //    6500
        Color.FromArgb(255, 243, 239), //    6000
        Color.FromArgb(255, 236, 224), //    5500
        Color.FromArgb(255, 228, 206), //    5000
        Color.FromArgb(255, 219, 186), //    4500
        Color.FromArgb(255, 209, 163), //    4000
        Color.FromArgb(255, 196, 137), //    3500
        Color.FromArgb(255, 180, 107), //    3000
        Color.FromArgb(255, 161,  72), //    2500
        Color.FromArgb(255, 137,  18), //    2000
        Color.FromArgb(255, 109,   0), //    1500 
        Color.FromArgb(255,  51,   0), //    1000
    };
于 2011-09-03T16:13:31.960 に答える
5

これは2年前のスレッドだと思いますが、同じ苦境にありました。

カラーテーブルからデータを取得し、PythonでNumpy.polyfitを使用して区分的5次多項式フィッティングを適用しました。これらの係数から、以下のC#関数を思い付くことができました。近似の決定係数の値は、0.999に近いかそれを超えています。ほとんどのドメインで0.01%未満のエラーが発生しますが、3%に近い点がいくつかあります。ただし、ほとんどの状況では十分なはずです。

private Color blackBodyColor(double temp)
{
    float x = (float)(temp / 1000.0);
    float x2 = x * x;
    float x3 = x2 * x;
    float x4 = x3 * x;
    float x5 = x4 * x;

    float R, G, B = 0f;

    // red
    if (temp <= 6600)
        R = 1f;
    else
        R = 0.0002889f * x5 - 0.01258f * x4 + 0.2148f * x3 - 1.776f * x2 + 6.907f * x - 8.723f;

    // green
    if (temp <= 6600)
        G = -4.593e-05f * x5 + 0.001424f * x4 - 0.01489f * x3 + 0.0498f * x2 + 0.1669f * x - 0.1653f;
    else
        G = -1.308e-07f * x5 + 1.745e-05f * x4 - 0.0009116f * x3 + 0.02348f * x2 - 0.3048f * x + 2.159f;

    // blue
    if (temp <= 2000f)
        B = 0f;
    else if (temp < 6600f)
        B = 1.764e-05f * x5 + 0.0003575f * x4 - 0.01554f * x3 + 0.1549f * x2 - 0.3682f * x + 0.2386f;
    else
        B = 1f;

    return Color.FromScRgb(1f, R, G, B);
}
于 2013-11-25T01:43:55.507 に答える
3

正しければ、XYZ色空間の理論的な背景を探しています

于 2011-08-29T12:22:45.630 に答える
2

色温度は、何か(理論的には「理想的な黒体」)から放出される光の実際の色に基づいており、その温度のみに基づいて光を放出します。

この種の光源のいくつかの例:赤く光る電気ストーブ要素がある場合、それは約1000Kである可能性があります。通常の白熱電球のフィラメントは約2700Kで、太陽は約5700Kです。3つすべてが「黒体」の公正な近似です。それらは実際の温度に基づいて特定のスペクトルの光を放出します。

多くの人工光源は、実際にはそれらが放出する光の「温度」ではありません(そして、それらのスペクトルは一般に黒体スペクトルでもありません...)。代わりに、それらの「温度」評価は、そのの光を放出するために理論上の黒体が必要とする温度です。黒体では生成できない色もあります。より「自然な」外観の黒体照明と比較して、緑がかったまたは紫がかった光です。

コメントの1つで述べたように、おそらくあなたが考えている種類の赤外線カメラのディスプレイはすべて偽色です。偽色のディスプレイでは、色は便宜上選択されています。したがって、赤外線カメラの場合、暖色の場合は「暑い」ように見える赤、寒い場合は「寒い」ように見える青を選択する場合があります。しかし、彼らは黒から白、またはフクシアから緑までの範囲を同じように簡単に選ぶことができました。

偽色の表示は任意であるため、温度を推定する場合は、特定の画像またはシステムのカラーキーを確認する必要があります(科学的な画像には通常、この目的のために何らかのカラーキーが必要です)。カラーキーがなく、画像がどのように生成されたかに関するドキュメントがない場合は、運が悪いです。

于 2011-08-29T19:54:37.377 に答える
0

上記の関数は、温度が10000 Kを超えると赤色を過大評価します。温度が14000を超えると、色が紫色に変わります。データを7次多項式で再近似しました。の係数は次のようになります。

def temp_to_rgb(temp):
    t = temp/1000.

    # calculate red
    if t < 6.527:
        red = 1.0
    else:
        coeffs = [  4.93596077e+00,  -1.29917429e+00,
                    1.64810386e-01,  -1.16449912e-02,
                    4.86540872e-04,  -1.19453511e-05,
                    1.59255189e-07,  -8.89357601e-10]
        tt = min(t,40)
        red = poly(coeffs,tt)
    red = max(red,0)
    red = min(red,1)

    # calcuate green
    if t < 0.85:
        green = 0.0
    elif t < 6.6:
        coeffs = [ -4.95931720e-01,   1.08442658e+00,
                   -9.17444217e-01,   4.94501179e-01,
                   -1.48487675e-01,   2.49910386e-02,
                   -2.21528530e-03,   8.06118266e-05]
        green = poly(coeffs,t)
    else:
        coeffs = [  3.06119745e+00,  -6.76337896e-01,
                    8.28276286e-02,  -5.72828699e-03,
                    2.35931130e-04,  -5.73391101e-06,
                    7.58711054e-08,  -4.21266737e-10]
        tt = min(t,40)
        green = poly(coeffs,tt)
    green = max(green,0)
    green = min(green,1)

    # calculate blue
    if t < 1.9:
        blue = 0.0
    elif t < 6.6:
        coeffs = [  4.93997706e-01,  -8.59349314e-01,
                    5.45514949e-01,  -1.81694167e-01,
                    4.16704799e-02,  -6.01602324e-03,
                    4.80731598e-04,  -1.61366693e-05]
        blue = poly(coeffs,t)
    else:
        blue = 1.0
    blue = max(blue,0)
    blue = min(blue,1)

    return (red,green,blue)

ここで、poly(coeffs、x)= coeffs [0] + coeffs [1] * x + coeffs [2] * x ** 2 + .. ..

申し訳ありませんが、C#に精通していませんが、コードは簡単に読み取ることができます。

誤差は、ほとんどの場合0.5%以内で、温度= 6600 Kの赤では最大1.2%です。ここでは高次の多項式が採用されているため、温度> 40000 Kでは赤と緑を一定に保つ必要があります。そうしないと、奇妙なことが起こります。

于 2014-07-21T00:43:29.810 に答える