YUV/RGB颜色空间转换公式

2023-05-16


经过调研,最终选择以下转换公式:

Jack, Keith. Video Demystified: a Handbook for the Digital Engineer, LLH
Technology Publishing, 3rd Edition, 2001.
BT601:
Y’ = 0.257R’ + 0.504G’ + 0.098B’ + 16
Cb’ = -0.148
R’ - 0.291G’ + 0.439B’ + 128
Cr’ = 0.439R’ - 0.368G’ - 0.071B’ + 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)
BT709:
Y’ = 0.183R’ + 0.614G’ + 0.062B’ + 16
Cb’ = -0.101
R’ - 0.338G’ + 0.439B’ + 128
Cr’ = 0.439R’ - 0.399G’ - 0.040B’ + 128
R’ = 1.164
(Y’ - 16) + 1.793*(Cr’ - 128)
G’ = 1.164*(Y’ - 16) - 0.534*(Cr’ - 128) - 0.213*(Cb’ - 128)
B’ = 1.164*(Y’ - 16) + 2.115*(Cb’ - 128)


以下为一部分参考资料:

一般来讲,我们把YUV、Y‘UV、YCbCr, YPbPr包含在YUV颜色模型的范围内,其中Y都表示亮度,UV表示两个色度分量,但是具体的颜色模型的用途又各不相同,当然,他们与RGB的互转公式也就不相同。在电视系统发展的早期,YUV和Y’UV都是颜色信息的模拟信号编码形式,虽然Y和Y’都表示亮度,但是两种亮度的意义却天差地别,Y用来代指luminance,表示的是自然颜色的亮度,而Y‘代指luma,表示的是经过伽马压缩之后电信号的强度。在现在的计算机系统中,YUV一般用来代指YCbCr,用来表示文件的编码格式,用于数字视频的编码,而YPbPr颜色模型常常用在模拟分量视频中。所以YUV颜色模型到RGB颜色模型的转换,应该对应两种方式,分别是模拟YUV->模拟RGB、数字YUV->数字RGB。不过因为标清、高清、以及超清幅面,YUV转RGB的权重值各不相同,需要将模拟信号和数字信号再做一次幅面划分,就出现了6种转换公式。

1.模拟YUV→模拟RGB

1) BT601(标清国际定义)

Y = 0.299 * R + 0.587 * G + 0.114 * B   
Pb =-0.169 * R - 0.331 * G + 0.500 * B
Pr = 0.500 * R - 0.439 * G - 0.081 * B
R = Y + 1.402* Pr             
G = Y - 0.344 * Pb - 0.792* Pr        
B = Y + 1.772 * Pb

2)BT709(高清)

Y = 0.213 * R + 0.715 * G + 0.072 * B     
Pb =-0.115 * R - 0.385 * G + 0.500 * B
Pr = 0.500 * R - 0.454 * G - 0.046 * B
R = Y + 1.402* Cr            
G = Y - 0.344 * Cb - 0.792* Cr       
B = Y + 1.772 * Cb

2. 数字YUV→数字RGB

1)BT601

Y = 16 + 0.257 * R + 0.504 * G+ 0.098 * B
Cb = 128 - 0.148 * R - 0.291 * G+ 0.439 * B
Cr = 128 + 0.439 * R - 0.368 * G - 0.071 * B
R = 1.164 *(Y - 16) + 1.596 *(Cr - 128)
G = 1.164 *(Y - 16) - 0.392 *(Cb - 128) - 0.812 *(Cr - 128)
B = 1.164 *(Y - 16) + 2.016 *(Cb - 128)
即:
R = 1.164 * Y + 1.596 * Cr - 222.912
G = 1.164 * Y - 0.392 * Cb - 0.812 * Cr + 135.488
B = 1.164 * Y + 2.016 * Cb - 276.672

2)BT709

Y = 16 + 0.183 * R + 0.614 * G + 0.062 * B
Cb = 128 - 0.101 * R - 0.339 * G+ 0.439 * B
Cr = 128 + 0.439 * R - 0.399 * G- 0.040 * B
R = 1.164 *(Y - 16) + 1.792 *(Cr - 128)
G = 1.164 *(Y - 16) - 0.213 *(Cb - 128) - 0.534 *(Cr - 128)
B = 1.164 *(Y - 16) + 2.114 *(Cb - 128)
即:
R = 1.164 * Y + 1.596 * Cr - 222.912
G = 1.164 * Y - 0.392 * Cb - 0.812 * Cr + 135.488
B = 1.164 * Y + 2.016 * Cb - 276.672

3. 超清幅面的计算公式,可以按照下面的推导公式推导

1)模拟RGB转YUV的推导公式 :

