YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)
一、 公式:基于BT.601-6

BT601 UV 的坐标图(量化后): (横坐标为u,纵坐标为v,左下角为原点)
通过坐标图我们可以看到UV并不会包含整个坐标系,而是呈一个旋转了一定角度的八边形, U越大蓝色越蓝,V越大,红色越红。
名词解释:
量化后: Y~[16,235] U ~[16-240] V~[16-240] 量化就是让通过线性变换让Y 或 U 或V 处于一定的范围内, 比如让Y 【0,1】变到 Y' (16,235) 就这样来实行: Y' = Y* (235-16)/(1-0) + 16 即 Y' = 219*Y + 16
未量化: Y~ [0,1] U,V~[-0.5,0.5]
YUV :即 YCbCr 两者是等价的
关于为什么要量化?
1.众所周知,RGB的范围是【0,255】, 如果把R=0,G=0,B=255带入公式 U = -0.169*R - 0.331*G + 0.5 *B ;,得到的U=127.5, 而char的范围是【-128,127】 ,无法表示到127.5,
那么,我们就需要将Y U V数据进行量化;
2. 量化后,我们进行RGB转YUV的时候, 如果我们就要进行边界判断,类似于 Y=Y_int <0?0: (Y_int>255?255:Y_int); 这个语句非常消耗CPU, 如果YUV进行量化之后,那么RGB转YUV的时候就不需要进行边界判断;
3. 进行量化后,编码时压缩率变大,因为色阶数变少了
关于如何判断图像是否经过量化?
在完全黑画面的时候打印出图像的Y数据, 如果Y=16左右 说明Y经过量化 ,如果Y=0左右 说明Y未经过量化
以下具体为各种转换公式
1.小数形式,未量化 ( U~[-0.5-0.5] , R~[0,1] )
R = Y + 1.4075 * V;
G = Y - 0.3455 * U - 0.7169*V;
B = Y + 1.779 * U;
Y = 0.299*R + 0.587*G + 0.114*B;
U = (B-Y)/1.772;
V = (R-Y)/1.402;
或写为:
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.169*R - 0.331*G + 0.5 *B ;
V = 0.5 *R - 0.419*G - 0.081*B;
2.整数形式(减少计算量)未量化 R,G,B~[0,255] U,V~[-128,128]
R= Y + ((360 * (V - 128))>>8) ;
G= Y - (( ( 88 * (U - 128) + 184 * (V - 128)) )>>8) ;
B= Y +((455 * (U - 128))>>8) ;
Y = (77*R + 150*G + 29*B)>>8;
U = ((-44*R - 87*G + 131*B)>>8) + 128;
V = ((131*R - 110*G - 21*B)>>8) + 128 ;
3. 量化后的公式( Y~(16,235) U/V ~(16,240) ) 量化 ( I420 , YUV422 用改公司转换即可 )
[Y,U,V,1]T = M[R,G,B,1]T 其中 M =
[ 0.2568, 0.5041, 0.0979, 16
-0.1479, -0.2896, 0.4375, 128
0.4375, -0.3666, -0.0709, 128,
0, 0, 0, 1 ]
[R,G,B,1]T = M[Y,U,V,1]T M =
1.1644 0 1.6019 -223.5521
1.1644 -0.3928 -0.8163 136.1381
1.1644 2.0253 0 -278.0291
0.0000 0.0000 0.0000 1.0000
由此可以得到红色的YUV分量 YUV = ( 81,91,240 )
4 量化后的公式写成整数的形式(减小计算量) ( Y~(16,235) U/V ~(16,240) )
yuv --> rgb
R = (298*Y + 411 * V - 57344)>>8
G = (298*Y - 101* U - 211* V+ 34739)>>8
B = (298*Y + 519* U- 71117)>>8
rgb --> yuv
Y= ( 66*R + 129*G + 25*B)>>8 + 16
U= (-38*R - 74*G + 112*B)>>8 +128
V= (112*R - 94*G - 18*B)>>8 + 128
5. YUV量化 与 非量化 互转
YUV 量化 转 非量化
Y=(Y'-16 )*255/219 ;
U=(U'-128)*128/112;
V=(V'-128)*128/112;
YUV 量化 转 非量化 U~(-128-127) -----> U~(16-240)
Y' = ((219*Y)>>8) + 16;
U' = ((219*U)>>8) + 128;
V' = ((219*V)>>8) + 128;
6. YV12 转RGB (这个有待考证。。!!)
R = Y + 1.370705 * ( V - 128 ) ; // r分量值
G = Y - 0.698001 * ( U - 128 ) - 0.703125 * (V - 128) // g分量值
B = Y + 1.732446 * ( U - 128 ); // b分量值
7. 矩阵形式(BT601):
矩阵形式
量化前
[Y,U,V]T = M[R,G,B]T 其中 M = 0.299 , 0.587, 0.114, -0.169, - 0.331, 0.5, 0.5, - 0.419 - 0.081
[R,G,B]T = M[Y,U,V]T 其中 M = 1 0 1.4017 1 -0.3437 -0.7142 1 1.7722 0
量化后
[Y,U,V,1]T = M[R,G,B,1]T 其中 M = [ 0.2568, 0.5041, 0.0979, 16 -0.1479, -0.2896, 0.4375, 128 0.4375, -0.3666, -0.0709, 128, 0, 0, 0, 1 ]
[R,G,B,1]T = M[Y,U,V,1]T M = 1.1644 0 1.6019 -223.5521 1.1644 -0.3928 -0.8163 136.1381 1.1644 2.0253 0 -278.0291 0.0000 0.0000 0.0000 1.0000
量化后的公式写成整数形式
[Y,U,V,1]T = (M[R,G,B,1]T)>>8 其中 M = 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, 0, 0, 0, 256
[R,G,B,1]T = (M[Y,U,V,1]T)>>8 M = 298, 0, 410, -57229, 298, -101, -209, 34851, 298, 518, 0, -71175, 0, 0, 0, 256
附 :bt601文档上的截图
二、. Rec2020 (BT2020) 下的YUV与RGB转换公式 (我觉得还是写成矩阵的形式更加统一协调)

BT2020 UV 的坐标图(量化后): (横坐标为u,纵坐标为v,左下角为原点)
通过坐标图我们可以看到UV不同于BT601协议,该uv代表的颜色范围更大,该颜色范围呈一个不规则八边形。
1. BT2020 文档上的公式


即:
Y = 0.2627*R + 0.6780*G + 0.0593*B;
U = -0.1396*R - 0.3604*G + 0.5*B;
V = 0.5*R - 0.4598*G -0.0402*B;
矩阵形式
量化前
[Y,U,V]T = M[R,G,B]T 其中 M = 0.2627 0.6780 0.0593 , -0.1396 -0.3604 0.5000, 0.5000 -0.4598 -0.0402
[R,G,B]T = M[Y,U,V]T 其中 M = 1.0000 -0.0000 1.4746 1.0000 -0.1645 -0.5713 1.0000 1.8814 -0.0001
量化后
[Y,U,V,1]T = M[R,G,B,1]T 其中 M = 0.2256, 0.5823, 0.05093, 16, -0.1222, -0.3154, 0.4375, 128 , 0.4375, -0.4023, -0.0352, 128, 0,0,0,1
[R,G,B,1]T = M[Y,U,V,1]T M =1.1644, 0, 1.6853, -234.3559, 1.1644, -0.1881, -0.6529, 89.0206, 1.1646, 2.1501, 0.0000, -293.8542, 0.0000, 0.0000, 0.0000, 1.0000
量化后的公式写成整数形式
[Y,U,V,1]T = (M[R,G,B,1]T)>>8 其中 M = 58, 149, 13, 4096, -31, -81, 112, 32768, 112, -103, -9, 32768, 0, 0, 0, 256
[R,G,B,1]T = (M[Y,U,V,1]T)>>8 M = 298, 0, 431, -59995, 298, -48, -167, 22789, 298, 550, 0, -75227, 0, 0, 0, 256
2. BT601 转 BT2020
_Y = (256*Y - 32*U -30*V+ 7826)>>8;
_U = (258*U +17*V - 2208)>>8;
_V = (22*U + 264*V - 3369)>>8;
3. bt2020 转bt601
YUV_601 = M*[Y,U,V,1]T
M=[
1.0000 0.1157 0.1037 -28.0756
0.0000 0.9951 -0.0602 8.3197
-0.0000 -0.0835 0.9767 13.6686
0.0000 0.0000 0.0000 1.0000
]
RGB与HSV互转
1.RGB转HSV
1: max=max(R,G,B) |
2. HSV转RGB
1: if s = 0 |
YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)的更多相关文章
- yuv rgb 互转 公式 及算法
1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的 ...
- 经典算法,yuv与rgb互转,查表法,让你的软件飞起来
代码的运算速度取决于以下几个方面 1. 算法本身的复杂度,比如MPEG比JPEG复杂,JPEG比BMP图片的编码复杂. 2. CPU自身的速度和设计架构 3. CPU的总线带宽 4. 您自己代码的写法 ...
- 不同格式的YUV 和 RGB互转
YUV色彩空间: Y是亮度值,也就是说8位的灰度值即可组成一幅黑白图像,黑白电视机就是这样的. UV是色彩值,是给Y上色用的.U是Cb也就是RGB中的蓝色分量,V是Cr也就 ...
- Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)
./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux --prefix=/usr/loca ...
- YUV与RBG的装换公式
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16 Cb Cr R) G) - 0.392*(Cb'-128) B)
- directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分 ...
- [图像类名词解释][ RGB YUV HSV相关解释说明]
一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...
- LCD LED OLED区别 以及RGB、YUV和HSV颜色空间模型
led 液晶本身不发光,而是有背光作为灯源,白色是由红绿蓝三色组成,黑色是,液晶挡住了led灯光穿过显示器. lcd比led更薄. oled:显示黑色时,灯是灭的,所以显示黑色更深,效果更好. 这就不 ...
- RGB、YUV和HSV颜色空间模型
一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...
随机推荐
- 中国网络安全行业分类及全景图2019H1
中国网络安全行业分类及全景图2019H1 概述 中国网络安全行业分类及全景图: 一级分类包含了端点安全.网络安全.应用安全.数据安全.身份与访问管理和安全管理六个一级分类,这些一级分类分别对应了网 ...
- 从零开始写Hystrix
1.springboot+自定义注解实现灵活的切面配置 利用aop我们可以实现业务代码与系统级服务例如日志记录.事务及安全相关业务的解耦,使我们的业务代码更加干净整洁. 首先创建一个springboo ...
- 利用easyui的行编辑自动增加一行来进行增删有详细注解
jQuery EasyUI 框架提供了创建网页所需的一切,帮助您轻松建立站点. easyui 是一个基于 jQuery 的框架,集成了各种用户界面插件. easyui 提供建立现代化的具有交互性的 j ...
- C语言博客作业2019-04--数组
0.展示PTA总分(0----2) 展示3张关于"数组题目集"分数截图. 1.本章学习总结(2分) 1.1 学习内容总结 整理数组这章学习主要知识点,必须包含内容有: 数组中如何查 ...
- centos 升级openSSH7.81
1.下载相关依赖包 [root@Log ~]# yum install -y gcc openssl-devel pam-devel rpm-build 2.下载安装包 wget http://ftp ...
- Ubuntu16.04安装Filebeat
Filebeat官方文档地址 https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html 下载和 ...
- Java基础之十三 字符串
第十三章 字符串 13.1 不可变String String对象是不可变的.String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新得String对象,以包含修改后得字符串内容 ...
- 【Kubernetes学习之四】Kubernetes可视化管理
环境 centos 7 k8s-master 192.168.118.106 k8s-node01 192.168.118.107 k8s-node01 192.168.118.108 之前使用ku8 ...
- nginx开启gzip的方法
nginx开启gzip的方法 1.vi打开Nginx配置文件 <pre>vi /usr/local/nginx/conf/nginx.conf</pre> 2.找到如下一段,进 ...
- python文件打包发布(引用的包也可以加进来),打包出错解决了,运行出错解决了
一开始,我以为,打包本来就很容易,可是没有..... 没想到打包还能遇到坑 T.T 打包步骤: 1.安装 pyinstaller (cmd) pip install pyinstaller 2.进入目 ...