palette indice编码
本文技术全部基于HEVC SCM-4 (JCTVC T1014) 2015年2月
Mode 是一种在HEVC-SCC2中新提出的技术,该技术在画面仅仅由几种主要颜色组成的情况下使用,在CU层次进行编码。
首先应该知道 mode 的编码过程中的位置。
本文只是简述 mode,更加详细的信息请参照JCTVC-R0348
简介
mode的基本思想就是利用CU内部的样本只是有少数几种典型的颜色组成的特性进行编码。其中,收集CU内部的较为集中分布的集中颜色组成一个set。这个set即为,当然,CU内部样板中,颜色不属于set的,会被集中起来归为一个。
从图上我们可以看出,前部分3个样本被收集到set中,分别为2,0,3,蓝色的方块因为其颜色没有在 mode的set中,被另外分配到中。
在CU层次的flag中,有语法来指明当前CU内部是否有模式的。如果存在的话,模式在set最后增加一个种类存放。
在编码的过程中,如果解码器想完成解码,则其需要知道两个参数
如果 的类型值为,则其值将会被单独传输。
参数提取
在SCM-3版HM 源码中,对于编码分为两种:lossy 和
对于loosy编码,采用改进的K平均值聚类算法: 把第一个样本值加入,作为第一个entry。对于随后的每一个样本值,计算其与当前的entry的SAD(the sum of ),如果计算出来小于预定定义的阈值。则当前样本值将会被加入到相对应entry的 中,如果 大于预定的阈值,则当前的样本值将会被作为新的一个entry加入到中。如果中的样本数量超过一定量,针对这些值,计算出聚类中心值,把聚类中心值更新当前entry。
完成聚类算法之后,根据出现频率的高低,对所有按照出现频率由高到低排序,然后针对每一个 entry,其值进行更新。一般来说,更新值是根据的聚类中心值确定,但是与此同时, 中的值是否比聚类中心值更好,需要计算两者的RD值。在最后,如果发现某一个entry的仅仅只有一个,那么这个将会被移入中。再最后删除整个 mode表中重复的entry值,并且合并重复的entry所带的 。
对于编码,则编码的方法完全不同:
把CU中的值做成柱状图,图中所有的值按照出现频率由高到底排列,从出现频率最高的entry开始,依次将他们加入到,同样,在此过程中,如果有某些值,只出现一次,并且不存在于 中。那么这些值将被加入到中。
经过上述的编码过程以后,在当前编码的block中,每一个都拥有了一个index,其指向 entry(SAD最小)。依据这些index,对每一个赋予INDEX或者其中的一个模式,选择以后,每个的run随即就被确定了。然后根据编码该模式的cost,run,该index值的可能性,根据三个判断条件,依据贪心算法,采用拥有最小的cost值的模式。
##编码
在前文提及到,在做完聚类分析算法后,确定 entry的时候,要用聚类中心值和 中的值进行计算比较。
在编码 entry时, table和 的大小都在SPS中定义,在SCM4中,在PPS中定义了一个ag 的标志值。当其值为 1 时, 将被传输到比特流中,在每一个CTU,slice,每个文件的开头, 都会被初始化。当设置为0时,则 被设置为0。
对于 中的每一个entry,都有个指示值。指示该值是否是参照之前的而得到的。相应的关系如下图
所有的pred flag将会使用使用游程编码进行编码传输,然后需要传输的“新的” entry的数量。最后再传输对应的元素值。
编码
当我们完成 entry的编码后,该轮到 了,相应的扫描的方式在ag中定义了。扫描方式有水平扫描和垂直扫描两种,分别如图:
下面即以水平扫描为例:
在 中,有INDEX或者 两种模式,在 中,当前的 index是直接从上一行的对应位置拷贝过来使用。在INDEX 模式中, 是被直接传输的。无论选择哪种模式,都会有一个run值,指示在该后有多少个是使用的相同的模式。
如果在INDEX或者 模式中存在的样块,如图中蓝色部分所示,则其应该单独编码。
在SCM-4之前,编码传输的顺序是 mode(如果有) -> index value(如果有)-> run -> value。但是在SCM-4中,为了使和 更加好地结合在一起,首先传送在CU单位内index值的数量,然后接着传输真实的index值(截断二进制编码( )),第二步将以交替模式( )传输 mode 和 run 值。最后,每个CU的样本值将被一起传输。
mode一样适应于4:2:2和4:2:0模式,当画面包含彩色成分时, table包含YUV三个组成部分,但是单色的时候,则 table的每一个entry就只包含一个组成部分。