好久没有写博客,都开始有点生疏了
前几天做了有关RGB于YUV之间互转的研究,先不用管RGB和YUV的格式什么,这里只讲转换
1.浮点运算:直接根据变量取值做算术运算
注意:关于下面的两个公式,我在网上发现了很多这种公式,但是权重都有点不一样,这里我只写我自己用的一种并且成功实现的。
(1)RGB->YUV
根据有关规定,有相应的转置矩阵
下面这个是我实际中使用的算法根据
Y = 0.299R + 0.587G + 0.114B
U = -0.169R - 0.331G + 0.5B+128
V = 0.500R - 0.419G - 0.081B +128
(2)YUV->RGB
下面这个是我实际中使用的算法根据
R = Y + 1.403(V-128)
G = Y - 0.343(U-128) - 0.714(V-128)
B = Y + 1.770(U-128)
上面可以看到里面有浮点运算,这会导致耗时很长。下面对浮点计算进行优化
2.移位运算
(1)RGB->YUV
Y = ((R << 6) + (R << 3) + (R << 2) + R + (G << 7) + (G << 4) + (G << 2) + (G << 1) + (B << 4) + (B << 3) + (B << 2) + B) >> 8;
U = (-((R << 5) + (R << 2) + (R << 1)) - ((G << 6) + (G << 3) + (G<< 1)) + ((B << 6) + (B << 5) + (B << 4))) >> 8;
V = ((R << 7) + (R << 4) + (R << 3) + (R << 2) + (R << 1) - ((G << 7) + (G << 2)) - ((B << 4) + (B << 3) + (B << 1))) >> 8;
(2)YUV->RGB
R = ((Y << 8) + ((V << 8) + (V << 5) + (V << 2))) >> 8;
G = ((Y << 8) - ((U << 6) + (U << 5) + (U << 2)) - ((V << 7) + (V << 4) + (V << 2) + V)) >> 8;
B = ((Y << 8) + (U << 9) + (U << 3)) >> 8;
移位运算相对来说可以避免浮点运算的时间消耗。后续想起来什么再补充吧。