【darknet源碼解析-28】圖像RGB2YUV與YUV2RGB格式互轉

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

 

  • RGB格式轉爲YUV格式

\begin{bmatrix}Y \\ U \\ V \end{bmatrix}=\begin{bmatrix}0.299 & 0.587 & 0.114 \\ -0.1678 & -0.3313 & 0.5\\ 0.5 & -0.4187 & -0.0813 \end{bmatrix} \begin{bmatrix}R \\ G \\ B \end{bmatrix}

 對應函數如下:

void rgb_to_yuv(image im)
{
    assert(im.c == 3);
    int i, j;
    float r, g, b;
    float y, u, 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);

            y = .299*r + .587*g + .114*b;
            u = -.14713*r + -.28886*g + .436*b;
            v = .615*r + -.51499*g + -.10001*b;

            set_pixel(im, i, j, 0, y);
            set_pixel(im, i, j, 1, u);
            set_pixel(im, i, j, 2, v);
        }
    }
}

 

  • YUV格式轉化RGB格式

\begin{bmatrix}R \\ G \\ B \end{bmatrix}=\begin{bmatrix}1 & 0 & 1.402 \\ 1 & -0.34414 & -0.71414\\ 1 & 1.1772 & 0 \end{bmatrix} \begin{bmatrix}Y \\ U \\ V \end{bmatrix}

void yuv_to_rgb(image im)
{
    assert(im.c == 3);
    int i, j;
    float r, g, b;
    float y, u, v;
    for(j = 0; j < im.h; ++j){
        for(i = 0; i < im.w; ++i){
            y = get_pixel(im, i , j, 0);
            u = get_pixel(im, i , j, 1);
            v = get_pixel(im, i , j, 2);

            r = y + 1.13983*v;
            g = y + -.39465*u + -.58060*v;
            b = y + 2.03211*u;

            set_pixel(im, i, j, 0, r);
            set_pixel(im, i, j, 1, g);
            set_pixel(im, i, j, 2, b);
        }
    }
}

[參考資料]

1. https://zhuanlan.zhihu.com/p/75735751

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