【darknet源碼解析-29】圖像RGB2HSV與HSV2RGB格式互轉

本系列爲darknet源碼解析,由於在image.c中涉及到圖像的RGB,YUV,HSV格式,在本文我們將image.c中涉及到的rgb_to_hsv()函數以及hsv_to_rgb()函數進行解析.

  • RGB格式轉爲HSV格式

\large R = R/255,G = G/255, B = B/255;

\large max=max(R,G,B), min=min(R,G,B)

\large delta=max-min

  •  如果max=0

         \large H=0,S=0,V=0

  • 如果max!=0

        \large S=delta/max 

        \large V=max

        \large H= \left\{ \begin{matrix} (G-B)/delta &max=R \\ 2+(B-R)/delta &max=G \\ 4+(R-G)/delta &max=B \end{matrix}

        \large H= \left\{ \begin{matrix} (H+6)/6 & H<0 \\ H/6 &H\geq 0 \end{matrix}

對應源碼如下:

void rgb_to_hsv(image im)
{
    assert(im.c == 3);
    int i, j;
    float r, g, b;
    float h, s, v;
    for(j = 0; j < im.h; ++j){
        for(i = 0; i < im.w; ++i){
            r = get_pixel(im, i , j, 0);//獲取指定位置指定通道的像素值
            g = get_pixel(im, i , j, 1);
            b = get_pixel(im, i , j, 2);
            float max = three_way_max(r,g,b);//獲取rgb最大值
            float min = three_way_min(r,g,b);
            float delta = max - min;
            v = max;
            if(max == 0){
                s = 0;
                h = 0;
            }else{
                s = delta/max;
                if(r == max){
                    h = (g - b) / delta;
                } else if (g == max) {
                    h = 2 + (b - r) / delta;
                } else {
                    h = 4 + (r - g) / delta;
                }
                if (h < 0) h += 6;
                h = h/6.;
            }
            set_pixel(im, i, j, 0, h);//指定對應位置的對應通道的像素值
            set_pixel(im, i, j, 1, s);
            set_pixel(im, i, j, 2, v);
        }
    }
}
  • HSV格式轉爲RGB格式

     \large H=6*H,S=S,V=V;

  • 如果S==0:

       \large R=V,G=V,B=V;

  • 如果S != 0:

        \large p=V*(1-S)

        \large q=V*(1-S*(H-\left \lfloor H \right \rfloor))

        \large t=V*(1-S*(1-H+\left \lfloor H \right \rfloor))

       \large \left\{\begin{matrix}R=V,G=t,B=p; & \left \lfloor H \right \rfloor = 0 \\ R=q,G=V,B=p; & \left \lfloor H \right \rfloor = 1 \\ R=p,G=V,B=t; & \left \lfloor H \right \rfloor = 2 \\ R=p,G=q,B=V; & \left \lfloor H \right \rfloor = 3 \\ R=t,G=p,B=V; & \left \lfloor H \right \rfloor = 4 \\ R=V,G=p,B=q; & \left \lfloor H \right \rfloor = 5 & \end{matrix}\right.

對應源碼如下:

void hsv_to_rgb(image im)
{
    assert(im.c == 3);
    int i, j;
    float r, g, b;
    float h, s, v;
    float f, p, q, t;
    for(j = 0; j < im.h; ++j){
        for(i = 0; i < im.w; ++i){
            h = 6 * get_pixel(im, i , j, 0);
            s = get_pixel(im, i , j, 1);
            v = get_pixel(im, i , j, 2);
            if (s == 0) {
                r = g = b = v;
            } else {
                int index = floor(h);
                f = h - index;
                p = v*(1-s);
                q = v*(1-s*f);
                t = v*(1-s*(1-f));
                if(index == 0){
                    r = v; g = t; b = p;
                } else if(index == 1){
                    r = q; g = v; b = p;
                } else if(index == 2){
                    r = p; g = v; b = t;
                } else if(index == 3){
                    r = p; g = q; b = v;
                } else if(index == 4){
                    r = t; g = p; b = v;
                } else {
                    r = v; g = p; b = q;
                }
            }
            set_pixel(im, i, j, 0, r);
            set_pixel(im, i, j, 1, g);
            set_pixel(im, i, j, 2, b);
        }
    }
}

完.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章