RGB↔HSL変換と色相・彩度補正

詳しくはこちら。

手っ取り早く使いたい方は以下。プログラムもどき記法です。

  • R, G, B ∈ [0, 1]
  • H ∈ [0, 1)
  • S, L ∈ [0, 1]

RGB→HSL

sub rgb_to_hsl(R, G, B)
{
    M = max(R, G, B);
    m = min(R, G, B);
    C = M - m;
    
    H = undefined;
    S = 0;
    L = (M + m) / 2;
    
    if (C != 0) {
        if (L <= 0.5) {
            S = C / (2*L);
        }
        else {
            S = C / (2 - 2*L);
        }
        
        if (R == M) {
            H = (G - B) / C;
            if (H < 0) {
                H += 6;
            }
        }
        else if (G == M) {
            H = (B - R) / C + 2;
        }
        else if (B == M) {
            H = (R - G) / C + 4;
        }
        H /= 6;
    }
    
    return (H, S, L);
}

HSL→RGB

sub hsl_to_rgb(H, S, L)
{
    R, G, B;
    C, m;
    
    if (S == 0) {
        R = G = B = L;
    }
    else {
        if (L <= 0.5) {
            C = 2*L * S;
        }
        else {
            C = (2 - 2*L) * S;
        }
        m = L - C/2;
        
        R = hsl_value(6*H + 2, C, m);
        G = hsl_value(6*H, C, m);
        B = hsl_value(6*H - 2, C, m);
    }
}

sub hsl_value(hh, C, m)
{
    val;
    
    if (hh < 0) {
        hh += 6;
    }
    else if (hh >= 6) {
        hh -= 6;
    }
    
    if (hh < 1) {
        val = C * hh;
    }
    else if (hh < 3) {
        val = C;
    }
    else if (hh < 4) {
        val = C * (4 - hh);
    }
    else {
        val = 0;
    }
    val += m;
    
    return val;
}

色相・彩度補正

色相・彩度・明度の補正量の値域を次のようにする。

  • vH ∈ [-1/2, 1/2]
  • vS ∈ [-1, 1]
  • vL ∈ [-1, 1]

すると補正後の値は次のようになる。

  • H' = H + vH
  • S' = min((1 + vS)S, 1)
  • L' =
    • (1 + vL)L, if vL < 0
    • L + vL(1 - L), if vL ≥ 0

Photoshop (CS4) では vS > 0 の場合を除きこの計算式で補正後の色が求められる。(値はマッピングする必要がある)