存档

文章标签 ‘色彩空间’

[翻译]YUV和luminance的劣根性

2009年12月6日

本文翻译自Charles Poynton的文章”YUV and luminance considered harmful”。该文章的PDF版本可以在此处获得下载,原文的版权归Charles Poynton所有,中译文的翻译版权归本人所有。如需转载,请保留本声明。一切未保留本声明的转载而可能引起的纠纷,本人恕不负责。
===================
这是一篇规范在视频领域精确用词的请求。虽然YUV记号和术语“照度(luminance)”在数字视频领域被广泛应用,但事实上数字视频几乎从未用过Y’UV色彩差分分量空间,也从未直接表征过色彩科学中的照度(luminance)。将这两个词作为常用术语在视频领域使用几乎完全是错误的。在下面这则短文我将解释错误的原因。我急盼视频工程师和电脑图形专家使用正确的术语,而用Y’CbCr和luma称呼则基本都是正确的。

水泥与混凝土

我将在下面用类比的方式展现给大家使用正确术语的重要性。下回你在等公车时,问问和你一起排队的人,“人行道使用什么材料建成的?”也许那些人会给你这样的一个回答–“水泥”。
正确的答案是“混凝土”。水泥是生石灰和黏土的混合物,呈灰色的细粉状。水泥是混凝土的一种成分,其它成分还包括细沙、碎石和水。
在日常生活中,你不需要精确的了解以上这些术语应该用在何处:比如你指着某座桥说它是用“水泥”建造的,人们即会知道你的言下之意。外行们不会因“水泥”而困惑,而有趣的是,专家们也不会。如果某个桥梁监理朝向他的工头喊道:“给我500磅水泥”,工头从语境中就能立即明白监理要的实际上是不是混凝土。但是,如果你向某个建材提供商下500磅水泥的订单,你将显然不会收到500磅混凝土!外行不会因为不严谨的命名而犯难,而专家们也很少遇到麻烦。恰好是那些处于中间层的人们受到了不严谨命名的影响。更严重的是,他们甚至可能自己还没察觉到这其中的错误和歧义,一直使用着呢。

真正的CIE照度

色彩科学的原理告诉我们真正的CIE照度–用Y来表示–是由线性RGB分量的权重和得到的。如果CIE照度要在视频系统中传输,这个系统应该符合“恒定照度定律”。但在视频领域,我们采用是背离这一定律的工程近似方法。这种近似方法在1953年被标准化成NTSC的一部分,并且一直延续应用在当代的视频系统中。该近似方法的luma分量,表示成Y’,是通过非线性(经gamma校正)R’G'B’分量的权重和得到的。其中的非线性传递方程,可以粗略的等效成一个平方和运算。为了获得luma分量,我们使用了色彩科学中的理论系数,但我们使用了一个不同于色彩科学中描述的系统框图:正如我的书(译注:此处指Poynton于03出版的“Digital Video and HDTV Algorithms and Interfaces”一书)中提到的,在视频领域,gamma校正是在权重和运算之前而非之后进行的。运算的次序,实际上与色彩科学中的定义颠倒了。

照度的误解

视频工程师们于上世纪50年代开始觉察到视频量度Y’和CIE定义的照度有着很大的不同,并且认为需要将其和照度区分。他们将Y’这个量描述成“照度的量度表征”。他们虽然使用记号Y,但把它扩充成带上撇号的Y’,用来说明它的非线性。显然“量度表征”这个修饰语过于臃肿,随着时间的流逝,它被人给抹去了。并且同样随着时间的推移,Y’的上撇号也难逃魔掌。可惜的是,没有新词在这段时间被发明出来用以替代“照度”来区分色彩科学中的量度与视频领域量度的不同。当代的大多数视频工程师并不熟悉色彩科学,并且其中的大部分也不理解这个上述两个量度间的区分。今日的工程师常常鲁莽的使用“照度(luminance)”和记号Y,用来指代非线性(gamma校正后)R’G'B’分量的权重和。

这个草率的命名法还影响到许多被广泛使用的权威视频参考文档中,比如Pritchard在1972年发表在SMPTE上的论文。

