HSI変換

以下のコードは、HSI双六角錘カラーモデルによるHSI変換です。

/*
RGBからHSIへ変換する
R、G、B、S、Iは0〜1の範囲にあるものとする。
Hは0〜2πの範囲にあるものとする。
*/

#define MAX( a, b ) a > b ? a : b
#define MIN( a, b ) a < b ? a : b

void RGB2HSI
( double dR, double dG, double dB, double *pdH, double *pdS, double *pdI )
{
    double dMax, dMin;
    double dXR, dXG, dXB;
    
    dMax = MAX( MAX( dR, dG), dB );
    dMin = MIN( MIN( dR, dG), dB );
    
    // 明度を計算
    *pdI = (dMax + dMin)/2;
    
    // 彩度を計算
    if ( dMax == dMin )
        *pdS = 0.0;
    else
    {
        if ( *pdI <= 0.5 )
        {
            *pdS = (dMax-dMin)/(dMax+dMin);
        }
        else
        {
            *pdS = (dMax-dMin)/(2-dMax-dMin);
        }
    }
    
    // 色相を計算
    if ( dMax == dMin )
    {
        dXR = (dMax - dR) / (dMax - dMin);
        dXG = (dMax - dG) / (dMax - dMin);
        dXB = (dMax - dB) / (dMax - dMin);
        
        if ( dXR = 0.0 )
        {
            *pdH = (dXB - dXG)*PI/3;
        }
        if ( dXG = 0.0 )
        {
            *pdH = (2 + dR - dG)*PI/3;
        }
        if ( dXB = 0.0 )
        {
            *pdH = (4 + dG - dR)*PI/3;
        }
        if ( *pdH < 0 )
        {
            *pdH += 2*PI;
        }
    }
    else    /* Hは不定 */
        *pdH = -0.99E+37;
}

.Netなら、、

.NetのSystem::Drawing::Color構造体にあるGetHue()
GetSaturation()GetBrightness()関数はそれぞれHSIの値を返しますが、
そのモデルは双六角錐のようです。ただし、逆変換はありません。

参考文献

アーカイブ