开启辅助访问
 找回密码
 立即注册

yuv和rgb各有什么优点?

zoekin 回答数5 浏览数729
在学习ffmpeg的时候,发现视频有两种表示图片的方法,一种是yuv,一种是rgb。查了一下,发现两者可以通过公示转换。但是不清楚两者到底有什么区别,各有什么优点。
使用道具 举报
| 来自河北 用Deepseek满血版问问看
sbt702 | 未知
1. YUV的原理
YUV 的原理是把亮度(Luma)与色度(Chroma)分离。
“Y”表示亮度,也就是灰度值。
“U”表示蓝色通道与亮度的差值。
“V”表示红色通道与亮度的差值。
其中 Y 信号分量除了表示亮度信号外,还含有较多的绿色通道量,单纯的 Y 分量可以显示出完整的黑白图像。
U、V 分量分别表示蓝 (blue)、红 (red) 分量信号,只含有色度信息,所以 YUV 也称为 YCbCr,其中,Cb、Cr的含义等同于U、V,C 可以理解为 component 或者 color。
RGB 转 YUV 的公式能更好地反应 YUV 与 RGB 的关系,以及为什么称为 YCbCr:


RGB与YUV的变换公式如下:


在RGB色彩空间中,三个颜色的重要程度相同,所以需要使用相同的分辨率进行存储,最多使用RGB565这样的形式减少量化的精度,但数据量还是很大的。
研究发现人眼对亮度的敏感超过色度。将图像的亮度信息和颜色信息分离,并使用不同的分辨率进行存储,这样在对主观感觉影响很小的前提下,可以更加有效地存储图像数据。
2. YUV的取值范围
与RGB每个像素点的每个分量取值范围为0-255不同(每个分量占8bit),YUV取值范围有两种:


  • 以Rec.601为代表(还包括BT.709 / BT.2020)的广播电视标准中,Y的取值范围是16-235,U、V的取值范围是16-240。FFmpeg中称之为“mpeg”范围。
  • 以JPEG为代表的标准中,Y、U、V的取值范围都是0-255。FFmpeg中称之为“jpeg” 范围。
实际中最常见的是第1种取值范围的YUV(可以自己观察一下YUV的数据,会发现其中亮度分量没有取值为0、255这样的数值)。很多人在这个地方会有疑惑,为什么会去掉“两边”的取值呢?
原因:


  • 在广播电视系统中不传输很低和很高的数值,实际上是为了防止信号变动造成过载,因而把这“两边”的数值作为“保护带”[4]。
下面这张图是数字电视中亮度信号量化后的电平分配图。从图中可以看出。


  • 对于8bit量化来说,信号的白电平为235,对应模拟电平为700mV。
  • 黑电平为16,对应模拟电平为0mV。
  • 信号上方的“保护带”取值范围是236至254,而信号下方的“保护带”取值范围是1-15。
  • 最边缘的0和255两个电平是保护电平,是不允许出现在数据流中的。
【相关资料推荐,点击链接免费报名,先码住不迷路~】
【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂YUV视频花屏、PCM音频编码噪音、音视频不同步C/C++/Linux/FFmpeg/webRTC/rtmp/hls/rtsp/ffplay/srs_哔哩哔哩_bilibili【免费分享】资料包括《Andoird音视频开发必备手册+音视频学习视频+学习文档资料包+大厂面试真题+2022最新学习路线图》等等,有需要的可以点击726257173加群领取~希望对大家有帮助!


与之类似,10bit量化的时候,白电平是235*4=940,黑电平是16*4=64。




下面两张图是数字电视中色度信号量化后的电平分配图。可以看出:


  • 色度最大正电平为240,对应模拟电平为+350mV。
  • 色度最大负电平为16,对应模拟电平为-350mV。
  • 需要注意的是,色度信号数字电平128对应的模拟电平是0mV。


3. YUV的存储格式
YUV格式有两大类:planar和packed。
对于 planar 的 YUV 格式,先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。相当于将 YUV 拆分成三个平面 (plane) 存储。
对于 packed 的 YUV 格式,每个像素点的 Y,U,V 是连续交替存储的。
4. YUV的采样格式
主要的采样格式有YUV4:4:4、YUV4:2:2、YUV4:2:0 ,其中YUV4:2:0是最常用的采样格式。
采样就是根据一定的间隔取值。其中的比例是指 Y、U、V 表示的像素,三者分别占的比值。


下图是YUV4:4:4,YUV4:2:2,YUV4:2:0的采样示意图。




  • YUV 4:4:4采样,每一个Y对应一组UV分量。
  • YUV 4:2:2采样,每两个Y共用一组UV分量。
  • YUV 4:2:0采样,每四个Y共用一组UV分量。
5. 存储方式
下面用图的形式给出常见的YUV数据的存储方式,并在后面附有取样每个像素点的YUV数据的方法。
(1) YUYV 格式 (属于YUV422)




相邻的两个Y共用其相邻的两个Cb、Cr,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
(2) UYVY 格式 (属于YUV422)


