作者:小石头 | 来源:互联网 | 2023-10-12 14:05
SCC(四):Palettemode调色板模式(palettemode)对于只含有少数几种颜色的块非常高效。相比于传统的对块进行预测变换处理,调色板模式只需要对每个像素传输其颜色索
SCC(四):Palette mode
调色板模式(palette mode)对于只含有少数几种颜色的块非常高效。相比于传统的对块进行预测变换处理,调色板模式只需要对每个像素传输其颜色索引。
调色板是一个包含CU中颜色值的表,对于CU中每个像素在码流中传输其在表中的索引。解码器使用这个索引和这个调色表来重建CU。
调色表中每个条目包含三个分量(RGB或YCbCr)。对于4:2:0或4:2:2颜色格式,如果当前位置像素没有色度分量,就只使用第一个分量重建像素。在调色表中有一个特殊索引escape index用于那些在表中没有对应值的像素。在这种情况下,码流中除了要传输该像素的索引escape index,还要传输该像素的量化值。
下图是一个palette size = 4的调色板示例:
调色板编码
在编码端需要生成调色板。使用调色板模式编码时,其编码分为两部分:调色表的编码和CU中每个像素索引的编码。
通常,相邻的使用调色板模式的块的调色表有很多相同项。为了减少冗余,当前待编码调色表由之前已编码调试表预测得到,而当前调色表新的项显示传输。对于预测调色表每项都有一个标志位表示该项是否在当前调色表中。这些标志位使用行程编码,行程使用零阶指数哥伦布编码。传输完预测表之后,再传输新添项的数量和对应的值。如下图所示。
对于每个slice或tile或CTU行(当使用波前时)的第一个CTU,预测表使用PPS中传输的初始化项或0来初始化。当CU使用调色板模式编码完后,预测调色板按下面步骤更新:首先,当前调色板的所有项都添加进预测表。然后,加入前面调色板中未在当前调色板中出现的项。这个过程持续到前面调色板中所有未使用项都加入了或者调色板达到最大尺寸。
对于索引的编码,首先编码标志位palette_escape_cal_present_flag表示当前CU中是否存在escape index。编码CU调色索引有两种扫描顺序:水平扫描和垂直扫描。
上图是两种扫描顺序示意图。下面以水平扫描为例讲解,如果是垂直扫描编码前(或解码后)CU索引要进行转置操作。标志位palette_transpose_flag表示扫描方向。
屏幕内容经常包含平坦区域,这些区域的像素值非常接近,像素的调色索引使用行程编码效率非常高。此外,平坦区域连续行或连续列的索引可能都相同,为了利用这个性质每个像素有两种编码模式COPY_INDEX_MODE和COPY_ABOVE_INDEX,在码流中用palette_run_type_flag表示。
COPY_INDEX_MODE模式首先编码一个索引(截断二元码),然后后面跟一个行程长度表示等于该索引的像素数量。
COPY_ABOVE_INDEX模式中从上一行复制索引,然后后面跟一个行程长度表示等于该索引的像素数量。该模式仅需要传输行程长度不需要传输索引值。
COPY_INDEX_MODE和COPY_ABOVE_INDEX的行程长度都可能跨过多行。
下图是一个4x4块编码示例(4x4块方便展示,实际运行使用调色板模式最小的块为8x8):
调色板生成
对每个CU使用改进的k-means clustering算法生成调色表(有损)。首先,调色表初始化为空。然后,对CU中的每个像素计算离其最近的调色表项(用SAD度量)。如果SAD小于某个阈值则将该像素加到该表项对应的cluster,否则将该像素加入调色表作为一个新项。当处理完CU中所有像素后,使用每个cluster的中心更新调色表项。由于调色板有尺寸限制(SPS中指定),如果调色表中项的数量超过最大限制,则去掉像素数量少的cluster对应的项,这些项对应像素的索引变为escape index。
一旦调色板和CU中每个像素在调色板中的索引确定后,使用RDO技术确定palette_run_type_flag和行程值。
感兴趣的请关注微信公众号Video Coding