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互转的更多相关文章

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

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

  2. 经典算法,yuv与rgb互转,查表法,让你的软件飞起来

    代码的运算速度取决于以下几个方面 1. 算法本身的复杂度,比如MPEG比JPEG复杂,JPEG比BMP图片的编码复杂. 2. CPU自身的速度和设计架构 3. CPU的总线带宽 4. 您自己代码的写法 ...

  3. 【视频处理】YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  4. YUV和RGB格式分析

    做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于opencv的处理,很多东西并不需要我们过多深入的去探讨,现在需要完全抛弃现有的算法程序,需要从内存中一个字 ...

  5. yuv rgb 互转 公式 及算法

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

  6. 嵌入式开发之davinci--- 8148/8168/8127 中的图像采集格式Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别

    简单来说,YUV: luma (Y) + chroma (UV) 格式, 一般情况下sensor支持YUV422格式,即数据格式是按Y-U-Y-V次序输出的RGB: 传统的红绿蓝格式,比如RGB565 ...

  7. YUV和RGB格式分析【转】

    转自:http://www.cnblogs.com/silence-hust/p/4465354.html 做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于 ...

  8. YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  9. 【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比

    [视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...

随机推荐

  1. layui-简单的登录注册界面【转载】

    register.html 源代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  2. layui上传文件前加入确认提示

    //上传文件 upload: function () { layui.use('upload', function () { var upload = layui.upload; //执行实例 var ...

  3. Selenium 2自动化测试实战41(多线程技术)

    多线程技术 python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的,原始的线程以及一个简单的锁.threading基于Java的线程模型设计. 1.th ...

  4. WebServer_简单例子

    #-*-coding:utf-8-*- importwebimportjson urls=("/.*","index")app=web.application( ...

  5. asyncio模块实现单线程-多任务的异步协程

    本篇介绍基于asyncio模块,实现单线程-多任务的异步协程 基本概念 协程函数 协程函数: 定义形式为 async def 的函数; aysnc 在Python3.5+版本新增了aysnc和awai ...

  6. Driver drowsy detection dataset

    Introduction Driver drowsy detection dataset consists of both male and female drivers, with various ...

  7. .NET Core WebApi中返回 json 数据首字母大小写问题

    public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(opt =& ...

  8. Day04:异常处理(二) / 多线程基础

    多线程 线程是什么? 一个线程是线程一个顺序执行流. 同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的栈堆.线程在切换时负荷小,因此,线程也被称为轻负荷进程.一个进程中可以包 ...

  9. Java学习笔记-网络编程

    Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...

  10. Python动态地声明变量赋值

    通过exec().globals()和locals() # 通过exec() for i in range(1, 4): # 第一次循环 i=1 时,会执行字符串中的python语句 ex1 = &q ...