news 2026/5/7 9:35:29

VVC传统角度预测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VVC传统角度预测

一、背景回顾:什么是传统角度预测?

在 VVC(Versatile Video Coding, H.266)标准中,帧内预测是提升编码效率的核心技术之一。其中:

  • 共定义了67 种帧内预测模式
    • 模式 0:Planar(平面预测)
    • 模式 1:DC(均值预测)
    • 模式 2~66:65 种传统角度预测模式

这些角度模式覆盖从-135° 到 +45°的方向范围,用于模拟图像中不同走向的边缘结构(如水平线、斜边、轮廓等)。

分类方式

类型模式编号特点
水平类模式2 ~ 33预测方向近似垂直传播 → 主要使用上方参考像素
垂直类模式34 ~ 66预测方向近似水平传播 → 使用左侧 + 上方参考像素

⚠️ 注意:“垂直类”并非指预测方向为垂直,而是指每一行的像素沿横向生成,即“逐列填充”,像画竖线一样向右扩展。

本节以垂直类模式 M = 30(偏移值 offset = -20)为例,深入解析其预测流程中的关键两步。


二、整体流程简述

对于一个N×N N \times NN×N的亮度编码单元(CU),传统角度预测的基本流程如下:

  1. 构造参考像素数组Ref[]
    整合左侧(Left)、左上(Top-Left)、上方(Top)已重建像素,形成一条长度为2×max⁡(N,N)+1 2 \times \max(N,N) + 12×max(N,N)+1的一维参考线。

  2. 计算当前像素对应的参考位置整数偏移量:
    ildx=(y⋅offset[M])≫5 \text{ildx} = (y \cdot \text{offset}[M]) \gg 5ildx=(yoffset[M])5

  3. 计算分像素插值权重:
    w=(y⋅offset[M])& 31 w = (y \cdot \text{offset}[M]) \&\ 31w=(yoffset[M])&31

  4. 根据ildxw查找或插值得到预测值

下面我们重点讲解第(2)步和第(3)步。


三、步骤(2)详解:计算整数偏移量ildx

公式表达:

ildx=(y⋅offset[M])≫5 \text{ildx} = (y \cdot \text{offset}[M]) \gg 5ildx=(yoffset[M])5

等价于:
ildx=⌊y⋅offset[M]32⌋ \text{ildx} = \left\lfloor \frac{y \cdot \text{offset}[M]}{32} \right\rfloorildx=32yoffset[M]

参数说明:

符号含义
y yy当前像素在 CU 内的行索引(从上到下,起始于 0)
offset[M] \text{offset}[M]offset[M]查表得到的角度偏移参数(见后文表)
≫5 \gg 55右移 5 位,相当于除以25=32 2^5 = 3225=32,实现快速整数除法

物理意义:

该值表示:当前第 y 行的预测起点相对于基准位置 TL 的整数级偏移量

由于每个角度模式都有固定的“斜率”,越往下(y 越大),需要读取的参考像素就越靠左(当 offset < 0)或靠右(当 offset > 0)。

这是一种将连续空间投影离散化的方法,使得硬件友好的整数运算即可完成高精度的方向控制。


示例:8×8 CU,模式 M=30,offset = -20

我们手动计算每一行的ildx值:

