不同格式的YUV 和 RGB互转

2024-06-02 22:18
文章标签 格式 不同 互转 rgb yuv

本文主要是介绍不同格式的YUV 和 RGB互转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

YUV色彩空间:
       Y是亮度值,也就是说8位的灰度值即可组成一幅黑白图像,黑白电视机就是这样的.
       UV是色彩值,是给Y上色用的.U是Cb也就是RGB中的蓝色分量,V是Cr也就是RGB中的红色分量.
       YUV444 指的是每四个像素采样中每个亮度Y分量都有一个色彩UV分量上色.
       YUV422 指的是每四个像素采样中两个亮度Y分量都有一个色彩UV分量上色.
       YUV420 指的是每四个像素采样中四个亮度Y分量都有一个色彩UV分量上色.

ITU-R BT.601 建议书里面记载了五种色彩变换式,分别是:

1. 模拟 RGB 讯号转为模拟 Y, (B-Y), (R-Y)
2. 模拟 (B-Y), (R-Y) 转为模拟 Cb, Cr
3. 模拟 YCbCr 数字化(取样、量化)成为数字 YCbCr
4. 模拟 RGB 数字化(取样、量化)成为数字 RGB
5. 数字 RGB 转为数字 YCbCr

1. 的变换式是

Y = 0.299 * R + 0.587 * G + 0.114 * B 

(R - Y) = 0.701 * R - 0.587 * G - 0.114 * B 

(B - Y) = - 0.299 * R - 0.587 * G + 886 * B 

2. 的变换式是

Cr = 0.713 * (R - Y) 
  = 0.500 * R - 0.419 * G - 0.081 * B 

Cb = 0.564 * (B - Y) 
  = - 0.169 * R - 0.331 * G + 0.500 * B 

就是你写的那个变换式。
上式 Y, R, G, B 的范围是 0.0~1.0,Cb, Cr 的范围是 0.5~-0.5。

模拟的 CbCr 通常表记为 PbPr。

由于这些表记的方法很乱,常有人会混合着用,所以写的时候最好注明是模拟还是数字,例如
3. 的模拟 YCbCr 数字化转换式
Y(d) = 219 * Y(a) + 16 
Cb(d) = 224 * Cb(a) + 128 
Cr(d) = 224 * Cr(a) + 128 

Y(a) 代表 analog,Y(d) 代表 digital。

4. 的模拟 RGB 数字化转换式
R(d) = 219 * R(a) + 16 
G(d) = 219 * G(a) + 16 
B(d) = 219 * B(a) + 16 

R(a), G(a), B(a) 的范围是 0.0~1.0,R(d), G(d), B(d) 的范围是 16~235。

加上 (a), (d),这样表记就清楚多了。

5. 的数字 RGB 转为数字 YCbCr
Y = (77 * R(d) / 256) + (150 * G(d) / 256) + (29 * B(d) / 256) 
Cb = - (44 * R(d) / 256) - (87 * G(d) / 256) + (131 * B(d) / 256) + 128 
Cr = (131 * R(d) / 256) - (110 * G(d) / 256) - (21 * B(d) / 256) + 128 

YCbCr: 16~235, RGB: 16~235

这个转换式是 straight 变换,没有 YC 伸张(Full-range,扩展 RGB: 0~255),有 YC 伸张的算式就是你提出的我以前写的那个算式。

这个表记法有点复杂,有的教科书在介绍亮度和色差的时候前面就先花了很多篇幅在定义表记的用法,例如我上面写的还是不及格,因为 BT.601 的 RGB 都要先经过 gamma correction,是 gamma 校正后的 RGB,要表记为 R'G'B' ^^;
还有那个 Y,是 BT.601 的 Y,所以 Y 的右下角要加上一个底字写 601,或者左上角要写 601,这样人家才知道你是 BT.601 定义的 Y,不是 BT.709 定义的 Y ^^;;

由于名词太多有点乱,许多人会混合着用,同样一个 YUV,有时候我们搞不清楚作者指的到底是数字的 YCbCr,还是模拟的 YPbPr,是 NTSC 的 YIQ,还是 PAL 的 YUV,是 601 的 YUV,还是 709 的 YUV,或者是 SMPTE 240M 的 YUV .... XD

有的时候作者在表记上没有明写,不过根据上下文意,我们可以猜出他说的是哪一个。
您看的那本书 ;) 有注明列的是 ITU-R recommendation BT.601 [1] 的 YCbCr 转换式,所以是模拟转换式,不是 BT.601-5。
当然用比较通用的 PbPr 来表示模拟色差是比较清楚的写法。

ITU 的建议书(recommendation)只要登记成为会员,每年都可以免费下载三本,601, 709, H.263 ..等等都可以免费下载 :D
http://www.itu.int/publications/bookshop/index.html

由 source code 可以得知,XviD 和大部分的软件一样是遵照这本书的标准转换式作的
http://www.video-demystified.com/book1/index.htm
算式为

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

这个算式是模拟 YCbCr 和模拟 RGB 的转换式,这是很多人会被弄迷糊的地方。


转自http://hi.baidu.com/xiaojian009/blog/item/6d03930c203a9fc67bcbe19e.html

这篇关于不同格式的YUV 和 RGB互转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025237

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown