4.4 调色板预测(Palette)
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
调色板预测(Palette Prediction)是AV1帧内预测中的一种特殊预测模式,使用颜色索引来预测块,适合颜色数量较少的区域(如屏幕内容、图形界面、文本等)。它通过维护一个颜色调色板,然后用索引来表示每个像素的颜色。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
调色板预测概述
位置: src/frame/decoding_process.py - predict_palette()
规范文档: 7.11.2.7 Palette prediction process
功能说明
调色板预测使用颜色索引来预测块,适合颜色数量较少的区域(如屏幕内容、图形界面、文本等)。它通过维护一个颜色调色板,然后用索引来表示每个像素的颜色。
应用场景
- 屏幕内容编码:图形界面、文本、图标等
- 颜色数量少的区域:大面积单色或少量颜色的区域
- 高压缩比需求:当颜色种类远少于像素数量时
调色板语法解码
位置: src/tile/tile_group.py - __palette_mode_info()
解码流程
-
检查条件
if (tile_group.MiSize >= SUB_SIZE.BLOCK_8X8 and Block_Width[tile_group.MiSize] <= 64 and Block_Height[tile_group.MiSize] <= 64 and frame_header.allow_screen_content_tools): self.__palette_mode_info(av1) -
解码调色板大小
palette_size = read_S(av1, 'palette_size') tile_group.PaletteSizeY = palette_size -
解码调色板颜色
for i in range(palette_size): tile_group.PaletteColorsY[i] = read_S(av1, 'palette_color') -
解码颜色索引映射
self.__palette_tokens(av1) # 解码ColorIndexMap
预测流程
-
解码调色板
- 解码调色板颜色(PaletteColors)
- 调色板大小通常在2-8之间
-
解码颜色索引
- 解码颜色索引映射(ColorIndexMap)
- 每个像素对应一个索引值
-
生成预测
pred[i][j] = PaletteColors[ColorIndexMap[i][j]]
调色板预测流程图
graph TD
A[调色板预测开始] --> B{满足调色板条件?}
B -->|否| C[跳过调色板预测]
B -->|是| D[解码调色板大小<br/>PaletteSize]
D --> E[解码调色板颜色<br/>PaletteColors]
E --> F[解码颜色索引映射<br/>ColorIndexMap]
F --> G[遍历每个像素位置]
G --> H[根据索引获取颜色<br/>pred = PaletteColors index]
H --> I{还有像素?}
I -->|是| G
I -->|否| J[调色板预测完成]
C --> K[使用其他预测模式]
style A fill:#e1f5ff
style B fill:#fff9c4
style J fill:#c8e6c9
调色板预测的优势
- 高压缩比:当颜色种类少时,索引编码比直接编码颜色值更高效
- 精确表示:对于屏幕内容,可以精确表示每个像素的颜色
- 快速解码:索引查找操作简单快速
总结
调色板预测适合屏幕内容编码,通过颜色索引实现高压缩比,能够精确表示少量颜色的区域。它是AV1帧内预测体系的重要补充,特别适合处理图形界面、文本、图标等屏幕内容。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- 预测实现:
src/reconstruction/prediction.py - Tile解码:
src/tile/tile_group.py - 解码流程:
src/frame/decoding_process.py
- 预测实现:

浙公网安备 33010602011771号