yuv 与 rgb 互相转化的色差问题


  今天出现一个需求,就是将YUV视频逐帧转化成RGB图像并在RGB通道上做一些操作,最后再将RGB转化回YUV。但是输入的YUV和输出的YUV存在比较明显的色差,于是想方法解决这个问题:

        1 刚开始我想的是,会不会是转化公式出了问题,于是从网上找来了一堆公式。发现有许多种不同的yuv->rgb 和 rgb->yuv的公式。这可愁坏了我。于是我决定一个个试一下,首先是yuv->rgb的公式,几个试下来发现并没有什么改善,于是我就放弃了。

        好了,本博客到此结束。


















      2 当然不会结束,在纠结了一下后,我想到,其他人是怎么做的呢?于是翻开了以前下载的开源代码,包括一些YUV播放器的开源代码。最后看到了ffmepg中有类似的实现!既然是坚挺的ffmepg,那我就相信它了吧。。。然后我就将YUV->RGB的部分写成了这样(有删改):


查表法,用SMPTE 170M这套标准的参数

const int32_t Inverse_Table_6_9[8][4] = {
    {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
    {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
    {104597, 132201, 25675, 53279}, /* unspecified */
    {104597, 132201, 25675, 53279}, /* reserved */
    {104448, 132798, 24759, 53109}, /* FCC */
    {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
    {104597, 132201, 25675, 53279}, /* SMPTE 170M */
    {117579, 136230, 16907, 35559}  /* SMPTE 240M (1987) */
};

主要的计算为:

	r = 1.164*(y-16) + table[matrix_coefficients][0]*(cr-128);
	g = 1.164*(y-16) - table[matrix_coefficients][1]*(cr-128) - table[matrix_coefficients][2][cb-128];
	b = 1.164*(y-16) + table[matrix_coefficients][3]*(cb-128);


       啃哧啃哧写完,运行,一看结果,嗯,,,果然还是不行。于是就开始事后诸葛亮:只是使用了权威的YUV->RGB的公式,本质问题还没找到,肯定不成呀,运行一下只是想看看今天是不是脸比较好。。。嗯,继续吧。

       上面的努力应该没有白费,嗯,一定是这样。为了证明,我将中间数据RGB用OPENCV的库show了出来,再和YUV播放器一比对,色差消失,我说嘛,哈哈哈哈

     

       3 既然yuv->rgb没问题了,我们暂时先不管它,考虑一下RGB->YUV之间是否有啥猫腻,经过冥思苦想,查阅千万卷资料,不得解,就想着能不能自己从YUV->RGB的过程中反向推倒出公式。

          列了一个三元一次的线性方程,然后看着3个变量,和3个字母常量,,,嗯,放弃吧。。。

          明明有好的方法嘛,我把之前去找到的RGB->YUV公式一个个列出来,然后用了一个特解(Y=1,U=1,G=1)带入YUV->RGB的公式中,再将得到的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;


       这还能有差?

       将系数一改,编译,运行,这把肯定能赢!


        呀,色差消失了!唔,不过出现了黑色的块点,乐极生悲,不过难不倒本公子,做个保护去,Y通道最后的值反转可不行


			Y = Y > 255 ? 255: Y;


       运行,色差消失,妥了! 鞠躬,退场。



     等等,忘记了总结,YUV和RGB互相的转换的公式必须是配套的,具体的配套公式可以查看 http://blog.sina.com.cn/s/blog_5713096b0100059i.html

这里面有两套,我就是用后面一套。具体含义戳上面的链接吧,我就不说啦。另外附上维基百科的有关资料,对于上面查表法的几个注释看不懂的可以

翻一下:https://en.wikipedia.org/wiki/Talk%3AYCbCr





评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值