RGB 与 YUV 转换
RGB 与 YCbCr
正变换:
[
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.299−0.1690.4990.587−0.331−0.4180.1140.499−0.0813⎦⎤⎣⎡RGB⎦⎤+⎣⎡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.0−0.3441.7721.402−0.7140.0⎦⎤⎣⎡YCb−128Cr−128⎦⎤
RGB 与 YCoCg
直接转换
正变换:
[
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/2−1/41/201/21/4−1/2−1/4⎦⎤⎣⎡RGB⎦⎤
逆变换:
[
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⎦⎤=⎣⎡11110−1−11−1⎦⎤⎣⎡YCoCg⎦⎤
可逆变换 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=R−Bt=B+(Co>>1)Cg=G−tY=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);
}
}
优点
- 计算简单,复杂度低
- 无损转换