y yy计算式结果(ildx
0(0×−20)≫5=0 (0 \times -20) \gg 5 = 0(0×20)5=00
1(−20)≫5=−20/32≈−0.625 (-20) \gg 5 = -20 / 32 \approx -0.625(20)5=20/320.625→ 向下取整-1
2(−40)≫5=−1.25 (-40) \gg 5 = -1.25(40)5=1.25→ -2? 实际为 -1 或 -2?视实现而定
3(−60)≫5=−1.875 (-60) \gg 5 = -1.875(60)5=1.875→ -2
4(−80)≫5=−2.5 (-80) \gg 5 = -2.5(80)5=2.5→ -3

✅ 实际标准中采用向负无穷取整(floor division)来保证跨平台一致性。
在 C++ 中可通过添加偏移修正负数右移行为:

intdiff=y*offset;intildx=(diff+(diff<0?-31:0))>>5;

四、步骤(3)详解:计算分像素位置权重w

公式表达:

w=(y⋅offset[M])& 31 w = (y \cdot \text{offset}[M]) \&\ 31w=(yoffset[M])&31

参数说明:

符号含义
y⋅offset[M] y \cdot \text{offset}[M]yoffset[M]总偏移量(带符号整数)
& 31 \&\ 31&31按位与操作,提取低 5 位 → 相当于对 32 取模(mod 32)

物理意义:

虽然ildx给出了整数位置,但真实的采样点往往落在两个像素之间(例如介于ref[i]ref[i+1]之间)。这时就需要进行亚像素插值

w=0 w = 0w=0:正好落在整数像素上 → 直接取ref[i]
w≠0 w \neq 0w=0:位于两个像素之间 → 使用双线性插值

pred(x,y)=(32−w)⋅ref[i]+w⋅ref[i+1]+1632 \text{pred}(x,y) = \frac{(32 - w) \cdot \text{ref}[i] + w \cdot \text{ref}[i+1] + 16}{32}pred(x,y)=32(32w)ref[i]+wref[i+1]+16

其中加16是为了实现四舍五入。

插值精度达到1/32 像素,这是 VVC 实现高预测精度的关键设计之一。


示例:继续以y=2,offset=−20 y=2, \text{offset}=-20y=2,offset=20为例

计算:
y⋅offset=2×(−20)=−40 y \cdot \text{offset} = 2 \times (-20) = -40yoffset=2×(20)=40
ildx=(−40)≫5=−2 \text{ildx} = (-40) \gg 5 = -2ildx=(40)5=2(假设 floor division)
w=(−40)& 31 w = (-40) \&\ 31w=(40)&31

如何计算负数的按位与?

在补码系统中(如 x86 架构):

  • -40 的二进制(32位)为:11111111111111111111111111011000
  • 低 5 位为:11000₂ =2410 24 ₁₀2410

✅ 所以:
w=24 w = 24w=24

这意味着:实际采样点位于ref[i]ref[i+1]之间,更靠近后者(权重更大)。

代入插值公式:
pred=(32−24)⋅ref[i]+24⋅ref[i+1]+1632=8a+24b+1632 \text{pred} = \frac{(32 - 24)\cdot \text{ref}[i] + 24 \cdot \text{ref}[i+1] + 16}{32} = \frac{8a + 24b + 16}{32}pred=32(3224)ref[i]+24ref[i+1]+16=328a+24b+16

≈ 75% 权重来自右边像素。


五、图示还原:图4.12 解析(8×8 CU,模式 M=30)

正确理解投影像素法(Projection Method)

对于垂直类模式 M=30(offset = -20),其预测方向是从左上往右下倾斜(负斜率),因此:

  • 第 0 行(y=0):起始于 TL(index=8)
  • 第 1 行(y=1):起始于 L[0](index=7)
  • 第 2 行(y=2):起始于 L[1](index=6)
  • 第 7 行(y=7):可能延伸至 L[6] 或更左

用 ASCII 图表示如下:

Reference Line (index): ... 5 6 7 | 8 | 9 10 11 12 13 14 15 16 [L2] [L1] [L0] [TL] [T0] [T1] [T2] [T3] [T4] [T5] [T6] [T7] ↑ base_idx = 8 Projection for each row: Row y=0: ────────────────→ starts at index 8 (TL) Row y=1: ──────────────────→ starts at index 7 (L0) Row y=2: ────────────────────→ starts at index 6 (L1) Row y=3: ──────────────────────→ starts at index 5 (L2) ... Row y=7: ──────────────────────────→ far left (index ≈ 1) Arrow shows diagonal projection from left side into top.

👉 每一行的预测值都来源于这条斜线上经过插值后的参考样本。

这就是所谓的“投影像素法”——把左侧像素沿着一定角度“投射”到上方区域形成虚拟参考线。


六、完整预测流程总结(垂直类模式)

步骤内容公式
(1)构造参考线Ref[]长度 =2N+1 2N + 12N+1,顺序:
[L[N-1], ..., L[0], TL, T[0], ..., T[N-1]]
(2)计算整数偏移ildx=(y⋅offset)≫5 \text{ildx} = (y \cdot \text{offset}) \gg 5ildx=(yoffset)5
(3)计算分数权重w=(y⋅offset)& 31 w = (y \cdot \text{offset}) \&\ 31w=(yoffset)&31
(4)定位参考索引pos=base_idx+ildx \text{pos} = \text{base\_idx} + \text{ildx}pos=base_idx+ildx
其中base_idx=N \text{base\_idx} = Nbase_idx=N
(5)插值得到预测值
w=0 w = 0w=0pred[y][x]=ref[pos] \text{pred}[y][x] = \text{ref}[\text{pos}]pred[y][x]=ref[pos]
否则:pred[y][x]=(32−w)⋅ref[i]+w⋅ref[i+1]+1632 \text{pred}[y][x] = \dfrac{(32-w)\cdot \text{ref}[i] + w\cdot \text{ref}[i+1] + 16}{32}pred[y][x]=32(32w)ref[i]+wref[i+1]+16

对于水平类模式(M=2~33),逻辑类似,只是改为对列进行循环,并逐列向下预测。


七、为何选择 32 作为缩放因子?

VVC 使用5-bit 精度(1/32)来表示亚像素偏移,主要原因包括:

优点说明
高分辨率控制支持多达 65 个精细角度,适应各种纹理方向
避免锯齿效应提升预测连续性,减少块效应和振铃
便于硬件实现位移和掩码操作远快于浮点除法
统一插值核可复用相同的 5-tap 滤波器表(MDIS)

例如:

  • offset = 32 → 每行移动 1 像素 → 对应 45° 斜线
  • offset = 16 → 每两行移动 1 像素 → 更平缓
  • offset = -32 → 每行左移 1 像素 → -45° 斜线

八、伪代码实现(C++ 风格,适用于 Markdown 展示)

voidpredictIntraAngular(intmode,intwidth,intheight,constPel*refLine,Pel**pred){intoffset=angTable[mode];// 查表得偏移值,如 mode=30 → -20intbase_idx=height;// TL 在 refLine 中的位置boolisVerticalMode=(mode>=34);// 是否为垂直类模式?if(isVerticalMode){// 垂直类:逐行处理,每行所有像素相同for(inty=0;y<height;y++){intdiff=y*offset;intildx=(diff+(diff<0?-31:0))>>5;// floor divisionintw=diff&31;intrefIdx=base_idx+ildx;Pel val;if(w==0){val=refLine[refIdx];}else{val=((32-w)*refLine[refIdx]+w*refLine[refIdx+1]+16)>>5;}// 该行所有像素赋相同值(横向复制)for(intx=0;x<width;x++){pred[y][x]=Clip1(val);}}}else{// 水平类:逐列处理(逻辑对称)for(intx=0;x<width;x++){intdiff=x*offset;intildx=(diff+(diff<0?-31:0))>>5;intw=diff&31;intrefIdx=base_idx+ildx;Pel val=(w==0)?refLine[refIdx]:((32-w)*refLine[refIdx]+w*refLine[refIdx+1]+16)>>5;for(inty=0;y<height;y++){pred[y][x]=Clip1(val);}}}}

九、附录:角度偏移表(表4.2 整理版)

模式编号23456789101112131415161718
偏移值322926232018161412108643210
模式编号1920212223242526272829303132333435
偏移值-1-2-3-4-6-8-10-12-14-16-18-20-23-26-29-32-29
模式编号3637383940414243444546474849505152
偏移值-26-23-20-18-16-14-12-10-8-6-4-3-2-1012
模式编号5354555657585960616263646566
偏移值346810121416182023262932

注:偏移值正负决定投影方向;绝对值大小决定斜率陡峭程度。


十、总结

步骤名称功能关键技术
(2)ildx = (y × offset) >> 5获取整数级参考位置实现斜率投影的离散化
(3)w = (y × offset) & 31获取亚像素插值权重实现 1/32 精度插值,提升预测精度

二者共同完成了一个关键任务:

将理想中的连续角度投影过程,转化为高效的整数运算 + 插值,既保证预测精度,又满足实时编码需求。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:20:17

Playwright03-CDP/WebSocket/PlayWright

Playwright03-CDP/WebSocket/PlayWrightplaywright自动化开发记录&#xff0c;学习BrowserUse的时候涉及到playwright知识点1-CDP/WebSocket/PlayWright对比我在看源码的时候&#xff0c;最开始使用简单demo进行学习的时候还好&#xff0c;但是一复杂起来&#xff0c;我就理不清…

作者头像 李华
网站建设 2026/5/3 1:30:12

Excalidraw使用技巧:从数据到图表的高效转化

Excalidraw使用技巧&#xff1a;从数据到图表的高效转化 在产品设计与技术协作中&#xff0c;最耗时的往往不是思考本身&#xff0c;而是把脑子里的想法“画出来”。你有没有过这样的经历&#xff1a;会议中刚理清一个系统流程&#xff0c;却因为要手动拖拽十几个方框、连线、…

作者头像 李华
网站建设 2026/5/1 0:38:58

FLUX.1-dev模型本地训练与推理指南(GPU/NPU)

FLUX.1-dev模型本地训练与推理指南&#xff08;GPU/NPU&#xff09; 模型简介 FLUX.1-dev 是由 Black Forest Labs 推出的下一代文生图多模态大模型&#xff0c;作为 Stable Diffusion 原班团队的新作&#xff0c;其在生成式人工智能领域树立了新的技术标杆。该模型基于创新的…

作者头像 李华
网站建设 2026/4/25 0:51:50

COBOL编程入门:从基础到文件处理

COBOL编程入门&#xff1a;从基础到文件处理 在银行核心系统的一次深夜故障排查中&#xff0c;运维团队发现一笔关键交易未能入账。经过层层追踪&#xff0c;问题最终指向一段运行了三十年的薪资计算逻辑——代码依然健壮&#xff0c;但能读懂它的人却越来越少。这正是COBOL的真…

作者头像 李华
网站建设 2026/4/27 16:21:11

Ubuntu部署Dify+蓝耘MaaS打造AI应用

在 Ubuntu 上快速构建 RAG 智能客服&#xff1a;Dify 蓝耘 MaaS 实战部署 如今&#xff0c;企业对 AI 的期待早已从“能不能用”转向“能不能落地”。一个典型场景是&#xff1a;客户在官网反复询问套餐价格、开通流程或技术支持方式——这些问题明明有标准答案&#xff0c;却…

作者头像 李华
网站建设 2026/5/8 0:26:46

Stable Diffusion 3.5本地部署与远程访问实战

Stable Diffusion 3.5本地部署与远程访问实战 在生成式AI飞速演进的今天&#xff0c;越来越多创作者和开发者不再满足于使用现成的在线服务。他们更希望拥有一套完全自主控制、可定制、高性能的本地AI绘图系统——既能保护数据隐私&#xff0c;又能摆脱高昂算力成本的束缚。 …

作者头像 李华