计算机图形学的先驱Alvy Ray Smith在他探求如何将视频原理改写到计算机图形学时遭遇了“照度(luminance)”一词。Smith显然将这个词的用法与他色彩科学的知识联系到了一起,并且理所当然地,虽然是错误地,得出了视频中“照度(luminance)”与色彩科学中的照度相同的结论。因此,视频YIQ颜色空间被引入了计算机图形学领域,并产生了“它的Y分量和CIE照度一致”的断言。

这个错误的诠释还扩张到了一些权威计算机图形学教科书中。“计算机图形学:原理与应用”一书589页,13.3.3小节,“YIQ颜色模型”中,有这么一句话:

YIQ中的Y分量并不是黄色(Yellow)而是照度(luminance),它和CIE Y原色(primary)有着一样的定义。

(作者注:本段引用来自于原文,黄色指代之后介绍的CMY空间中的Y。CIE Y原色应该更精确地被描述成CIE Y分量。)

如同你已经看到的一样,视频中所谓的Y分量,其实应该更准确地标注为Y’分量,因为它不等同于CIE照度。视频中的Y’分量甚至不能直接从CIE Y分量中推导出,除非已知其它两个色度分量。因此上面引用的文字,是完全错误的。
约30万不同版本和修订版的CG:PP(简写)一书已经发行,这个错误的观念早已蔓延开来。

这个错误也渗入了数字图像处理领域,一本被广泛使用的教材这么写到:

NTSC规范化了一套用于传输三色YIQ值的色彩坐标系统,三色中的Y分量表征了色彩中的照度。

显而易见,视频量度并非三色值系统。根据CIE的定义,三色值系统应该与亮度(intensity)呈比例关系。

这种部分视频工程师中不严谨的命名方式,误导了一代数字图像处理和计算机软硬件工程师。

祭出luma

为了改用luma作为视频领域非线性分量量度的名词,我奔走呼号。luma一词在这之前并无任何意义,归因于它与luminance那一点点形态上的不同,它能让从其它领域来此的读者在草率做出其与luminance关系前多做些深入的调查。

得益于Fred Kolb的帮助,我的请愿成功了:在1993年,SMPTE通过了工程参考手册EG28。EG28定义了luma一词,并且区分了关于luminance的两个互相冲突的解释。虽然一份SMPTE EG和SMPTE标准仍有很大区别,但至少长年的努力得到了官方的认可。现在,已经没有任何借口在视频工程师撰写的论文中使用那个草率”luminance”了。

色彩差值的比例因子

为了表示色彩,luma常伴随着两个色彩差值–或者说chroma–分量。一般而言,这两个差值分量基于的是蓝色分量(B’)与luma的差值以及红色分量(R’)与luma的差值,此处蓝色分量、红色分量和luma分量都经过了gamma校正,即用B’-Y’以及R’-Y’获得。以这两个值为基数,在不同的应用场合使用不同的比例因子以得到最终的chroma分量。Y’PbPr的比例因子为模拟分量视频信号优化,Y’CbCr的比例因子则为诸如422母带视频,JPEG和MPEG等数字分量视频信号的应用做了优化。柯达的PhotoYCC(Y’C1C2)使用了为胶片记录颜色优化的比例因子。Y’UV和Y’IQ则为NTSC和PAL这类复合视频信号做了比例因子的优化。

BT.601标准中规定了分量数字视频信号中Y’CbCr的比例因子。Y’CbCr的chroma分量在实际应用中常常经过子采样产生422,420,411三种方案。

正确的Y’UV色域伸缩应该在形成分量NTSC或PAL视频信号的中间步骤执行。而并不适合于当分量仍然保持分离时的Y’UV伸缩工作。但是,考虑到Y’UV命名法本身就很不严谨地被使用,并且时常,特别是在计算领域,被指代任何B’-Y’和R’-Y’的伸缩算法。

DDR(数字磁盘记录仪)一般而言都具有通过局域网传输文件的能力。Abekas引入了使用.yuv作为这类文件扩展名的惯例。但是至少在Abekas的设备中,比例因子实际针对的处理对象是Y’CbCr。使用.yuv的扩展名反而恶化了YUV命名方式带来的误解。

