2013年7月11日 星期四

【Image Processing】HSV Color Space 顏色空間

【為什麼要選擇HSV顏色空間】
RGB顏色空間容易受到光線影響,而HSV彩色空間較不容易受到光線的影響,因為RGB顏色空間的每個成份之間有很高的關聯性,而HSV顏色空間彼此是獨立的。

【HSV色彩空間,也稱為HSB】
Hue(H)稱為色相,顏色的屬性,例如藍色、黃色等。
 
Saturation(S)稱為飽和度,顏色的純度,值越高越鮮豔
Value(V)稱為色調,Brightness(B)稱為明度,兩者是一樣的東西

R = 0度,G = 120度,B = 240度,Y = 60度,C = 180度,M = 300度
R(Red)、G(Green)、B(Blue)、Y(Yellow)、C(Cyan)、M(Magenta)

【C】
void RGB2HSV( float r, float g, float b, float *h, float *s, float *v )
{
        float min, max, delta;
        min = MIN( r, g, b);
        max = MAX( r, g, b);
        *v = max;                              
        delta = max - min;

        if( max != 0 )
                *s = delta / max;     
        else 
        {
                *s = 0;
                *h = -1;
                return;
        }

        if( r == max )
                *h = ( g - b ) / delta;               
        else if( g == max )
                *h = 2 + ( b - r ) / delta;       
        else
                *h = 4 + ( r - g ) / delta;      
        *h *= 60;                           
        if( *h < 0 )
                *h += 360;
}

【C#】 
public static void RGB2HSV(int R, int G, int B, ref double h, ref double s, ref double v)
        {
            double r = (double)R / 255;
            double g = (double)G / 255;
            double b = (double)B / 255;

            double min, max, delta;

            min = Math.Min(r, Math.Min(g, b));
            max = Math.Max(r, Math.Max(g, b));

            v = max;//Get V value
            delta = max - min;
            if (max != 0)
            {
                s = delta / max;
                if (r == max)
                {
                    if (g < b)
                        h = (g - b) / delta + 6;                       
                }
                else
                {
                    if (g == max)
                    {
                        h = (b - r) / delta + 2;                       
                    }
                    else
                    {
                        h = (r - g) / delta + 4;                      
                    }                                      
                }
                h *= 60;
                s = s * 100;
                v = v * 100;
            }
            else
            {
                s = 0;
                h = 0;
            }            
        }

參考來源:
http://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

2 則留言: