色度上采样错误和4:2:0隔行扫描色度问题(一)

 原文链接        译文PDF

                                                                                                               

 译序

        

          原文包含两个部分,第一部分发表时题目为《The Chroma Upsampling Error and The 4:2:0 Interlaced Chroma Problem》。后来全文发表时题目为《DVD Benchmark - Special Report》。为了准确起见,译文使用第一次发表时的题目。

 

         限于译者水平,如有翻译问题,请以原文为准。

 

           译文是为了学习、研究之用,如要用于商业用途,请与原文作者联系。

 

 

术语及缩写:

                   CUEChroma Upsampling Error   色度上采样错误)

              ICP Interlaced Chroma Problem 隔行扫描色度问题)

 

译文:

 

3 AD ( After Discovery )

 

          早在20014月,我们第一次撰写了关于CUE问题的文章。当时,我们只讲了前半部分(因为后半部分我们还没有搞清楚)。现在,我们又回来了,为你带来A/V影音界广泛提及的“颜色Bug”的最新信息。如果你刚刚听说颜色Bug并且来我们这里寻找答案,那么你或许会对这一切究竟是怎么发生的感兴趣。

 

          也就在三年多一点之前,Snell & WilcoxRichard Ansell第一次跟我们提到CUE问题。Richard使用一台非常昂贵的精品DVD播放机给我们演示了这个问题。当时,他给我们演示了《The Fifth Element》中的一个场景,这个场景中有一个很大的红色按钮的特写镜头,这个按钮呈现出明显的锯齿状。他不知道是什么原因导致这种“伪像”的产生,我们也不知道。于是,我们开始到处调查这个问题,我们不仅仅调查DVD播放机,还包括各种MPEG解码器。据我们所了解,这个问题肯定早在DVD出现之前就存在了。远在DVD面世之前,欧洲的卫星系统就存在这个问题。

 

 Toy Story

 

 

    我们长期使用《Toy Story(上面的图片来自于“三碟终极玩具箱”)作为我们的例子,因为它的颜色饱和度很高,问题很容易辨认,也容易向别人展示说明。但是,这不是我们独立发现的第一个例子。在Richard给我们展示了这个问题后,我们发现的第一个例子是《Drop Zone》中的Wesley Snipes。就在该片的第五章,Snipes成功地从飞机上不用降落伞跳下,其中Yancy Butler穿的带有黑色条纹的红色跳伞装很明显的显示出了这个问题。(在本文结尾有这个例子的图像)

 

           我们本来打算就在第一期DVD Benchmark上探讨这种伪像,但是我们不知道什么原因引起了这个问题,我们艰难地寻找答案,但一无所获。直到后来,我们坐下来从头到尾读了一遍MPEG规范,并且和一些MPEG专家讨论后,我们才搞清楚了问题产生的原因。

 

         我们刚刚(200212)考察了几个DVD制造商最新上市的一批DVD播放机,令人失望的是问题依然存在,虽然我们自己和别人已经翔实地记录了这个问题,并发表在各种杂志上。不止DVD播放机存在这个问题,任何使用了4:2:0格式的视频编解码器都存在这个问题,包括MPEG-2MPEG-4

 

            当时,Denon是唯一公开承认在他们的播放机中存在这个问题的消费类电子产品制造商。他们不但承认了这个问题,他们的工程师还和ESS的工程师一起解决了这个问题。现在你可以买到Denon生产的没有这个问题的DVD-3800 DVD-9000播放机。对于一个公司来说,公开承认一个严重的问题,并且解决这个问题,应该受到赞扬。Matsushita(松下)在第一时间解决了这个问题,也应该受到表扬,Mediamatics(现在属于美国国家半导体公司)亦是如此。

 

             在我们的第一篇文章(译注:CUE)发表后不久,Silicon ImageDale Adams写了一个检测并消除颜色Bug的算法。最后,Silicon Image在他们最新的播放机iScan Ultra中增加了一个颜色滤波器。我们曾经希望他们在SiI504中也加入这个滤波器,但是Silicon Image没有这么做,我们希望Silicon Image在生产SiI505时,集成这个颜色滤波器。

 

           在这篇文章的更新版中(200212),我们不但探讨颜色Bug,还要展示一些很久以前,甚至在DVD发行以前人们就使用的MPEG源代码,这些代码正确的解决了这个问题。我们还要告诉你对于交错视频来说,为什么4:2:0格式恰恰从本质上是被损坏的。对于工程师读者,我们将给出明确的例子来说明如何正确地解释MPEG码流中的旗标位,然后根据旗标采用正确的上采样模式,还有例子说明如何构造滤波器来消除颜色BugCUE)和4:2:0格式编码中固有的颜色裂纹(ICP)。

 