子采样一般只在数字分量视频中出现,也就是说它处理的对象是Y’CbCr色彩空间。子采样并不适用于Y’UV色彩空间。如果你看到某个系统被描述成Y’UV 4:2:2,你将会陷入两难困惑。也许写下这种描述的人并不熟悉分量视频的原理,但是比例因子的选择是正确的。然,你必须清晰的认识到也有可能设计这个系统的工程师使用了错误的比例因子!如果使用了错误的公式,色彩表达的准确性将会受到影响;但这个却很难被检测出。

正确的Y’CbCr伸缩在Motion-JPEG和MPEG标准中时常见到。但是,计算机领域静态图片格式JPEG/JFIF的Y’CbCr伸缩常常使用的是全域(full range)luma和chroma幅度,没有上下动态余量(译注16-235)。其中chroma的幅度是luma幅度的245/255。这种Y’CbCr的伸缩实际上与模拟信号中Y’PbPr的方式几乎一致,但是却很遗憾地被描述成Y’CbCr了。现在甚至连Y’CbCr也有歧义了!我希望正确的Y’CbCr伸缩算法能在下一代JFIF中加入进来,使得在计算机中压缩后的静态图片和视频能无缝且不被转换过程所影响其质量的结合起来。

除在复合信号母带视频的编解码过程中尚能见到仅有的一些踪迹外,Y’IQ色域编码是就要被淘汰了的一种方式。

结论:一个请求
在视频领域使用照度(luminance)来标识Y’分量就和在描述桥梁建筑的主要材料时使用水泥而不是混凝土相同,外行并不关心,专家们自由自在,但出于中间层的人们吃了最大的苦。在视频领域,吃苦的就是那些在计算机内重新实现视频技术算法的程序源和工程师。他们最容易因为这些粗心的选词而遭殃。终端用户也因此受影响,因为用户间图像的交换是缺乏这种专家的保障的。

因此,我力劝视频工程师和计算机图形学专家避免使用YUV和luminance,而应该使用正确的术语,Y’CbCr和luma。

admin 技术宅区

[联动]渲染器输出效果 Mark II

2009年11月15日

之前用vx的测试结果做了些测试,今天vx又做了一系列测试,还是用之前的方法,来得到diff map和ssim map,看下各渲染器的表现。
vx的第二批测试见此文

先把diff map和SSIM map扔上来 具体分析待到明日吧XDD
SSIM值
EVR/VMR9/ffdshow 0.9554
haali 0.9516
madVR 0.9101
madVR no dithering 0.9106

diff map(此次我把三个通道都绘制在一个figure中了)

VMR9
VMR9_diff_map

EVR
EVR_diff_map

ffdshow
ffdshow_diff_map

haali
haali_diff_map

madVR
madVR_diff_map

madVR no dithering
madVR_no_dithering_diff_map

SSIM map

VMR9
VMR9_SSIM_map

EVR
EVR_SSIM_map

ffdshow
ffdshow_SSIM_map

haali
haali_SSIM_map

madVR
madVR_SSIM_map

madVR no dithering
madVR_no_dithering_SSIM_map

admin ACG, 技术宅区 , , , ,

渲染器输出效果 – VX测试联动贴

2009年11月14日

话说vx不辞辛苦,深夜写文研究不同渲染器的显示质量,实在令人钦佩,换我3点肯定大脑已经停转到看动画片都不能集中精力了…

具体来说,vx通过渐变图片比较了通过不同渲染器输出显示的效果,理论基础是由于输出过程中要做yv12的插值和YUVtoRGB的转换,这两项皆是衡量渲染器质量的关键因素之一。
联动贴在此,在看本文前没看过vx测试和分析的请先移步他那。

vx得到的结果是madVR > Haali > VMR ≈ EVR

我存在的疑惑是,何为最优秀的渲染输出质量。由于源渐变图片应该是有分立、有限数量个的纵向色条组成,有色条既有阶跃,那么我认为如果一个渲染器的输出结果,能有效地保留这些阶跃信息,那么他就是最优秀的。
那么,很显然,这样的判断存在两个方向的可能性,其一是阶跃信息被过分柔化,对于彩色图片来说,一个极端的例子就是color bleeding;其二是阶跃信息被过分保留,甚至由于插值的不精确,让某些非阶跃处也产生了false contour。
当然由于vx原图色条数不明,因此不好断定那些输出的色条是真的原色条,哪些是由于渲染器插值算法产生的假色条。

