YUV到RGB的转换
以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享。
http://blog.csdn.net/housisong/article/details/1859084
http://blog.csdn.net/tommy_wxie/article/details/37909643
http://www.cnblogs.com/qinjunni/archive/2012/04/06/2434393.html 这里有介绍YUV转RGB的优化 位运算和查表法
YUV到RGB的转换公式:网上收集到的各种公式
RGB颜色空间到YUV颜色空间的转换公式:
Y= 0.256788*R + 0.504129*G + 0.097906*B + 16;
U=-0.148223*R - 0.290993*G + 0.439216*B + 128;
V= 0.439216*R - 0.367788*G - 0.071427*B + 128;
(以下装换关系来自网络,本质都是一样的)
YUV颜色空间到RGB颜色空间的转换公式: (给的示例中用的是这个)
B= 1.164383 * (Y - 16) + 2.017232*(U - 128);
G= 1.164383 * (Y - 16) - 0.391762*(U - 128) - 0.812968*(V - 128);
R= 1.164383 * (Y - 16) + 1.596027*(V - 128);
另一种转换关系:
// 转换公式(浮点方式)
R = Y + 1.4075*(V-128)
G = Y - 0.3455*(U-128) - 0.7169*(V-128)
B = Y + 1.779*(U-128)
( 补充: 在视频格式中基本上都用的上面的转换公式;但在其他一些地方可能会使用下面的转换公式(不同的使用场合可能有不同的转换系数):
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.147*R - 0.289*G + 0.436*B;
V = 0.615*R - 0.515*G - 0.100*B;
R = Y + 1.14*V;
G = Y - 0.39*U - 0.58*V;
B = Y + 2.03*U;
)
RGB to YUV Conversion
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV to RGB Conversion
B = 1.164(Y - 16) + 2.018(U - 128) G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) R = 1.164(Y - 16) + 1.596(V - 128) 无论是YUV444、YUV422、还是YUV420格式,根据对应的方法提取完YUV并转换为RGB数据后,其文件大小应该是: 图像的高 * 图像的宽 * 3 。由于不同的YUV码流转换为RGB数据的提取方式均不相同
我们知道YUYV视频格式的内存数据布局图示:

图中可以看出Y的数据量是U或者V的两倍,这是因为人的眼睛一般对亮度比对颜色更敏感一些,所以将连续的两个像素的U(或V)值只保存一个U(或V)值,那么每个
像素平均占用16bit储存空间。
项目中使用到的YUV转RGB格式代码:
static void YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
unsigned char *R, unsigned char *G, unsigned char *B)
{
*R = Y + (V - 128) + ((V - 128) * 103 >> 8);
*G = Y - ((U - 128) * 88 >> 8) - ((V - 128) * 183 >> 8);
*B = Y + (U - 128) + ((U - 128) * 198 >> 8);
if (*R > 255)
*R = 255;
if (*G > 255)
*G = 255;
if (*B > 255)
*B= 255;
if (*R < 0)
*R = 0;
if (*G < 0)
*G = 0;
if (*B < 0)
*B = 0;
} void image_data_handle(unsigned char *dist, unsigned int size)
{//fb_buffer,将数据写入这个内存就相当于在屏幕输出,
//这里就是framebuffer和v4l2的连接处
unsigned long *to = (unsigned long *)fb_buffer;
unsigned long *from = (unsigned long *)dist; //这个内存就是存储数据的,可以在这里对数据操作 unsigned char Y0;
unsigned char U0;
unsigned char Y1;
unsigned char V0; unsigned char R0;
unsigned char G0;
unsigned char B0;
unsigned char R1;
unsigned char G1;
unsigned char B1;
// 为何要除以4????
size >>= 2;
while(size--)
{ //取出YUYV的值 这里是4:2:2的每个像素16位
Y0 = (*from & 0x000000FF) >> 0;
//U0 = 128; //white and black
U0=(*from & 0x0000FF00)>>8; //colorful
Y1 = (*from & 0x00FF0000) >> 16;
//V0 = 128; //white and blcak
V0=(*from & 0xFF000000)>>24; //colorful
YUV2RGB(Y0, U0, V0, &R0, &G0, &B0);
YUV2RGB(Y1, U0, V0, &R1, &G1, &B1);
//rgb565 16位
*to = (R0 & 0x1F) << 11 | (G0 & 0x3F) << 5 | (B0 & 0x1F) << 0;
*to |= ((R1 & 0x1F) << 11 | (G1 & 0x3F) << 5 | (B1 & 0x1F) << 0) << 16; from++;
to++;
}
}
YUV到RGB的转换的更多相关文章
- 【视频处理】YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- 【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- 【DSP开发】【VS开发】YUV与RGB格式转换
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- 图像色彩空间YUV和RGB的差别
http://blog.csdn.net/scg881008/article/details/7168637 假如是200万像素的sensor,是不是RGB一个pixel是2M,YUV是1M? 首先, ...
- YUV和RGB格式分析
做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于opencv的处理,很多东西并不需要我们过多深入的去探讨,现在需要完全抛弃现有的算法程序,需要从内存中一个字 ...
- RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB
jackyhwei 发布于 2010-01-01 12:02 点击:3218次 来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...
- 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface)
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
随机推荐
- Mysql数据库中的计数器表实时更新
如果某个应用中存在计数器,例如网站的总访问量.用户的粉丝数.文件下载数等等.如果相关应用在Mysql数据库的表中保存计数器,在更新计数器的时候可能会碰到并发问题.例如在web应用中,记录网站的点击次数 ...
- QQ群里收集的外企iOS开发的笔试题
一组外企iOS开发的笔试题,您能回答出来吗?从群里收集来的. 1 why can't NSArray contain NSInteger Instance? with which extra step ...
- 解决sublime text 2总是在新窗口中打开文件
在mac下不是很喜欢sublime text 2 总是在新窗口中打开文件,很麻烦,文件打多了,就会出现N多窗口,虽然可以直接打开当前目录可以解决,但有时候查看其它项目中的单个文件,就比较麻烦.百度一直 ...
- hornetq 入门(1)
Hornetq 版本2.4.0final 需要JDK7及以上 Hornetq官网 Hornetq2.1中文手册 step1.启动服务端 1.1准备配置文件(配置说明参考官网手册) hornetq-c ...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- 计划:怎样理解水平集方法 ITK Level set V4 框架介绍
简易解释:在曲面中插入一个平面所形成的轮廓,即是该轮廓的水平集表示,可见,该轮廓的水平集表示有多个.对于图像分割,在图像力的驱动下曲面进行更新. 轮廓的数学表达有隐式和显式两种表达.用曲面演化代替Fr ...
- PVPGN 暗黑破坏神2 1.11b战网配置问题汇总
写了第一篇配置指南之后,很多人向我咨询有关战网搭建的问题.于是觉得很有必要把若干常见的问题,和常用的进阶配置汇总一下,以方便更多人. 1.游戏版本和PVPGN与D2GS版本的问题. PVPGN建议选择 ...
- mysql federated engine
mysql)) -> engine=federated -> connection='mysql://root@localhost:3306/t1/t';
- 使用XAMPP本地安装Wordpress博客
最近一直在研究博客,也知道了大名鼎鼎的wordpress,因此也希望动手尝试一下,看看跟网站提供的博客有何区别. 第一个问题:能什么安装wordPress,能否用tocmat? 虽然问题很可笑,但是之 ...
- 【转载】Spring中DispatcherServlet与ContextLoaderListener的区别
昨天在写springmvc的时候,在web.xml中配置了DispatcherServlet,如下: <servlet> <servlet-name>DispatcherSer ...