问题概述

 

            基本的“颜色 Bug”现象表现为横跨整个颜色通道的不均匀的或细长尖锐的水平条纹,尤其是在物体的斜边缘上表现最为明显。正如上面所提到的,这个问题已经存在很长时间了。人们直到现在才注意到这个问题,很大程度上是因为优质高分辨率显示设备(例如高分辨率背投电视、六脚投影屏幕)的出现,使得我们可以真真切切地看到这个问题。另外,应用越来越广泛的大屏幕逐行显示技术,可以让人们接近屏幕,仔细观看放大数倍的画面瑕疵。平时在20英寸电视上不易发觉的问题一下子就展现在你面前。随着像DVD这样的相对高分辨率媒体的出现,人们开始拿视频图像和原始的电影胶片图像对比,而不是和其他各种电视图像对比。突然,人们发现各种各样在电影胶片图像中不会出现的问题出现在电视屏幕中。颜色 Bug大概是其中最容易被注意到的,但是因为它是特定于MPEG4:2:0格式编码的,所以直到最近才被记录下来。

 

         问题的本质,说起来很简单:许多DVD播放机中的MPEG解码器无法正确地将DVD中存储的4:2:0格式的颜色信息转换成视频编码器(译注:视频显示设备)所需要的4:2:2或者4:4:4格式颜色信息。MPEG规范说的很清楚,MPEG解码器可以自由地选择4:2:0格式到4:2:2格式的上采样转换算法,但是解码器必须使用两种不同的算法以获得正确的结果。一种算法用于“隔行扫描”的视频图像帧,另一种不同的算法用于“逐行扫描”的视频图像帧。大多数解码器仅仅使用一种算法来处理所有的视频图像帧,这就是错误所在。

 

         稍后我们将更深入的讨论细节,但是现在你应该首先了解像4:2:04:2:2这样的颜色格式的含义。

 

颜色格式

 

         几十年来,视频工程师发现人眼对颜色的敏感程度要低于对亮度的敏感程度。生理学告诉我们,人眼视网膜上的杆状细胞要多于锥状细胞,而杆状细胞对亮度敏感,锥状细胞对颜色敏感。因此,你的眼睛对于黑白的分辨要比对颜色的分辨精细一些。正因为如此,在视频存储系统中,没有必要存储所有的颜色信息。既然眼睛无法分辨,为什么要浪费空间(金钱)来存储它呢?

 

         BetaVHS这样的消费类录像带就利用人眼的这个特点,使用更多的带宽存储黑白信号,这类信号被称作"luma" "luminance"译注:亮度),用较少的带宽存储颜色信号,这类信号被称作”chroma””chrominance”译注:色度)。

(实际上,”luma””luminance” ,  “chroma””chrominance”之间存在微小的区别,但这并不重要,简单起见,我们使用”luma””chroma”。)

 

         亮度信号常被称作”Y”。色度信号实际上包括两个信号,这两个信号被调制成一个单一的波形存储在磁带上。取决不同的颜色系统和格式,两个色度信号被称作”U””V”,或者”Pb””Pr”,或者”Cb””Cr”。这些编码格式存在微小的差别,但它们在概念上基本相同。在DVD中,色度存储为”Cb””Cr”C代表colorb表示bluer表示red)。

 

         MPEG-2(DVD使用的压缩格式)中,信号YCbCr是分开存储的(这就是为什么分量视频需要三条信号线)。因为Y信号是亮度信号,所以总是全分辨率存储。由于人眼对颜色相对不敏感,颜色信号可以以较低的分辨率存储。

 

          最高分辨率格式是4:4:4,这意味着每4Y采样,就有相应的Cb4Cr采样。

