LoginSignup
4
4

More than 3 years have passed since last update.

pythonで写真の色温度(Kelvin)に調節

Posted at

色温度からRGBに転換

色温度は画像処理で良く使う概念です。色温度から具体的なRGBの数値に転換の方法は幾つありますが、ほとんどの方法は色温度の数値によって、色座標やRGB空間に転換し、ピクセルのRGB値を求める。異なる計算式を使って、精度や効率は違うです。つまり、色温度からRGBの転換の結果は唯一ではないです。

出力の1000kから40000kの画像:
1000k-40000k.png

今回紹介したい方法は、色座標やRGB空間に転換ではなく、色温度からピクセルのRGBの数値を計算出来で、効率的な方法です。

色温度からRGB相対値の計算式

Charity’s original blackbody valuesからのデータを参考し、RGB値と色温度の変化曲線で表示する。
20200126173517800.png

そして、数式を使って曲線の流れを表現します。曲線あてはめにする。

色温度とRGB値曲線あてはめ

20200126173646108.png
20200126173706423.png
20200126173713861.png
20200126173737894.png

ここで使ったのは簡単な指数と対数関数です。異なる関数を使って曲線をフィットして、最終の精度も違います。

python転換関数

def calc_kelvin(stepSize): 

    temp = 6600
    temp = (temp + stepSize) / 100

    if(temp<=66):
        red = 255
    else:
        red = temp-60
        red = 329.698727446 * pow(red,-0.1332047592)

        if(red < 0):
            red = 0
        if(red>255):
            red =255


    if(temp <= 66):
        green = temp
        green = 99.4708025861 * math.log(green) - 161.1195681661

        if(green < 0):
            green = 0
        if(green > 255): 
            green = 255
    else:

        green = temp - 60
        green = 288.1221695283 * pow(green, -0.0755148492)

        if(green < 0): 
            green = 0

        if(green > 255): 
            green = 255

    if(temp>=66):
        blue = 255
    else:
        if(temp<=19):
            blue = 0
        else:
            blue = temp - 10
            blue = 138.5177312231 * math.log(blue) - 305.0447927307
            if(blue<0):
                blue = 0
            if(blue>255):
                blue = 255

    print("red:"+str(red) + ",green:"+ str(green) + ",blue:"+str(blue))
    return red,green,blue

最終の調節結果:
img.jpg

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4