Wr + Wg + Wb = 1; UMax = 0.5; VMax = 0.5
Y = Wr * R + Wg * G + Wb * B;
Pb = Umax * (B - Y) / (1 - Wb);
Pr = Vmax * (R - Y) / (1 - Wr);

2)数字RGB转YUV的推导公式:

Wr + Wg + Wb = 1; Umax = Vmax = 0.5;
Y = 16 + 219 * (Wr * R + Wg * G + Wb * B) / 255;
Cb = 128 + 224 * (Umax * (B - Y) / (1 - Wb)) / 255;
Cr = 128 + 224 * (Vmax * (R - Y) / (1 - Wr)) / 255;
其中:
BT601 Wr = 0.299 Wg = 0.587 Wb = 0.114
BT709 Wr = 0.2126 Wg = 0.7152 Wb = 0.0722
BT2020 Wr = 0.2627 Wg = 0.678 Wb = 0.0593
参考链接:https://blog.csdn.net/xiaoyafang123/article/details/107866406

=============================================================分割线

RGB to YUV Conversion

Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

B = 1.164(Y - 16) + 2.018(U – 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U – 128)
R = 1.164(Y - /16) + 1.596(V - 128)
参考链接:https://www.fourcc.orgfccyvrgb.php

=============================================================分割线

The RGB2YCrCb function uses the following equations when converting gamma-corrected RGB data to YCrCb data:

Y’ = 0.257R’ + 0.504G’ + 0.098B’ + 16
Cr = 0.439R’ – 0.368G’ – 0.071B’ + 128
Cb = –0.148R’ – 0.291G’ + 0.439B’ + 128
The YCrCb2RGB function uses the following equations when converting YCrCb data to RGB data:
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)
参考链接:https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ds/rgb.pdf?wapkw=color space

==================================================================分割线

1. (BT601) 下的YUV与RGB转换公式

