热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SCC(四):Palettemode

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


推荐阅读
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
author-avatar
小石头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有