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