YUV420 转RGB图像
YUV420 转RGB图像
在数字图像处理种YUV格式也是我们经常遇到,与RGB一样也是一种编码格式,开始主要用于电视系统以及模拟视频领域。YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。如果没用UV信息,只有Y信息,也可以进行成像不过只是黑白的,这样就能很好解决彩色电视与黑白电视的兼容问题,与RGB相比,YUV占用带宽较少,目前摄像头输出格式普遍采用YUV格式。
YV12和YU12格式属于YUV420格式,其中Cr和Cb分别代表U,V分量 ,其存储格式是先排Y分量再分别排UV分量。
UV先后顺序不一样。YV12格式为YYYYYVVVVVVUUUUU, YU12为YYYYUUUUUUUVVVVVVV,可以用如下所图表示:
1 void ConvertYUV420SPToRGB(unsigned char *Src, unsigned char *Dest, int ImageWidth, int ImageHeight) 2 { 3 int total = ImageWidth * ImageHeight; 4 unsigned char *ybase = Src; 5 unsigned char *ubase = &Src[total]; 6 unsigned int index = 0; 7 for (int y = 0; y < ImageHeight ; y++) { 8 for (int x = 0; x < ImageWidth; x++) { 9 //YYYYYYYYVUVU 10 u_char Y = ybase[x + y * ImageWidth]; 11 u_char U = ubase[y / 2 * ImageWidth + (x / 2) * 2 + 1]; 12 u_char V = ubase[y / 2 * ImageWidth + (x / 2) * 2]; 13 14 Dest[index++] = Y + 1.402* (V - 128); //R 15 Dest[index++] = Y - 0.34413 * (U - 128) - 0.71414 * (V - 128); //G 16 Dest[index++] = Y + 1.772 * (U - 128); //B 17 } 18 } 19 }
太亮或者边界会出现失真,效果不理想,原因是G分量有可能出现负值,并没有考虑到边界问题,阈值处理输出范围RGB 【0,255】。
原文链接:https://blog.csdn.net/weixin_42730667/article/details/97233856