急!请教:如何进行YUV422与RGB24之间的转换?

huamy 2004-09-03 02:40:58
请教如何进行YUV422格式与RGB24格式之间的数据转换?因为我的从开发板上得到的数据是YUV422格式的数据,要将其转换成RGB24格式;最后还要将RGB24图像转化成YUV422格式,已提供给相应的输出设备。
如何进行YUV422-->RGB24,以及RGB24-->YUV422的变换?
其中:YUV422的三个分量各用一个数组存储,既是比如1024个象素的图像,其YUV数据分别存储于CHAR Y[1024]; CHAR U[512], V[512]中,现在如何进行RGB24格式的转换?再如何将RGB24还原回YUV422?

看到有很多资料上对YUV-RGB之间的变换关系矩阵有很多种,请问,它们各个矩阵的意义与区别?各自适用于何种情况?有的要减去一个常数128、0.5又是什么意思?

这是我看到的主要的几种变换关系:

1)
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

2)
YUV与RGB图象之间的变换关系:
Y= 0.2990R+0.5870G+0.1140B
U=-0.1687R-0.3313G+0.5000B + 128
V= 0.5000R-0.4187G-0.0813B + 128
反变换关系:
R= 1.0Y + 0 +1.402 (V-128)
G= 1.0Y - 0.34413(U-128)-0.71414(V-128)
B= 1.0Y + 1.772 (U-128)+0

3)
Y601 = (16842*R + 33030*G+ 6423*B)/65535 + 16
Cb = (–9699*R – 19071*G+ 28770*B)/65536 + 128
Cr = (28770*R– 24117*G– 4653*B)/65536 + 128

R= 1.164(Y601 – 16) + 1.596(Cr – 128)
G= 1.164(Y601 – 16) – 0.813(Cr – 128) –0.391(Cb – 128)
B= 1.164(Y601 – 16) + 2.018(Cb – 128)

不明白:
a)第一种与第二种之间的区别:何时要加减128?为何有的又不是128而是16?
b)第二种与第三种的区别:为何第三种的系数要大些?
c)他们各自的RGB与YUV的取值范围是多少?

...全文
1148 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqlyxg1981 2004-09-29
  • 打赏
  • 举报
回复
jus4u 2004-09-10
  • 打赏
  • 举报
回复
hell190109() 的观点正确,在下补充:

a)第一种与第二种之间的区别:何时要加减128?为何有的又不是128而是16?

两者的区别是保存图像一个通道是用signed char还是unsigned char。
另外,公式系数常有细微差别,不足为怪,并无绝对正误。

b)第二种与第三种的区别:为何第三种的系数要大些?

YCrCb是YUV的一个变种,系数大是为了以整数运算代替浮点运算.
这是一种常用手法,也正是你需要的。比如公式1,更常见的做法是:
Y = (299R + 587G + 114B)/1000
......


c)他们各自的RGB与YUV的取值范围是多少?
取值范围是 [0,255] 或 [-128,127]

另:我一般用1
huamy 2004-09-05
  • 打赏
  • 举报
回复
to psusong(Think Different):
可否帮帮忙,为我解答一下这个问题?
huamy 2004-09-05
  • 打赏
  • 举报
回复
上面这位老兄的程序对我的问题没有我所提问题的答案在里面呀。而且你的程序中没有考虑浮点运算转化为定点运算的问题,除了速度上的影响外,还有有的处理器是不支持浮点运算的。这是其一。
其二,我对那几个转换式的概念理解上不太明白,不知他们各自的含义;这些转换式都是收集到的资料上看到的,形式各异,请问有对YUV-->RGB比较了解的人可否详细解释一下?!
hell190109 2004-09-05
  • 打赏
  • 举报
回复
128是为了符号转换
0.5是为了取整时四舍五入
  • 打赏
  • 举报
回复
想睡觉了,不想写了,帮你顶一下,困
hell190109 2004-09-04
  • 打赏
  • 举报
回复
yuv2rgb
00925 ()
00926 {
00927 AssertThis;
00928
00929 AssertReturn1(buf);
00930
00931 for (ulong x=0; x<width; x++)
00932 for (ulong y=0; y<height; y++)
00933 {
00934 float r,g,b, yy,u,v;
00935
00936 yy = buf[(x+y*width)*4+0];
00937 u = buf[(x+y*width)*4+1];
00938 v = buf[(x+y*width)*4+2];
00939
00940 r = yy + 1.403f;
00941 g = yy - 0.344f*u - 0.714f*v;
00942 b = yy + 1.770f*u;
00943
00944 buf[(x+y*width)*4+0]=(char)r;
00945 buf[(x+y*width)*4+1]=(char)g;
00946 buf[(x+y*width)*4+2]=(char)b;
00947 }
00948 dirty = true;
00949 }
GoogleGeek 2004-09-03
  • 打赏
  • 举报
回复
easy,
huamy 2004-09-03
  • 打赏
  • 举报
回复
help me!!
huamy 2004-09-03
  • 打赏
  • 举报
回复
写的有点罗嗦,对不起了

4,449

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