换句话说,颜色信号和亮度信号拥有同样的分辨率。这种格式通常仅用于一个设备内部,可以避免在处理过程中降低图像质量。当视频被存储到标准带上时,如D1 D5时,信号被转换为4:2:2格式(见下文)。

 

          其次是4:2:2格式,也即对于每4Y采样,对应2Cb采样和2Cr采样。亮度和色度拥有相同的扫描线条数,但是,在每条扫描线上,色度信号采样点数是亮度采样点数的一半。当解码4:2:2格式的信号时,缺失的采样点可以有效地使用两边相邻的采样点做内插补点运算而获得。

 

          最低分辨率格式,也即是DVD所使用的格式,就是4:2:0。这个名称让人费解,从字面上来看,应该是每4Y采样,对应2Cb采样和0Cr采样,事实不是这样。4:2:0格式每条扫描线上的Cb采样点个数和Cr采样点个数均是Y采样点个数的一半。CbCr的扫描线条数均是Y扫描线条数的一半。换句话说,色度信号的分辨率在水平方向和垂直方向上均为亮度信号分辨率的一半。如果图像的全分辨率是720×480,那么色度信息存储为360×240。在4:2:0格式中,不仅每条扫描线上缺失的色度采样点可以由左右相邻的采样点通过内插计算出来,缺失的整条色度采样扫描线也要通过相邻的上下两行的色度采样点通过内插计算出来。这么做的原因是为了更有效的利用DVD存储空间。诚然,4:4:4格式的效果很好,但是如果用4:4:4格式存储一部电影,我们的DVD盘的直径将会达到2英尺。因此,我们选择4:2:0格式。

 

         4:2:0格式存在一个棘手的问题,那就是要用两种不同的方法去内插出缺失的采样和缺失的扫描线。一种算法用于隔行扫描图像,另一种算法用于逐行扫描图像。

 

 

图像格式

 

             DVD中的视频图像,无论来自隔行扫描视频还是来自电影胶片,一般都是以整帧的形式存储,而不是以单个的场的形式存储。(有关场、帧的进一步的比较,请查阅DVD benchmark的第五部分,在那里有对逐行扫描DVD的说明)如果原始视频图像是隔行扫描的,MPEG编码器会将两个相邻的场交织组合为一个完整的帧,存储在DVD上。如果原始图像是逐行扫描的,就像电影胶片或者计算机图像,MPEG编码器就把图像“原原本本”存在DVD盘上(事实上,在大多数情况下,电影胶片会被转换为隔行扫描格式,但是,优秀的编码器可以识别出隔行的规律并正确地将其还原为原始的逐行扫描图像。译注:因为这些DVD很多时候要在隔行扫描显示设备上播放,所以要转换为隔行扫描格式)。编码器根据视频图像帧是由两个隔行场合并而成还是只是一个单个的逐行帧,为这个帧标记Progressive_frame旗标,旗标的值为TureFalse。如果是True,则这个帧为逐行扫描帧,如果是False,则这个帧是隔行扫描帧。

 

         在播放机端,如果原始视频帧是隔行扫描的,那么相邻两场图像的色度信息是否会互相渗漏是很重要的,解码器应该把MPEG图像分割为两个场,然后分别对每个场做色度的上采样转换,转换到4:2:2。然而,如果原始视频帧是逐行扫描的话,那么需要在整个帧范围内对色度信息做上采样内插补点,转换为4:2:2,如果有必要,然后再分割为场。这是个很微小的区别,但是CUE问题的根源就在这里。

 

 

4:4:4格式编码为4:2:0格式

 

 

 

 

1

                 

              如图1(上面),可以看到4:4:4编码图像的布局。对于图像中的每个像素,有一个亮度采样和一个色度采样(实际上色度采样包括一对采样,一个表示Cr,一个表示Cb,统称为色度,我们把它们作为一个整体来看待)。

 

 

 

 

 

2

 

    图2(上面)展示了4:2:2格式编码图像的布局。这里每个像素有一个亮度采样,而每隔一个像素才有一个色度采样。当图像显示的时候,缺失的色度采样点将通过两边相邻的色度采样点内插计算出来。这不会造成任何问题。就像上面提到的,人眼对色度的敏感程度不如亮度,大多数人并不能分辨出4:2:24:4:4所构成的图像间的差别。再次强调,虽然采用4:4:4格式的颜色信息很好,但是DVD盘没有足够的空间。

 

 

 

 

 

