YUV422与RGB互相转换(经验证在IPNC与PC上都可以)

前一段时间在DM8168中进行颜色空间的转换,在网上找了些程序,自己也根据网上的改了下,由于能力问题,实在是不好意思说做了好几天才弄出来, 主要是因为YUV<—>RGB有各种各样的转换公式。在多次的实验修改后,终于找到了对的公式,共享出来,以便需要的人选择。

在监控系统中大多采用YUV的颜色空间,原因不说了,网上搜YUV转RGB各种介绍。

在TI的视频英语达芬奇系列中(这里只测试了DVR、IPNC),

采用如下公式:

yCbCr<-->rgb
 
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16
 Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
 Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
 G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
 B' = 1.164*(Y’-16) + 2.017*(Cb'-128)

转换效果图如下

第一幅是原图YUV,第二幅是转为RGB后存为bmp,反转是因为BMP图像是从最下面一行开始存取的原因,最下面一副是转回YUV的图像。

代码如下,代码中YUV采用YUYVYUYV的格式,RGB为RGBRGBRGB.....

http://download.csdn.net/detail/guo8113/7318031(代码下载)

 #ifndef _RGB2YUV__
#define _RGB2YUV__
#include <iostream>
using namespace std; #define TUNE(r) ( r < 0 ? 0 : (r > 255 ? 255 : r) ) static int RGB_Y[];
static int RGBR_V[];
static int RGBG_U[];
static int RGBG_V[];
static int RGBB_U[]; static int YUVY_R[];
static int YUVY_G[];
static int YUVY_B[]; static int YUVU_R[];
static int YUVU_G[];
static int YUVU_B[]; static int YUVV_R[];
static int YUVV_G[];
static int YUVV_B[]; static int coff_rv[];
static int coff_gu[];
static int coff_gv[];
static int coff_bu[]; //直接采用公式浮点计算方式
//仅RGB2YUV采用了查表法,所以有一部分表是没有用到的
void InitTable()
{
int i;
for(i = ;i<;i++)
{
//初始化表,放大256倍
RGB_Y[i] = * (i - );
RGBR_V[i] = * (i - );
RGBG_U[i] = * (- i);
RGBG_V[i]= *(-i);
RGBB_U[i] = * (i - );
//y=0.257*r+0.504*g+0.098*b+16
//u = -0.148*r - 0.291*g + 0.439*b + 128
//0.439*r - 0.368*g - 0.071*b + 128
YUVY_R[i]=*i;
YUVY_G[i]=*i;
YUVY_B[i]=*i;
YUVU_R[i]=-*i;
YUVU_G[i]=-*i;
YUVU_B[i]=*i;
YUVV_R[i]=*i;
YUVV_G[i]=-*i;
YUVV_B[i]=-*i;
/*所用公式(此公式不适用)
*pRGB = (unsigned char)(1.0*y + 8 + 1.402*(v-128)); pRGB++; // r
*pRGB = (unsigned char)(1.0*y - 0.34413*(u-128) - 0.71414*(v-128)); pRGB++; // g
*pRGB = (unsigned char)(1.0*y + 1.772*(u-128) + 0); pRGB++ ;
*/
coff_rv[i] = (+1.402*(i-))*;
coff_gu[i] = -0.34413*(i-)*;
coff_gv[i] = -0.71414*(i-)*;
coff_bu[i] = 1.772*(i-)*; /*应该使用如下公式:
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16
Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128(标红的两组公式是可逆的转换)
R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
B' = 1.164*(Y’-16) + 2.017*(Cb'-128)
*/
}
} void YUV2RGB422(unsigned char *pRGB, unsigned char *pYUV,int size)
{
unsigned char y, u, v,y1;
int r,g,b;
unsigned int i=;
unsigned int loop = size>>;
while(loop-- >)
{ y = *pYUV; pYUV++;
u = *pYUV; pYUV++;
y1 = *pYUV;pYUV++;
v = *pYUV; pYUV++; r = 1.164*(y-) + 1.596*(v-);
g = 1.164*(y-) - 0.813*(v-) - 0.392*(u-);
b = 1.164*(y-) + 2.017*(u-); *pRGB = TUNE(r);pRGB++;
*pRGB = TUNE(g);pRGB++;
*pRGB = TUNE(b);pRGB++; r = 1.164*(y1-) + 1.596*(v-);
g = 1.164*(y1-) - 0.813*(v-) - 0.392*(u-);
b = 1.164*(y1-) + 2.017*(u-);
*pRGB = TUNE(r);pRGB++;
*pRGB = TUNE(g);pRGB++;
*pRGB = TUNE(b);pRGB++;
} } //size 为图片的大小
void RGB2YUV422(unsigned char *pRGB, unsigned char *pYUV,int size)
{
unsigned char r,g,b,u,v,u1,v1,r1,g1,b1;
//unsigned char *YUVBuff;
//unsigned char* p;
//p = YUVBuff;//
int loop = size/;
int i;
for( i=;i<loop;i++)
{
r = *pRGB; pRGB++;
g = *pRGB; pRGB++;
b = *pRGB; pRGB++;
r1 = *pRGB; pRGB++;
g1 = *pRGB; pRGB++;
b1 = *pRGB; pRGB++; //new method --- right
int y = ((YUVY_R[r] + YUVY_G[g] + YUVY_B[b] + ) >> ) +;
u = ((YUVU_R[r] + YUVU_G[g] + YUVU_B[b] + ) >> ) + ;
v = ((YUVV_R[r] + YUVV_G[g] + YUVV_B[b] + ) >> ) + ;
int y1 = ((YUVY_R[r1] + YUVY_G[g1] + YUVY_B[b1] + ) >> )+;
u1 = ((YUVU_R[r1] + YUVU_G[g1] + YUVU_B[b1] + ) >> ) + ;
v1 = ((YUVV_R[r1] + YUVV_G[g1] + YUVV_B[b1] + ) >> ) + ; *pYUV++ = TUNE(y);
*pYUV++ =(TUNE(u)+TUNE(u1))>>;
*pYUV++ = TUNE(y1);
*pYUV++ = TUNE(v);
} } void inline Yuv2RgbPixel(unsigned char y,unsigned char u,unsigned char v, unsigned char* rgbPixel)
{
int r = (RGB_Y[y] + RGBR_V[v] + ) >> ;
int g = ((RGB_Y[y] + RGBG_V[v] +RGBG_U[u]+ )>> );
int b = ((RGB_Y[y] + RGBB_U[u]+ )>>);
*rgbPixel=TUNE(r);rgbPixel++;
*rgbPixel=TUNE(g);rgbPixel++;
*rgbPixel=TUNE(b);
} void YUV2RGB(unsigned char *pRGB, unsigned char *pYUV,int size)//444
{
unsigned char y, u, v; for(int i=;i<size;i++)
{
y = *pYUV; pYUV++;
u = *pYUV; pYUV++;
v = *pYUV; pYUV++; Yuv2RgbPixel(y,u,v,pRGB);
pRGB += ;
} } void inline Rgb2YuvPiexl(unsigned char r,unsigned char g,unsigned char b,unsigned char* pYUV)
{
int y = ((YUVY_R[r] + YUVY_G[g] + YUVY_B[b] + ) >> ) + ;
int u = ((YUVU_R[r] + YUVU_G[g] + YUVU_B[b] + ) >> ) + ;
int v = ((YUVV_R[r] + YUVV_G[g] + YUVV_B[b] + ) >> ) + ;
*pYUV = TUNEY(y);pYUV++;
//*pYUV = u < 0 ? 0 : (u > 255 ? 255 : u);pYUV++;
*pYUV =TUNE(u);pYUV++;
*pYUV = TUNE(v);
} void RGB2YUV(unsigned char *pRGB, unsigned char *pYUV,int size)
{
unsigned char r,g,b,y,u,v;
for(int i=;i<size;i++)
{
r = *pRGB; pRGB++;
g = *pRGB; pRGB++;
b = *pRGB; pRGB++;
Rgb2YuvPiexl(r,g,b,pYUV);
pYUV +=; }
}
#endif

