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

posted @ 2024-04-19 10:20  量子与太极  阅读(345)  评论(0编辑  收藏  举报