RGB与YUV转换

RGBYUV 转换

RGBYCbCr

正变换:
[ Y C b C r ] = [ 0.299 0.587 0.114 − 0.169 − 0.331 0.499 0.499 − 0.418 − 0.0813 ] [ R G B ] + [ 0 128 128 ] \begin{bmatrix} Y \\ Cb \\Cr \end{bmatrix} = \begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.169 & -0.331 & 0.499 \\ 0.499 & -0.418 & -0.0813 \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} + \begin{bmatrix} 0 \\ 128 \\ 128 \end{bmatrix} YCbCr=0.2990.1690.4990.5870.3310.4180.1140.4990.0813RGB+0128128
逆变换:
[ R G B ] = [ 1.0 0.0 1.402 1.0 − 0.344 − 0.714 1.0 1.772 0.0 ] [ Y C b − 128 C r − 128 ] \begin{bmatrix} R \\ G \\ B \end{bmatrix} = \begin{bmatrix} 1.0 & 0.0 & 1.402 \\ 1.0 & -0.344 & -0.714 \\ 1.0 & 1.772 & 0.0 \end{bmatrix} \begin{bmatrix} Y \\ Cb - 128 \\ Cr - 128 \end{bmatrix} RGB=1.01.01.00.00.3441.7721.4020.7140.0YCb128Cr128

RGBYCoCg

直接转换

正变换:
[ Y C o C g ] = [ 1 / 4 1 / 2 1 / 4 1 / 2 0 − 1 / 2 − 1 / 4 1 / 2 − 1 / 4 ] [ R G B ] \begin{bmatrix} Y \\ Co \\Cg \end{bmatrix} = \begin{bmatrix} 1/4 & 1/2 & 1/4 \\ 1/2 & 0 & -1/2 \\ -1/4 & 1/2 & -1/4 \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} YCoCg=1/41/21/41/201/21/41/21/4RGB
逆变换:
[ R G B ] = [ 1 1 − 1 1 0 1 1 − 1 − 1 ] [ Y C o C g ] \begin{bmatrix} R \\ G \\B \end{bmatrix} = \begin{bmatrix} 1 & 1 & -1 \\ 1 & 0 & 1 \\ 1 & -1 & -1 \end{bmatrix} \begin{bmatrix} Y \\ Co \\Cg \end{bmatrix} RGB=111101111YCoCg

可逆变换 YCoCg-R

正变换:
C o = R − B t = B + ( C o > > 1 ) C g = G − t Y = t + ( C g > > 1 ) Co = R - B \\ t = B + (Co >> 1) \\ Cg = G - t \\ Y = t + (Cg >> 1) Co=RBt=B+(Co>>1)Cg=GtY=t+(Cg>>1)
逆变换:
t = Y − ( C g > > 1 ) G = C g + t B = t − ( C o > > 1 ) R = B + C o t = Y - (Cg >> 1) \\ G = Cg + t \\ B = t - (Co >> 1) \\ R = B + Co t=Y(Cg>>1)G=Cg+tB=t(Co>>1)R=B+Co
正变换实现:

/***************************************************************************************************
* Function : Color Space Conversion (CSC), RGB -> YCoCg
* Parameter: *
*        src            -I      original data
*        dst            -IO     converted data
*        width          -I      picture width
*        height         -I      picture height
*        bit_depth      -I      bit depth
* Return   : None
* Notes    :
***************************************************************************************************/
HIM_VOID HIM_CSC_Rgb_To_YCoCg(HIM_PEL *src,
                              HIM_PEL *dst,
                              HIM_S32  width,
                              HIM_S32  height,
                              HIM_U08  bit_depth)
{
    HIM_S32 x     = 0;
    HIM_S32 co    = 0;
    HIM_S32 cg    = 0;
    HIM_S32 tmp   = 0;
    HIM_S32 numpx = width * height;
    HIM_PEL *p_r  = src;
    HIM_PEL *p_g  = src + numpx;
    HIM_PEL *p_b  = src + (numpx << 1);
    HIM_PEL *p_y  = dst;
    HIM_PEL *p_u  = dst + numpx;
    HIM_PEL *p_v  = dst + (numpx << 1);

    for (x = 0; x < numpx; x++)
    {
        co  = p_r[x] - p_b[x];
        tmp = p_b[x] + (co >> 1);
        cg  = p_g[x] - tmp;

        p_y[x] = HIM_CLIP(tmp + (cg >> 1), 0, (1 << bit_depth) - 1);                 // Y
        p_u[x] = HIM_CLIP(co + (1 << bit_depth), 0, (1 << (bit_depth + 1)) - 1);     // Co
        p_v[x] = HIM_CLIP(cg + (1 << bit_depth), 0, (1 << (bit_depth + 1)) - 1);     // Cg
        if (bit_depth == 16)
        {
            p_u[x] = (p_u[x] + 1) >> 1;
            p_v[x] = (p_v[x] + 1) >> 1;
        }
    }
}

逆变换实现:

/***************************************************************************************************
* Function : Color Space Conversion (CSC), YCoCg -> RGB
* Parameter: *
*        src            -IO     original data and converted data
*        width          -I      picture width
*        height         -I      picture height
*        bit_depth      -I      bit depth
* Return   : None
* Notes    :
***************************************************************************************************/
HIM_VOID HIM_CSC_YCoCg_To_Rgb(HIM_PEL *src,
                              HIM_S32  width,
                              HIM_S32  height,
                              HIM_U08  bit_depth)
{
    HIM_S32 x     = 0;
    HIM_S32 temp  = 0;
    HIM_S32 y     = 0;
    HIM_S32 co    = 0;
    HIM_S32 cg    = 0;
    HIM_S32 r     = 0;
    HIM_S32 g     = 0;
    HIM_S32 b     = 0;
    HIM_S32 numpx = width * height;
    HIM_PEL *p_r  = src;
    HIM_PEL *p_g  = src + numpx;
    HIM_PEL *p_b  = src + (numpx << 1);

    for (x = 0; x < numpx; x++) 
    {
        y = p_r[x];
        if (bit_depth == 16)
        {
            co = (p_g[x] << 1) - (1 << bit_depth);
            cg = (p_b[x] << 1) - (1 << bit_depth);
        }
        else
        {
            co = p_g[x] - (1 << bit_depth);
            cg = p_b[x] - (1 << bit_depth);
        }

        temp = y - (cg >> 1);
        g    = cg + temp;
        b    = temp - (co >> 1);
        r    = co + b;

        p_r[x] = HIM_CLIP(r, 0, (1 << bit_depth) - 1);
        p_g[x] = HIM_CLIP(g, 0, (1 << bit_depth) - 1);
        p_b[x] = HIM_CLIP(b, 0, (1 << bit_depth) - 1);
    }
}

优点

  • 计算简单,复杂度低
  • 无损转换
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值