http://www.61ic.com/Article/DaVinci/TMS320DM81x/201408/52651.html

http://blog.csdn.net/xgmiao/article/details/23512021

http://www.cnblogs.com/jck34/p/3898569.html

http://blog.csdn.net/onion2007/article/details/46805335

YUV422与RGB互相转换的更多相关文章

  1. 【视频处理】YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  2. iOS中RGB颜色转换

    iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UI ...

  3. GPU 实现 RGB -- YUV 转换 (OpenGL)

    GPU 实现 RGB -- YUV 转换 前言 RGB --> YUV 转换的公式是现成的,直接在 CPU 端转换的话,只需要遍历每个像素,得到新的 YUV 值,根据其内存分布规律,合理安排分布 ...

  4. YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  5. 【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比

    [视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...

  6. 【DSP开发】【VS开发】YUV与RGB格式转换

    [视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...

  7. YUV到RGB的转换

    以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享. http://blog.csdn.net/housisong/article/details/1859084 http://blo ...

  8. 如何将24位RGB颜色转换16位RGB颜色

    有许多朋友第一次使用16位彩色显示屏会遇到如何将24位RGB颜色转换为对应的16位RGB颜色的问题, 通过查阅相关资料,就写一下其中的转换原理吧,希望对大家会有所帮助. 我们知道24位RGB是分别由8 ...

  9. rgb值转换成16进制

    由于jQuery获取css中的background有时候是rgb值,所以往往需要一个转换函数. 以前觉得难,还写个博客记录,现在觉得好容易. let testColor = "rgb(20, ...

随机推荐

  1. Python web 简单服务器的搭建与运行

    搭建python的CGI环境: 假设在/var/www/cgi-bin下建立一个hello.py的文件 在ubuntu下打开终端 然后用命令 cd /var/www/ 进入后执行命令 : python ...

  2. [BZOJ 1143] 祭祀river

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Solution: 一道最长反链的模板题 由Dilworth定理可知:最小链覆盖数 ...

  3. 【点分治】【乘法逆元】hdu4812 D Tree

    思路比较裸,但是要把答案存到哈希表里面,这里需要一定技巧,否则会被K=1且点权全是1的数据卡飞.预处理乘法逆元.TLE了一天.换了种点分治的姿势…… #pragma comment(linker,&q ...

  4. ProgressDialog进度条对话框

    (一) 1.效果图: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...

  5. asp.net 域名注册查询接口 支持批量后缀查询

    最近在完成公司网站www.xuhongkj.com的时候,需要用到域名查询的功能,网上查了一些资料,几乎都是ASP版的,而且功能有限,不能满足我的要求. 百度后,结合网上的例子,整理出了该功能! as ...

  6. 【POI】修改已存在的xls,新添一列后,再保存本文件+获取最大有效行号+获取单元格内容

    使用POI版本: ① ② ③ ④ package com.poi.dealXlsx; import java.io.File; import java.io.FileInputStream; impo ...

  7. VisualSVN设置提交时必须输入log信息

    在别人的基础上修改的: 自己在Windows上用VisualSVN搭了个服务器,默认提交代码是可以不填任何信息,这可不是我所期望的,于是找到了下面的解决方案: 在VisualSVN的管理控制台中可以设 ...

  8. JAVA常见算法题(二十五)

    /** * Java实现中文数字转换为阿拉伯数字 * * * @author WQ * */ public class Demo26 { public static void main(String[ ...

  9. SQLSERVER表联结(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)

    1 常用表联结(inner join,left join,right join,full join,cross join) if object_id(N'table1',N'U') is not nu ...

  10. Spark(十二) -- Spark On Yarn & Spark as a Service & Spark On Tachyon

    Spark On Yarn: 从0.6.0版本其,就可以在在Yarn上运行Spark 通过Yarn进行统一的资源管理和调度 进而可以实现不止Spark,多种处理框架并存工作的场景 部署Spark On ...