名词解释:
量化后: 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.小数形式,未量化( 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.299R + 0.587G + 0.114*B;
U = (B-Y)/1.772;
V = (R-Y)/1.402;

或写为:
Y = 0.299R + 0.587G + 0.114B;
U = -0.169
R - 0.331*G + 0.5 B ;
V = 0.5 R - 0.419G – 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 = (77R + 150G + 29B)>>8;
U = ((-44
R - 87G + 131B)>>8) + 128;
V = ((131R - 110G - 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 = (298Y + 411 * V - 57344)>>8
G= (298
Y - 101* U- 211* V+ 34739)>>8
B= (298Y + 519 U- 71117)>>8
rgb --> yuv
Y= ( 66R + 129G + 25B)>>8 + 16
U= (-38
R - 74G + 112B)>>8 +128
V= (112R - 94G - 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’= ((219Y)>>8) + 16;
U’= ((219
U)>>8) + 128;
V’=((219*V)>>8) + 128;

2. Rec2020 (BT2020) 下的YUV与RGB转换公式

1. BT2020 文档上的公式

Y = 0.2627R + 0.6780G + 0.0593B;
U = -0.1396
R - 0.3604G + 0.5B;
V = 0.5R - 0.4598G -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 = (256Y - 32U -30V+ 7826)>>8;
_U = (258
U +17V - 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
]
参考链接:https://www.cnblogs.com/luoyinjie/p/7219319.html
另外参考链接:
BT601官方文档:https://www.itu.int/rec/R-REC-BT.601
BT709官方文档:https://www.itu.int/rec/R-REC-BT.709
维基百科:https://en.wikipedia.org/wiki/YCbCr

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YUV/RGB颜色空间转换公式 的相关文章

  • 从字节数组创建 8 位图像

    字节数组是这样获得的 BufferedImage image new Robot createScreenCapture new Rectangle screenDimension byte array DataBufferByte get
  • Powerpoint VBA - 将 RGB 颜色作为变量传递

    我希望允许用户通过文本框输入 RGB 颜色并传递该变量来更改所有形状的颜色 我编写了一个循环 该循环将查看形状名称的最后 2 个字符 以确定是否应将其更改为主要颜色或次要颜色 这是最新的 Office 365 的 Powerpoint 我已
  • 模拟颜色透明度

    我有 RGB 颜色值和 alpha 值 假设我有白色背景并且应用了 alpha 如何获得新的 RGB 值 应用于每个颜色通道的公式如下 cr cf af cb ab 1 af where cr是像素的最终颜色 cf是前景色 cb背景颜色 a
  • 将 RGB 图像数组乘以标量后,使用 plt.imshow 获取黑色图

    所以我有点困惑为什么会发生这种情况 I have a binary image 现在我想将此二进制图像转换为 RGB 空间 因此我使用dstack连接第三轴的函数 Everything works fine so far but now I
  • 什么是 YUV 格式? (从一个不会玩的初学者的角度来看)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 视频质量指标称为VMAF https github com Netflix vmaf由 Netflix 评估 YUV 格式的视频 但什么是
  • 如何使用 ffmpeg 从 YUV 视频中提取帧(或特定帧)

    这是从a中提取帧的代码MP4视频 ffmpeg i above marathon 250 mp4 images 03d bmp但相同的代码不适用于YUV格式化视频 有谁知道如何从中提取帧YUV格式化视频 它不起作用 因为 yuv 文件没有标
  • 将真彩色 RGB 图像转换为索引颜色

    我想使用索引调色板将 24 位 RGB 图像 每个通道 8 位 转换为 8 位 我最初的想法是创建一个数组并简单地计算每种颜色在图像中出现的次数 但我认为如果有大面积的颜色略有变化而占用了所有调色板空间 那将是浪费较小但可能更重要的颜色组
  • 在 JavaScript 中检测图像大部分是深色还是浅色?

    我正在寻找一种方法来扫描任何给定的图像并确定它是否大部分是暗的或亮的 在明亮鲜艳的颜色或暗且不饱和的颜色的意义上 这是用 PHP 完成的 背景图片深色还是浅色 https stackoverflow com questions 584244
  • .Net 使用 Lockbits 从位图中获取 RGB 值

    我使用下面的代码从图像中提取 RGB 值 有时这有效 但是在某些文件上 似乎步幅不能被位图宽度整除 它返回混合值 Dim rect As New Rectangle 0 0 bmp Width bmp Height Dim bmpData
  • 在 javascript 中更改 RGB 颜色的色调

    如同this https stackoverflow com questions 6443990 javascript calculate brighter colour 如何增加亮度 我想更改 RGB 十六进制 颜色的色调 Say cha
  • 有人知道 10 位原始 RGB 吗?关于全视

    我正在使用 Omnivision ov5620 http electronics123 net amazon datasheet OV5620 CLCC DS 20 1 3 pdf http electronics123 net amazo
  • NV21 格式和奇数图像尺寸

    我在 Android 中使用 NV21 图像已经有一段时间了 我一直在跟踪可能由 NV21 图像中不正确的索引字节引起的错误 答案中的图片这个问题 https stackoverflow com questions 5272388 extr
  • 如何知道图像是 RGB 还是 BGR 格式?

    有没有办法提前知道用作系统输入的图像是 RGB 还是 BGR 格式 我正在使用 OpenCV 和 java API 我想将输入图像转换为灰度或 L a b 颜色空间 但在 OpenCV 中 您必须首先指定要转换的图像是 RGB 还是 BGR
  • 如何设置 BufferedImage 中的 RGB 像素以显示 16 位深度的 PNG?

    我正在尝试读取并显示 PNG 文件 我处理 8 位深度的图像没有问题 我按如下方式进行 BufferedImage result new BufferedImage width height BufferedImage TYPE INT R
  • 颜色生成功能

    让我们考虑以下场景 一个可以生成从白色到红色 从白色到蓝色 从白色到粉色 从白色到橙色等代码颜色的函数 颜色代码采用 RGB 格式 值从 0 到 255 有任何想法吗 您能给我伪代码或此类算法的链接吗 听起来你在追求线性插值 http en
  • Android Renderscript - 在 Renderscript 中旋转 YUV 数据

    根据我的讨论Camera2 api Imageformat yuv 420 888 旋转图像上的结果 https stackoverflow com questions 44652828 camera2 api imageformat yu
  • RGB 值作为变量

    如何在 rgb 中存储变量值 我使用这个不起作用的代码 我希望它是这样的 但不知怎的 它没有正确存储 R 将引号放在 200 左右 否则 R 也不起作用 我假设你正在使用 JavaScript 结果在 colval rgb 200 10 1
  • RGBA格式HEX转换成RGB格式HEX? PHP

    我想在 RGBA 格式的十六进制颜色之间来回转换 例如0xFF0000FF 和 RGB 格式的十六进制颜色 例如0xFF0000 在 PHP 中 我怎样才能做到这一点 这两个函数将满足您的需要 function rgbaToRgb rgba
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • Alpha 混合红色、蓝色和绿色图像以生成着色为任何 RGB 值的图像?

    基本上 我有一个上下文 我无法以编程方式对图像进行着色 尽管我可以更改它的 alpha 值 通过一些实验 我发现我可以使用特定的 alpha 值对图像的红色 蓝色和绿色版本进行分层 以产生各种颜色 但是我想知道是否可以通过这种方法实现真正

随机推荐