与YUYV不同的是UV的排列顺序不一样,还原其每个像素点的YUV值的方法与上面一样。
(3) YUV422P(属于YUV422)


YUV422P是一种平面模式,其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。
(4) YUV420P格式(属于YUV420)





YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。




YUV420p.png
I420: YYYYYYYY UU VV
YV12: YYYYYYYY VV UU
(5) NV12、NV21(YUV420sp,属于YUV420)


这两种格式的不同在于UV交错排列的顺序不同,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
假设一个分辨率为8X4的YUV图像,它们的格式如下图:
YUV420sp格式如下图


NV12: YYYYYYYY UVUV
NV21: YYYYYYYY VUVU
以w*h大小图像的YUV420数据为例,
其存储格式是: 共大小为(w * h * 3/2)字节,
Y分量:(w * h)个字节
U(Cb)分量:(w * h/4)个字节
V(Cr)分量:(w * h/4)个字节
6. 10bit YUV数据的存储
常见的yuv数据,每个像素的一个通道一般是占用一个字节即8bit。而HDR常用的标准HDR10,数据是10bit的。
10bit数据是怎么存储的呢?我们一般会有两种想法:


  • 每个像素的一个通道占用两个字节,其中6个bit是填充位。
  • 每个像素的一个通道占用10bit,10bit数据和10bit数据是挨着排列的。
优缺点


  • 方式1:便于运算处理,有存储冗余;
  • 方式2:存储没有冗余,计算麻烦。
事实上,10bit是采用方式1存储的,并且高有效字节的前6个bit是填充的0。
HDR10视频解码得到YUV数据的命令:
//yuv420p10le格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv

//yuv420p10be格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv(1)yuv420p10le的数据格式的16进制的显示:


比如地址019f7040h开始的两个字节:
-------------低地址---->高地址--------------
00011111 000000 01  (2)yuv420p10be的数据格式的16进制的显示:


比如地址019f7040h开始的两个字节:
-------------低地址---->高地址--------------
000000 01 00011111
用Deepseek满血版问问看
回复
使用道具 举报
mey | 来自福建
这个问题要从3个角度回答

1,YUV中的Y指的是亮度信息。也就是说,只靠Y数据,可以完美实现黑白图像。
早期技术不发达的时候,照片打印和电视播放都只能实现黑白的灰度显示,所以Y数据就成了标准。之后才有了彩色打印和彩色电视,为了兼容之前的黑白数据,厂商发明了UV数据。YUV一起就可以实现彩色,单独使用Y可以实现黑白,这样一套数据格式就同时兼容了黑白设备和彩色设备。

2,人眼对亮点信息更敏感。也就是说,可以压缩UV数据,而人眼难以发现。
所以压缩算法的第一步,往往先把RGB数据转换成YUV数据。对Y少压缩一点,对UV多压缩一点,以平衡图像效果和压缩率。

3,既然YUV更有优势,为什么还要保留RGB呢?
因为目前人类发明的所有彩色的输入输出设备,本质上都只支持RGB数据。哪怕设备允许YUV的输入输出,那也是经过内部的数据转换而间接支持。
回复
使用道具 举报
kingwang1227 | 来自北京
这么说吧,要是没电视,就没yuv了。
回复
使用道具 举报
mark335 | 来自北京
RGB 是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。
YUV 主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需占用极少的频宽( RGB 要求三个独立的视频信号同时传输)。其中 “Y” 表示明亮度( Luminance 或 Luma ),也就是灰阶值;而 “U” 和 “V” 表示的则是色度( Chrominance 或 Chroma ),作用是描述影像色彩及饱和度,用于指定像素的颜色。主要的采样格式有 YCbCr 4:2:0 、 YCbCr 4:2:2 、 YCbCr 4:1:1 和 YCbCr 4:4:4 。其中 YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值 ( 也就是 Y 值 ) ,每 2x2 个点保存一个 Cr 和 Cb 值 , 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R , G , B 都是 8bit unsigned) 模型, 1 个点需要 8x3=24 bits (如下图第一个图),(全采样后, YUV 仍各占 8bit )。按 4:1:1 采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits ( 4 个点, 8*4 ( Y ) +8(U)+8(V)=48bits ) , 平均每个点占 12bits( 如下图第二个图 ) 。这样就把图像的数据压缩了一半。
就是说,YUV格式比RGB格式储存空间小。
回复
使用道具 举报
小姆 | 来自北京
快快答一下吧
可见光是可以被分解的, 表示一个点, 有不同的分解方法
yuv: y是亮度分量, uv是色度分量
rgb: 分别是不同的颜色分量, 红色绿色蓝色
以下凭印象答, 这个印象有点模糊, 细节忘记:
yuv三分量的分法被认为是对于人类的视觉系统来说, 正交化比较好的一种分法
但在一般的显示器上, yuv都要转换成rgb显示, 后者能直接对应显示系统, 好像是在电子显像管年代就是用这三个颜色的原理来显像, 但是具体用的哪三个颜色好像有些地方有点不一样, 有红绿蓝系统或者别的系统
回复
使用道具 举报

相关问题更多>

快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影