首先我试了肉眼观测的结果,根据我上面的分析,抛开一切质量判定,单就阶跃信息的保留程度来说,我的判断如下:

-<———— – 原图 + ————->+
|                             |              |
madVR                 Haali       EVR/VMR

之后,我又想到了用数学的方法去计算原图和不同渲染器输出间的差距,由于作为知道测试流程和准备的我们得出的判断在研究的场合都是站不住脚的,而我们又无法去让多人做主观评价;因此数学质量模型即是一个比较具有公正性的方法了:
我尝试了两种数学模型,其一是最简单的Mean Difference Error,也就是MSE的1阶形式,简而言之就是比较原图和不同渲染器生成的图的mean和variance,由于vx的图上下部分特性迥异,出去全局比较外,我还做了分离上下部分的比较,结果如下:

标注说明
c – color(下部图片), g – grayscale(上部图片)
avg – average of difference, var – variance of difference
e – EVR, m – madVR, h – haali, v – VMR9

全局值[R G B]
Mean Difference
EVR = [0.2551 0.1347 0.3210]
VMR9 = [0.2551 0.1347 0.3210]
Haali = [0.1054 0.7376 0.1238]
MadVR = [0.3278 0.2054 0.4443]
Variance of Difference
EVR = [0.4420 0.2811 0.5055]
VMR9 = [0.4420 0.2811 0.5055]
Haali = [0.3428 0.5260 0.3661]
MadVR = [0.6393 0.3759 0.7889]

Color部分[R G B]
Mean Difference
EVR = [0.2260 0.1077 0.3531]
VMR9 = [0.2260 0.1077 0.3531]
Haali = [0.0923 0.6421 0.1505]
MadVR = [0.3073 0.1879 0.5366]
Variance of Difference
EVR = [0.4210 0.2874 0.5363]
VMR9 = [0.4210 0.2874 0.5363]
Haali = [0.3254 0.6033 0.3880]
MadVR = [0.6257 0.3983 0.8789]

Grayscale部分[R G B]
Mean Difference
EVR = [0.2842 0.1617 0.2888]
VMR9 = [0.2842 0.1617 0.2888]
Haali = [0.1185 0.8330 0.0972]
MadVR = [0.3483 0.2228 0.3520]
Variance of Difference
EVR = [0.4212 0.2733 0.4725]
VMR9 = [0.4212 0.2733 0.4725]
Haali = [0.3598 0.4305 0.3428]
MadVR = [0.6522 0.3529 0.6819]

Difference Map如下

EVR/VMR9
EVR_Diff_map

Haali
Haali_Diff_map

MadVR
MadVR_Diff_map

从MDE的测试结果来看,似乎与vx观察的结论完全相反,无论是彩色部分还是灰阶部分,MadVR的效果都位列最后;值得注意的是EVR和VMR9完全一样的结果,也就是说从统计意义上说,两者是相等的。
另一个奇怪的地方是Haali的G(绿色)分量误差在grayscale时反常的大。
还有一个问题是由于vx得到不同渲染器的输出时,使用了avs中的色彩空间转换滤镜和色彩空间指定滤镜,也就是说喂给不同渲染器的输入源实际上与原photoshop中生成的图已有偏差,而这个偏差无法测量,因此第一种方法结论的可靠性是很差的。

于是我想到了SSIM这种方法,使用SSIM算法得到的原图与各渲染器输出直接的SSIM Index如下:
EVR = 0.9978
VMR9 = 0.9978
Haali = 0.9927
MadVR = 0.9940
在此大跌眼镜,MadVR和Haali继续被EVR/VMR9甩出好几条街…最后我们再来看下SSIM Map,他表示的是在SSIM这种算法下,原图和测试图之间的差距,他是一个intensity map:

EVR/VMR9
EVR_SSIM_Map
VMR9_SSIM_Map

Haali
Haali_SSIM_Map

MadVR
madVR_SSIM_Map

maybe we need stick on Haali? LOL

值得说明的是,我在这也只是把测试结果拿出来给大家看看,我自己本身的质量判断并没有体现在上面任何的叙述中。同样这种测试是否valid也是值得进一步斟酌的。
总之,这仍然是一个open question,欢迎大家讨论。

admin ACG, 技术宅区 , , , , , , ,

Switch to our mobile site