目录
1 YUV颜色空间简介
YUV也是常用的颜色空间之一,它由一个代表亮度(Luminance)的Y分量和两个代表色度(Chrominance)的U和V组成。由于人类视网膜上的杆细胞要多于锥细胞,所以人眼对亮度的敏感程度要高于色度,也就是说,人眼对于亮暗的分辨能力要高于对颜色变化的分辨能力。基于此原理,在视频传输的时候,可以舍弃一部分UV分量,来减少带宽,同时也不会太影响图像质量。
U和V也合起来称为C分量,有些文档也会用“YC”或“YCbCr”来代指“YUV”,意思是一样的,都是指YUV颜色空间。U分量(也就是Cb分量),通常表示蓝色与黄色的差异。在YUV颜色空间中,U分量的数值范围通常是从-128到+127。正值倾向于表示黄色,而负值倾向于表示蓝色。V分量(也就是Cr分量),通常表示红色与绿色的差异。与U分量类似,V分量的数值范围也是从-128到+127。正值倾向于表示红色,而负值倾向于表示绿色。
2 RGB与YUV相互转换
目前手机端的视频处理或者 Camera 实时处理数据大都是 YUV 信号流,因此我们只有了解 YUV 颜色空间 与 RGB 颜色空间 的关系,才能做出一些基于视频和 Camera 的特效。
下面使用C语言编程实现RGB与YUV的转换
#include"TRGB2YUV.h"
#include"Commen.h"
#include<stdlib.h>
#include<math.h>
void RGB2YUV(unsigned char R, unsigned char G, unsigned char B, int *Y, int* U, int*V)
{
*Y = (299 * R + 587 * G + 114 * B) / 1000;
*U = (-147 * R - 289 * G + 436 * B) / 1000;
*V = (615 * R - 515 * G - 100 * B) / 1000;
};
void YUV2RGB(int Y, int U, int V, unsigned char * R, unsigned char * G, unsigned char *B)
{
*R = CLIP3((100 * Y + 114 * V)