3

 

    现在问题复杂了。图3(上面)展示了概念上4:2:0逐行扫描格式的亮度和色度采样的布局。在每条扫描线上,色度采样点个数是亮度采样点的一半,并且色度扫描线的条数是亮度扫描线的一半。从整个图像来看,色度采样点个数是亮度采样点的四分之一。注意,色度采样点位于两条亮度扫描线之间。为什么会这样呢?很简单:DVD盘上存储的色度采样是由相邻的上下两条原始色度扫描线的颜色信息平均而来。第一行色度采样(译注:Line1Line2中间夹着的那行)是由原始图像上Line1Line2的色度信息取平均而来。第二行色度采样(译注:Line3Line4中间夹着的那行 是由原始图像上Line3Line4的色度信息取平均而来,其他以此类推。

 

 

 

 

 

4

 

         现在来看图4(上面),这是两个连续的隔行扫描4:2:0场交织存储为一帧MPEG图像时其色度采样点布局。色度采样点仍然位于两条亮度扫描线之间,但是和逐行扫描相比有很大的不同。第一行的色度采样点(译注:夹在Line1Line3之间,靠近Line1)不是来自Line1Line2的平均,而是来自Line1Line3。在假定编码正确的清况下,色度采样点应该是由Line175%Line325%平均而来。因为按定义,色度采样点距离Line1Line3更近。

 

         一开始这个问题可能不太容易理解,所以再看一遍图示。第一行色度采样点还是在扫描线Line1Line2之间,但是场图像1并不使用Line2Line2是场图像2的一部分。所以第一行色度采样点来自Line1Line3。再来看一下色度采样点距离两条扫描线的距离,第一行色度采样点距离Line10.5倍扫描线高度,距离Line31.5倍扫描线高度。所以第一行色度采样点距离Line1Line33倍。Line1对最终的色度采样的影响是Line33倍,或者至少应该是这样。编码器有时候轻率地进行下采样处理,可能会简单地对Line1Line3各取50%做运算,或者仅仅使用Line1的色度采样点做运算,完全不管Line3。在这里我们假设编码器很“厚道”地计算出了正确的4:2:0色度采样。

 

         注意,Line2和第一行色度采样的编码无关。Line2是第二场的第一行,而且你肯定不想第二场的颜色渗漏到第一场中。两场图像之间可能会存在运动,这会产生难看的颜色错误。

 

         在第二场中,第二条色度采样线是由Line2Line4生成的,但是同样,色度采样点更靠近Line4,所以色度采样点应该由Line475%和Line225%内插补点出来。

 

         (实际上,MPEG编码器经常使用比7525平均更复杂的算法,参与运算的数据采样点多于两个。但是有一点是不变的,那就是不能假定色度信息是简单的5050平均计算)在任何情况下,如果你拿上面的4:4:4的图像和4:2:0的图像比较的话,你就能看出来DVD播放机的MPEG解码器是如何将缺失的颜色采样填补出来并输出到电视上的。

 

4:2:0转换回4:2:24:4:4

 

         输出设备把4:2:0格式转换为4:2:2格式还是4:4:4格式并不重要,因为大多数视频编码器(译注:视频显示设备)两种格式都可以接受。但必须是这两种格式中的一种。视频编码器(译注:视频显示设备)在获取一行亮度采样时,需要同时获取和这行亮度采样相对应的一行色度采样,因为编码器(译注:视频显示设备)要以最快的速度把数字视频转换为模拟视频,而视频编码器(译注:视频显示设备)是无法“记住”前一行扫描线的色度信息来内插出当前缺失的一行色度信息,所以MPEG解码器需要输出4:2:2格式或者4:4:4格式,因为这两种格式对于每一条亮度扫描线,它对应的色度扫描线都是存在的。

 

         不管是隔行扫描帧还是逐行扫描帧,MPEG图像都以同样的二进制格式存储。唯一的区别就是”progressive_frame”旗标。解码器根据这个旗标来决定是对整帧图像做色度内插补点还是把帧图像分为两个场图像,分别对每个场图像做色度内插补点。不幸的是,好像大多数MPEG解码器都忽略了这个”progressive_frame”旗标,仅使用了一种插值算法。这会让芯片设计更简单,减少成本,但是我们已经开始认识到问题并不是由成本引起的。真正的问题是大多数解码器制造商都是从一家公司购买的MPEG-2解码器核心代码,而这家公司恰恰在这一点上做的有问题。

 

         凡是只使用一种上采样算法的MPEG解码器都采用了隔行扫描算法,因为它是“最安全”的。这些解码器把隔行扫描算法当成了法宝,无论隔行还是逐行扫描视频,统统使用隔行扫描算法。如果用于隔行扫描的算法被用于逐行扫描图像,本来色度采样应该用于插值出Line1Line2的色度采样,实际上却插值出了Line1Line3的。同理,本该用于Line3Line4的,却用于Line2Line4。最简单的情况,颜色信息被直接复制给最近的扫描线,结果就是Line2得到了本该给Line3的颜色信息。反之亦然,整个屏幕都是这样,实际上相邻的一对色度采样扫描线被颠倒了,造成很明显的颜色交错,就像我们在CUE中看到的。

 

 

 

 

5

 

 

 

 

 

 

6

 

         5(上面)是一个左边带有斜边的红色物体轮廓,图6(上面),是图5被转换为4:2:0格式,又被正确地转换为4:2:2格式,相比图5,图6的左边缘显得更加参差不齐,锯齿状更明显了,原因是在水平和垂直两个方向上采样点数都只是原来的一半。但看起来仍然很像原图像。

 

 

 

 

 

7

 

         现在来看图7(上面),它被不正确地转换回4:2:2,使用的是最简单的算法,就是将每行色度采样复制到临近的两行扫描线。可以看到Line2的色度信息和Line3的色度信息互换了,Line6Line7的色度信息互换了。由于原始的Line7色度信息不包含红色,所以最终的Line6的色度信息也不包含红色,成了Line5Line7之间的一段“空白”。这就是当你的DVD播放机有CUE问题时,你常常会在有色物体的顶部和底部看到颜色“空缺”,还会看到一些“鬼影”线漂浮在物体的上方或下方。

 

         为什么播放机和播放机之间存在不同?

 

         不同的DVD播放机对于这个问题的具体表现有所不同,因为它们使用了稍有不同的插值算法。最简单的,它们仅仅从4:2:0色度采样复制两次来构造4:2:2色度采样。就像从图5到图7的转换过程一样。这会形成色块,在物体边缘产生明显的锯齿状。

         其他一些播放机使用更加复杂的插值算法,如双线性滤波器或者多抽头有限冲击响应滤波器,这会使得颜色看起来更加平滑,从而使上采样错误不容易被发现,但这么做并不能完全隐藏上采样错误。也就是看起来图像比图7 更平滑一些,边缘的锯齿和条纹更不容易让人注意到。我们调查了许多DVD播放机,很明显:用最好、最平滑的上采样算法来处理错误的图像,效果也不如用最简单的方法来处理正确的图像。在源头就把CUE问题解决掉是无可替代的。

 

         一个真实的例子

 

         我们最近在一些免费的MPEG解码器源代码中看到了如下的代码(在网上很多地方都可以得到,包含在mpeg2v12.zip压缩包中)。代码片段来自于store.c,展示了如何决定采用哪一种上采样算法。

 

Line     Code
1     /* vertical 1:2 interpolation filter */
2     void conv420to422(src,dst)
3     unsigned char *src,*dst;
4     {
5         
6          if (progressive_frame)
7          {
8               /* intra frame */
9              
10          }
11          else
12          {
13               /* intra field */
14              
15               /* top field */
16              
17               /* bottom field */


18              
19          }
20     }

 

     些源代码写于199691日,比DVD面世早了不少。实现上采样功能的函数是conver420to422,在tore.c中是从第467行开始的。

         正确实现上采样转换所需要的全部代码,包括上面的代码,总共有109行。有更好的实现方法,可以用更少的代码实现这个功能。如果仔细阅读代码,你会注意到他们使用了一个6抽头有限冲击响应滤波器,比大多数MPEG解码器用的滤波器更好。这可以使颜色更平滑。本文结尾所有的例子都是用这个解码器制作的。

        

         因此,CUE并不是一个很难解决的问题。上面的代码说明几年前人们就解决了这个问题(尽管上面的代码并没有解决progressive_frame旗标问题,后面会更多地谈到这个问题)。不解决这个问题的MPEG解码器制造商除了“懒惰”外没有任何借口,作为消费者,你有权要求使用没有BUGDVD解码器。 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值