一、 公式:基于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: min=min(R,G,B)
 3: if R = max, H = (G-B)/(max-min)
 4: if G = max, H = 2 + (B-R)/(max-min)
 5: if B = max, H = 4 + (R-G)/(max-min)
 6:
 7: H = H * 60
 8: if H < 0, H = H + 360
 9:
10: V=max(R,G,B)
11: S=(max-min)/max

2. HSV转RGB

 1: if s = 0
 2: R=G=B=V
 3: else
 4: H /= 60;
 5: i = INTEGER(H)
 6:
 7: f = H - i
 8: a = V * ( 1 - s )
 9: b = V * ( 1 - s * f )
10: c = V * ( 1 - s * (1 - f ) )
11:
12: switch(i)
13: case 0: R = V; G = c; B = a;
14: case 1: R = b; G = v; B = a;
15: case 2: R = a; G = v; B = c;
16: case 3: R = a; G = b; B = v;
17: case 4: R = c; G = a; B = v;
18: case 5: R = v; G = a; B = b;

转载于:https://www.cnblogs.com/luoyinjie/p/7219319.html

YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)相关推荐

  1. YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别)

    转自:YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!) - 罗引杰 - 博客园 关于写这篇文章的原因: 本人也是摸索了很长时间才弄懂其中的原理,里面涉及的知识点太多了 ...

  2. python rgb转yuv_YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!)...

    一. 公式:基于BT.601-6 BT601 UV 的坐标图(量化后): (横坐标为u,纵坐标为v,左下角为原点) 通过坐标图我们可以看到UV并不会包含整个坐标系,而是呈一个旋转了一定角度的八边形, ...

  3. yuv rgb 互转 公式 及算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的 ...

  4. RGB转YUV----RGB色域与YUV色域的介绍

    以下文章来源于疯狂的FPGA,作者CrazyBingo.文章仅用于学术分享. 正式开始前,我们有必要介 绍一下色彩模型.色彩模型有很多种类,比如RGB三原色模型.CMYK四原色模型.YUV/YCbCr ...

  5. java rgb转yuv_RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)

    import java.lang.Math; import java.awt.*; public class ColorConverter{ public ColorConverter(){ } // ...

  6. 十六进制颜色和RGB互转

    2019独角兽企业重金招聘Python工程师标准>>> dd //颜色互转 //十六进制颜色值域RGB格式颜色值之间的相互转换//-------------------------- ...

  7. python修改rgb红色通道为黑白_如何将RGB图像(3通道)转换为灰度(1通道)并保存?...

    您的第一个代码块:import matplotlib.pyplot as plt plt.imsave('image.png', image, format='png', cmap='gray') 这 ...

  8. 转接口IC大全-RGB互转LVDS-LVDS或RGB转MIPI-MIPI转LVDS或RGB-LVD

    EDP输出 NCS8801 :LVDS转EDP.RGB转EDP封装QFN56 2560*1600用于手机.平板.转接板.液晶驱动板.广告机.可视门铃等等控制 器到显示设备上 MIPI输出 SDD282 ...

  9. 用java实现十六进制代码与RGB互转的颜色转换器

    最近在学java,学完基础不知道做点什么好,心血来潮想写个小工具,某天突然发现十六进制转RGB很麻烦,网上一搜工具不是很多,大多都是在线转换,要是某天没网了怎么办呢??我想可能太简单了吧,大家都不愿意 ...

最新文章

  1. 高并发系统三大利器之限流
  2. 安卓常用功能——已封装好
  3. 微软VS2008月底推出beta 2中文版 搭配.NET 3.5
  4. commonjs 和 es6模块化开发入门
  5. layui 行变灰_layui table设置某一行的字体颜色方法
  6. 你的烂代码终于有了解决方案
  7. Tcpip详解卷一第3章(2)
  8. 找不到项目 该项不在计算机中,Win7提示“找不到该项目”怎么办 Win7提示“找不到该项目”解决方法...
  9. 机器人开发--NDC方案
  10. 演练 畅销书排行榜 1002 html
  11. 万兆网络传输速度测试_万兆网络有多快?实测一把先!
  12. AVR单片机开发6——AVR单片机串口Proteus调试注意事项
  13. 无限循环小数转化分数
  14. matlab中计算运行时间的函数,【谁能都我一个计算时间的函数?是计算:例如上午08:00...-计算时间的函数-数学-伊凡渴同学...
  15. vmware linux访问windowsxp下的文件
  16. java输出hello world_java输出Hello World
  17. 微信小程序 NFC HCE卡模拟
  18. jason前端面试题
  19. matlab制作gif表情
  20. 安卓 动画的深入分析

热门文章

  1. iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
  2. SQLite 入门教程(四)增删改查,有讲究
  3. 嵌入式linux 实现mdev SD卡和U盘自动挂载和卸载的方法 mdev.conf
  4. 关于realarm210 realarmTest.apk不能直接安装问题解决方法
  5. 9.7 top:实时显示系统中各个进程的资源占用状况
  6. java 圆的交点_java计算两条线段交点
  7. 多元统计分析最短距离法_多元统计分析重点
  8. python属性错误怎么改_属性错误:无法设置属性
  9. 图解ARP协议(五)免费ARP:地址冲突了肿么办?
  10. 2021云栖大会丨首批阿里云计算巢认证合作伙伴获得授牌,阿里云与合作伙伴共筑云上生态