news 2026/2/28 6:57:07

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/2/22 7:54:47

实测3款论文降ai神器,手动+工具一键搞定降AIGC率!

最近毕业季&#xff0c;后台私信简直要炸了。很多同学都在哭诉&#xff1a;明明是自己一个字一个字码出来的论文&#xff0c;结果aigc降重检测结果竟然高达50%甚至70%以上。别慌&#xff0c;这其实是很多学生和研究者都会遇到的普遍问题。只要搞懂了原理&#xff0c;掌握正确的…

作者头像 李华
网站建设 2026/2/27 12:26:12

GNSS 形变监测系统:扼流圈 GNSS 监测站

提问&#xff1a;“北斗 GPS 双模定位 差分 RTK 技术”&#xff0c;具体精度能达到多少?对边坡、大坝监测来说意味着什么?​小助手支招&#xff1a;毫米级精准捕捉&#xff0c;隐患早发现早处置!系统通过北斗、GPS 多卫星系统融合定位&#xff0c;搭配差分 RTK 技术(基准站…

作者头像 李华
网站建设 2026/2/26 14:02:34

Java集合-Set讲解

目录一、集合框架层次结构二、Collection集合1、Set集合1、HashSet2、LinkedHashSet3、TreeSet4、ConcurrentSkipListSet5、CopyOnWriteArraySetJava 集合框架&#xff08;Collections Framework&#xff09;是 Java 中用于 存储和操作数据组的重要架构。它提供了一组接口、实现…

作者头像 李华
网站建设 2026/2/22 4:14:51

Qwen3-VL-30B-FP8:高效多模态模型新突破

Qwen3-VL-30B-FP8&#xff1a;高效多模态模型新突破 在视觉语言模型迈向“看得懂、想得深、用得动”的今天&#xff0c;如何在不牺牲性能的前提下大幅降低部署成本&#xff0c;成为工业界和学术界共同关注的焦点。通义千问团队最新发布的 Qwen3-VL-30B-FP8 正是这一挑战下的关键…

作者头像 李华
网站建设 2026/2/27 11:02:19

Kotaemon智能体框架支持C++和Go语言插件开发?技术细节揭秘

Kotaemon智能体框架支持C和Go语言插件开发&#xff1f;技术细节揭秘 在企业智能化转型加速的今天&#xff0c;构建一个既能理解复杂业务逻辑、又能稳定运行于高并发环境的对话系统&#xff0c;已成为AI工程落地的核心挑战。传统聊天机器人往往困于“问答即检索”的简单范式&am…

作者头像 李华
网站建设 2026/2/27 3:41:11

NPM安装Express中间件处理TensorRT请求队列

构建高性能AI服务&#xff1a;基于Express中间件与TensorRT的请求队列处理 在如今的AI应用开发中&#xff0c;一个常见的挑战是——如何让前端API稳定地对接高吞吐、低延迟的深度学习推理后端&#xff1f;尤其是在面对突发流量时&#xff0c;直接将客户端请求打到GPU服务上&…

作者头像 李华