留一个备份 英语:ZT: 关于视频信号里面YUV,RGB取值范围的一些帖子(页 1) - 软件应用和视频技术...

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 12:23:56
我把以前写过的东西做一个整理,因为时间的关系,我没有办法把每一个细节都讲得非常的详细,不过我会把大概的原因,和处理的方法,尽量用很精简的方式,条列整理出来。如果对更深入的原理有兴趣,请搜寻过去零散的讨论。

一切都要从 ITU-R BT.601 这个"建议"开始说起。
现今的 DVD/VCD/DV 都是遵循 ITU-R BT.601 这个规格,这个规格规定了,模拟影像转数字时,取样的方式,储存的数据格式、数据范围等等。
当影像转为 MPEG 的时候,RGB 数据要转成 MPEG 使用的 YUV 格式。ITU-R BT.601 里面规定了这个 RGB <-> YUV 的转换式,数据范围 0~255 的 RGB 要转为 YUV 的时候,要先做数据范围的压缩,把范围压缩成 16~235,然后才转成 YUV 储存起来。然后 MPEG 解压缩的时候,解出来的 YUV,要做数据范围的扩张,将 Y: 16~235, UV: 16~240 的数据扩展为 0~255 的 RGB,也就是还原回原来的 RGB 数值,然后才能显示在显示器的屏幕上。
这个 0~255 RGB -> 16~235 YUV 的过程,就叫做 YC 压缩。
反过来 16~235 YUV -> 0~255 RGB 的过程就叫做 YC 伸张。
我们可以很清楚地看到,YC 伸张和压缩要互相搭配,最终显示出来的结果才正确。
如果:
A. 播放时
1. 转 MPEG 的时候没有做 YC 压缩,储存的是 0~255 的 YUV,播放时就不可以做 YC 伸张,否则 0~255 的资料再伸张一次,会变成 -19~278。当然,8 bits 的数据储存范围只能是 0~255,数据超出的范围会被削掉(clipping),整个画面对比会过强,色彩会崩溃。
2. 转 MPEG 的时候有做 YC 压缩,储存的是 16~235 的 YUV,播放时就一定要做 YC 伸张,如果不做 YC 伸张,显示的是 16~235 YUV -> 16~235 RGB。RGB [235,235,235] 在显示器上看起来不是纯白,而会有点灰灰的,[255,255,255] 才是纯白。
相同的,[16,16,16] 看起来也不会是纯黑,[0,0,0] 才是纯黑。
16~235 的 RGB,数据范围(动态范围)缩小,对比会变差,色彩黯淡,看上去好像蒙上了一层白纱。
显示卡的 DirectDraw Overlay,使用硬件的 YUV -> RGB 色彩空间转换,都会遵守 ITU-R BT.601 的建议,认为 MPEG 的 YUV 数据范围应该是 16~235,所以都会做 YC 伸张。

所以我们可以得到结论,当转成 MPEG 的时候,一定要确保 YUV 的数据范围是 16~235,这样在计算机上看、在电视上看,才会看到正确的色彩、对比表现。
所以
B. 压缩时
1. 如果输入的 RGB 数据范围是 0~255,转 MPEG-2 时就要先做 YC 压缩,转成 16~235 的 YUV,这样将来播放时显示才会正确。
2. 如果输入的 RGB 数据范围是 16~235,转 MPEG-2 时就不能做 YC 压缩,要直接转成 16~235 的 YUV,这样将来播放时显示才会正确。
如果输入的是 16~235 RGB,转 MPEG 时又再做一次 YC 压缩,数据范围会变成 30~218 YUV,这样即使将来播放时做 YC 伸张,还是只能伸张到 16~235 的 RGB,结果还是不对。

那么,重点就是
1. 怎么知道输入的讯源是 16~235 RGB,还是 0~255 RGB?
2. 怎么知道压缩的 MPEG 软件在转 RGB -> YUV 的时候会做 YC 压缩,还是不做 YC 压缩?