[转贴] H.264帧内编码的模式选择11——arix - H.264乐园 - 视频技术论坛 ...

来源:百度文库 编辑:神马文学网 时间:2024/05/01 16:53:09
washing
  • 发短消息
  • 加为好友

washing 当前离线

UID
1940 
帖子
44 
精华
积分
87 
阅读权限
20 
在线时间
47 小时 
注册时间
2006-9-27 
最后登录
2007-9-25 

注册会员

1# 打印 tT 发表于 2006-10-24 11:26 AM | 只看该作者

[模式选择] [转贴] H.264帧内编码的模式选择——arix

H.264帧内编码的模式选择

H.264中4X4亮度预测依据预测方向的不同共有9种预测模式。在亮度4x4帧内预测时,其中DC预测(模式2)、垂直预测(模式0)和水平预测(模式2总是被认为有效的,即使在编码块上面像素或左边像素不可用的情况下(这时候上面像素或左边像素的值就使用128这个值来代替),而其它模式仅当所有需要利用的预测象素点都可用的情况下才可以使用(如果E, F, G,H不可用,可以用D的值来代替)。这儿所说的像素点可用(available)是指此像素所在的子块存在并且与当前编码的子块属于同一个slice。

模式选择
在H.264帧内编码中,每个宏块亮度信号都要完成9种4x4预测模式和4种16x16预测模式,然后通过预测模式选择,得出一种最佳预测模式使得编码后的图像在码流和图像质量两者权衡后的获得一个最佳。H.264中模式选择方法有两种:
1、使用率失真优化(RDO)模式选择。
使用这种RDO方式的模式选择过程如下:
1)在给定最后解码的帧及宏块的量化因子QP后,计算拉格朗日因子:
             X=0.85*QP2                 (1)
2)在帧内亮度4x4预测的9种预测模式中,通过计算下面的函数使得其值最小,从中选择最佳的帧内亮度4x4预测模式。
J(s, c, m I QP, Xm )=SSD(s, c, m I QP)+X*R(s, c, m I QP) (2)
式中QP是宏块的量化参数,X是(1)中的拉格朗日因子,SSD是原始的亮度块s与预测模式为m的重建块的平方差的和,R表示与选择模式m相关联的比特数,包括模式编帧内模式及DCT系数所需的比特数。
3)在帧内16x16预测模式中,通过计算4种16x16宏块的SATD(绝对变换差和)使得其值最小来确定最佳16x16亮度帧内预测模式。
4)通过比较一个宏块使用4x4预测模式时计算的RD代价值与使用16x16帧内预测模式时计算得到的最小代价值,选取代价最小的作为最佳预测模式。


2、基于SAD(或SATD)和速率估计的模式选择方法。对于这种模式选择方法,其亮度4x4预测模式的代价函数的计算方法如下所示:
Cost=SAD+4R*λ(QP)     (3)
式中λ(QP)是QP的指数函数,4R是对使用某种预测模式后比特数的估计,R根据当前模式是否为最有可能的模式取值为0或1。式中SAD (绝对差值和)计算的差值是预测值与图像像素值的差值,为了更准确的比较每种模式的Cost值,H.264还对这些差值进行Hadamard变换,将差值(这些值最后要变换到频域进行编码)变换到频域求绝对差值和,这样计算得到的值叫作绝对变换差和(SATD)。这里使用Hadamard变换而不是使用DCT变换主要考虑到Hadamard变换比较简单,而又比较接近DCT变换。在计算4x4块的每一种模式的Cost值后,将Cost值最小的模式判决为最佳亮度4x4预测模式。对于亮度信号的16x16模式选择,其开销计算函数如下所示:
Cost =SATD   (4)
式中的SATD也是绝对变换差和,其计算时也是将预测值与图像像素值的差值通过使用Hadamard变换,变换到频率域后求和。最后比较一个宏块做一次16xl6预测后的开销值Cost和做16次4x4预测后Cost值相加得到的总的开销值Cost的大小,选取Cost最小的作为最后宏块的预测模式。如果Cost值相同4x4预测模式将被优先选取,而如果9种4x4预测模式或4种4x4预测模式中出现相同Cost值时,序号较小的预测模式将被选为最佳预测模式。



比较两种模式选择方法可以看出,在RDO模式中,R值被精确地计算出,从而使得其模式选择的准确度大大提高,但为了计算R值需要非常复杂的计算,从而使得其运算复杂度很高,而基于SAD的模式选择由于R值是一个估计值避免了复杂的计算,所以速度大大提高,但选择的准确度也会下降。使用RDO模式选择的方法与使用基于SAD的模式选择方法相比,基于SAD的模式选择计算复杂度平均为RDO模式选择的7%,但与使用RDO模式选择相比基于SAD的模式选择方法PSNR平均降低。

一个宏块组合模式选择过程:
a)        对于4x4帧内预测模式建立相应的帧内预测块
b)        计算预测4x4块和原始块4x4块之间的SAD,以及相应的编码比特率
c)        计算该模式的率失真开销Rdcost
d)        重复以上a~c步,遍历所有的9种4x4帧内预测模式
e)        选取具有最小率失真开销的模式作为最佳预测模式
f)        对宏块中16个4x4块重复以上a~e,获得每一个4x4块的最佳模式和相应的Rdcost,进而获得该宏块的总Rdcost
g)        按类似的方法遍历4种16x16宏块的帧内预测模式并计算相应的宏块Rdcost,选取最小的模式为最佳16x16模式
h)        根据f和g中最小的宏块Rdcost,判断亮度宏块采用4x4或16x16帧内预测模式
i)        对每一种8x8色度宏块的帧内预测模式(两个色度宏块使用相同的模式)计算相应的Rdcost,并重复以上a~h,获得相应的宏块组合Rdcost作为该宏块组合的最佳帧内预测模式


[ 本帖最后由 firstime 于 2008-10-23 02:53 PM 编辑 ] 本主题由 firstime 于 2009-11-10 07:15 PM 设置高亮 收藏 分享 评分 wisitng(80609949) 回复 引用

订阅 报告 道具 TOP

mlinmxf
  • 发短消息
  • 加为好友

mlinmxf 当前离线

UID
1964 
帖子
43 
精华
积分
22 
阅读权限
10 
在线时间
13 小时 
注册时间
2006-9-29 
最后登录
2010-3-26 

新手上路

2# 发表于 2006-12-25 10:20 PM | 只看该作者 这里对SSD的解释好像是错的,我看到的文章里说的SSD是原始块和重构块的差的平方和,而不是平方差之和 多看书,多实践,多讨论,共同进步 回复 引用

报告 道具 TOP

dcfarmer
  • 发短消息
  • 加为好友

dcfarmer 当前离线

UID
2495 
帖子
59 
精华
积分
30 
阅读权限
10 
来自
海南 
在线时间
160 小时 
注册时间
2006-11-22 
最后登录
2010-3-3 

新手上路

3# 发表于 2007-2-1 09:18 PM | 只看该作者 好文啊 回复 引用

报告 道具 TOP

achen
  • 发短消息
  • 加为好友

achen 当前离线

UID
3674 
帖子
17 
精华
积分
阅读权限
10 
来自
成都 
在线时间
19 小时 
注册时间
2007-1-3 
最后登录
2007-6-1 

新手上路

4# 发表于 2007-4-17 08:08 PM | 只看该作者

补充一下

跟踪了一下JM86代码,发现如下:
帧内4*4亮度预测时,采用的是RDO模型,即上述第一种模型,分别求得每个4*4块的最佳预测模式,然后求得16个4*4最佳预测模式的总的cost。
帧内16*16亮度预测时,采用的也是RDO模型,计算SATD(通过Hadamard变换来求),然后求得最佳预测模式,以及该最佳预测模式的cost。
分别求出4*4 和 16*16的最佳预测模式后,再与色度预测模式一起做RDO,最后得出该macroblock的最佳预测模式。

至于楼主所说的第二种模型,没有找到。可能是我疏忽了吧。
若有不妥之处,还望指教! 好好学习
报效国家 回复 引用

报告 道具 TOP

jiongdy
  • 发短消息
  • 加为好友

jiongdy 当前离线

UID
19082 
帖子
44 
精华
积分
22 
阅读权限
10 
来自
重庆 
在线时间
27 小时 
注册时间
2007-6-5 
最后登录
2008-12-18 

新手上路

5# 发表于 2008-5-27 05:31 PM | 只看该作者 学习了 回复 引用

报告 道具 TOP

双城十二少
  • 发短消息
  • 加为好友

双城十二少 当前离线

UID
51739 
帖子
精华
积分
阅读权限
10 
在线时间
4 小时 
注册时间
2008-4-6 
最后登录
2008-6-1 

新手上路

6# 发表于 2008-5-27 07:14 PM | 只看该作者 其中
在亮度4x4帧内预测时,其中DC预测(模式2)、垂直预测(模式0)和水平预测(模式2总是被认为有效的
应改为:
在亮度4x4帧内预测时,其中DC预测(模式2)、垂直预测(模式0)和水平预测(模式1)总是被认为有效的 回复 引用

报告 道具 TOP

QuestionMark
  • 发短消息
  • 加为好友

QuestionMark (问号)当前离线

UID
2313 
帖子
220 
精华
积分
345 
阅读权限
100 
在线时间
414 小时 
注册时间
2006-11-6 
最后登录
2010-5-8 

版主

7# 发表于 2008-5-28 06:16 PM | 只看该作者 好文要支持 回复 引用

报告 道具 TOP

sam_wheat
  • 发短消息
  • 加为好友

sam_wheat 当前离线

UID
36552 
帖子
228 
精华
积分
139 
阅读权限
20 
在线时间
134 小时 
注册时间
2007-11-22 
最后登录
2010-5-12 

注册会员

8# 发表于 2008-5-29 06:02 PM | 只看该作者 支持支持 回复 引用

报告 道具 TOP

anchorage
  • 发短消息
  • 加为好友

anchorage 当前离线

UID
54291 
帖子
精华
积分
阅读权限
10 
在线时间
7 小时 
注册时间
2008-5-6 
最后登录
2008-6-5 

新手上路

9# 发表于 2008-6-2 04:28 PM | 只看该作者

回复 #1 washing 的帖子

我也正在做帧内模式选择 回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3316 
精华
37 
积分
3543 
阅读权限
200 
在线时间
578 小时 
注册时间
2006-9-26 
最后登录
2010-5-13 

管理员

10# 发表于 2008-6-9 06:54 PM | 只看该作者 我再来补充总结一下 JM86 的帧内宏块类型选择过程。


1、RDO 时的步骤:
(1)、计算 intra4*4 类型。对当前宏块的每个 4*4 小块按照 cost = SSD + lambda_mode * Rate 在 9 种预测模式中选取最佳预测模式;
(2)、计算 intra16*16 类型。先对当前宏块的每个 4*4 小块进行 Hadamard 变换,然后再对 DC 系数组成的 4*4 块进行一次 Hadamard 变换。将所有非零系数的绝对值求和作为代价在 4 种预测模式中选择最佳预测模式;
(3)、对 intra4*4 类型和 intra16*16 类型分别在前面计算得到的最佳预测模式的情况下计算 cost = SSD + lambda_mode * Rate,在这两种类型中选出最佳类型再去与 inter 类型的比较。

2、非 RDO 时的步骤:
(1)、计算 intra4*4 类型。首先,对当前宏块的每个 4*4 小块按照 cost = SA(T)D + 4 * lambda_mode(当前模式不是最有可能模式)或者 cost = SA(T)D (当前模式是最有可能模式)在 9 种预测模式中选取最佳预测模式;然后,计算当前宏块总代价 cost_intra4*4 = 16 个 4*4 小块的最佳 cost 求和 + 4 * 6 * lambda_mode;
(2)、计算 intra16*16 类型。先对当前宏块的每个 4*4 小块进行 Hadamard 变换,然后再对 DC 系数组成的 4*4 块进行一次 Hadamard 变换。将所有非零系数的绝对值求和作为代价在 4 种预测模式中选择最佳预测模式。并将最佳预测模式时的代价作为宏块总代价 cost_intra16*16;
(3)、比较 cost_intra4*4 和 cost_intra16*16,在这两种类型中选出最佳类型再去与 inter 类型的比较。


【说明】:1、模式选择属于开放算法,以上过程只是 JM86 的执行步骤。其他 H.264 编码器的执行步骤可能并不相同;
               2、lambda_mode 根据是否采用 RDO,其值不同。具体计算方法可参考 encode_one_macroblock 函数中的 SET LAGRANGE PARAMETERS 标志处;
               3、非 RDO 时计算 intra4*4 的每个 4*4 小块代价时,可以采用 SAD 也可以采用 SATD,这由编码配置参数设置;
               4、在 intra4*4 与 intra16*16 之间做选择时,RDO 情况下色度要参与计算,而非 RDO 情况下色度不参与计算;
               5、从以上过程可以看到,intra16*16 在进行 4 种模式选择时候,无论是否在 RDO 情况下,其选择过程是相同的。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》回复 引用

报告 道具 TOP

xixibo
  • 发短消息
  • 加为好友

xixibo 当前离线

UID
33834 
帖子
44 
精华
积分
22 
阅读权限
10 
在线时间
35 小时 
注册时间
2007-10-20 
最后登录
2010-1-17 

新手上路

11# 发表于 2008-6-13 11:21 AM | 只看该作者 [quote]非 RDO 时的步骤:
(1)、计算 intra4*4 类型。首先,对当前宏块的每个 4*4 小块按照 cost = SA(T)D + 4 * lambda_mode(当前模式不是最有可能模式)或者 cost = SA(T)D (当前模式是最有可能模式)在 9 种预测模式中选取最佳预测模式;然后,计算当前宏块总代价 cost_intra4*4 = 16 个 4*4 小块的最佳 cost 求和 + 4 * 6 * lambda_mode;[/quote]
其中
计算当前宏块总代价 cost_intra4*4 = 16 个 4*4 小块的最佳 cost 求和 + 4 * 6 * lambda_mode;
不明白
为什么还要加上4 * 6 * lambda_mode?
谢谢! 回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3316 
精华
37 
积分
3543 
阅读权限
200 
在线时间
578 小时 
注册时间
2006-9-26 
最后登录
2010-5-13 

管理员

12# 发表于 2008-6-13 12:53 PM | 只看该作者 可能是为了增加 16*16 被选中的机会吧。JM 就是这么做的,每个 8*8 加一个  6 * lambda_mode,因此就等于是加了一个 4 * 6 * lambda_mode,具体原因我也不知道。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》回复 引用

报告 道具 TOP

lotus_9
  • 发短消息
  • 加为好友

lotus_9 当前离线

UID
57887 
帖子
36 
精华
积分
18 
阅读权限
10 
在线时间
10 小时 
注册时间
2008-6-12 
最后登录
2009-5-22 

新手上路

13# 发表于 2008-10-9 09:35 AM | 只看该作者 好帖,谢谢 回复 引用

报告 道具 TOP

lzhgang
  • 发短消息
  • 加为好友

lzhgang 当前离线

UID
57263 
帖子
70 
精华
积分
35 
阅读权限
10 
在线时间
55 小时 
注册时间
2008-6-5 
最后登录
2009-12-27 

新手上路

14# 发表于 2008-11-25 11:09 PM | 只看该作者
1、RDO 时的步骤:

2)、计算 intra16*16 类型。先对当前宏块的每个 4*4 小块进行 Hadamard 变换,然后再对 DC 系数组成的 4*4 块进行一次 Hadamard 变换。将所有非零系数的绝对值求和作为代价在 4 种预测模式中选择最佳预测模式;
这里我存在一点疑问,我没跟踪代码,说得也许不对,据我所知:SATD计算过程如下

(1)Diff(i,j) = Original(i,j) - Prediction(i,j)
(2)DiffT = H * Diff * H
(3)SATD是DiffT的绝对值和再除以2,


如果是这样的话,应该先求每个4*4块的Diff(i,j)然后进行(2)接着进行(3)最后对16个4*4块的SATD求和确定4种预测模式中最小的SATD作为最终的16*16预测模式
不知对否?
回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3316 
精华
37 
积分
3543 
阅读权限
200 
在线时间
578 小时 
注册时间
2006-9-26 
最后登录
2010-5-13 

管理员

15# 发表于 2008-11-26 06:15 PM | 只看该作者 怪我没有说清楚,上面的变换过程都是对残差进行的。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》回复 引用

报告 道具 TOP

sunsx1103
  • 发短消息
  • 加为好友

sunsx1103 当前离线

UID
68543 
帖子
14 
精华
积分
阅读权限
10 
在线时间
5 小时 
注册时间
2008-11-22 
最后登录
2010-1-11 

新手上路

16# 发表于 2008-12-11 12:23 PM | 只看该作者 好文,继续学习中~ 回复 引用

报告 道具 TOP

timek
  • 发短消息
  • 加为好友

timek 当前离线

UID
26732 
帖子
精华
积分
阅读权限
10 
在线时间
9 小时 
注册时间
2007-7-31 
最后登录
2009-7-24 

新手上路

17# 发表于 2009-1-9 09:59 PM | 只看该作者 在亮度4x4帧内预测时,其中DC预测(模式2)、垂直预测(模式0)和水平预测(模式2总是被认为有效的



在jm中,对I帧的第一个4×4子块编码时候,我跟踪只发现只进行了DC预测(模式2)计算,并没有0和模式1计算。
其它模式都是根据是否可用,才计算的。 回复 引用

报告 道具 TOP

peiyangpr
  • 发短消息
  • 加为好友

peiyangpr 当前离线

UID
43316 
帖子
19 
精华
积分
55 
阅读权限
20 
在线时间
18 小时 
注册时间
2008-1-18 
最后登录
2010-3-25 

注册会员

18# 发表于 2009-1-9 10:33 PM | 只看该作者

回复 17# timek 的帖子

标准上也是写只有DC预测一直有效。 回复 引用

报告 道具 TOP

china_clear
  • 发短消息
  • 加为好友

china_clear 当前离线

UID
72440 
帖子
74 
精华
积分
37 
阅读权限
10 
在线时间
87 小时 
注册时间
2009-6-25 
最后登录
2010-5-10 

新手上路

19# 发表于 2009-9-15 05:30 PM | 只看该作者 问一下,在16x16的计算中:
要进行两次Hadamard变换吗?还是先进行DCT再对DC值进行Hadamard变换? 回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3316 
精华
37 
积分
3543 
阅读权限
200 
在线时间
578 小时 
注册时间
2006-9-26 
最后登录
2010-5-13 

管理员

20# 发表于 2009-9-15 06:55 PM | 只看该作者 19# china_clear
我在 10 楼的帖子里已经说得非常清楚了。但是这只是 JM 的做法,并不代表其他编码器也必须这样做,因为这部分是开放算法。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》回复 引用

报告 道具 TOP

[转贴] H.264帧内编码的模式选择11——arix - H.264乐园 - 视频技术论坛 ... [转贴] H.264帧内编码的模式选择——arix - H.264乐园 - 视频技术论坛 ... H.264中POC类型之探讨 - H.264乐园 - 视频技术论坛 中华视频网|ffmpe... [原创] Skip宏块与Direct预测模式浅析 - H.264乐园 - 视频技术论坛 中华视频网|ffmpeg工程组 - Powered by Discuz! 视频编码标准的发展概括:从H.261到H.264 视频编码标准的发展概括:从H.261到H.264 视频编码标准的发展:从H.261到H.264 - 流媒体 - 坚持到底 基于Blackfin533的H.264编码 视频压缩编码的新发展-H.264 H.264数字视频编码标准 H.264和MPEG-4视频压缩:下一代多媒体视频编码 H.264/MPEG-4视频编码压缩标准 [原创] MV预测过程详解(附图) - H.264乐园 - 视频技术论坛 中华视频网|ffmpeg工程组 - Powered by Discuz! H.264中POC类型之探讨 - H.264乐园 - 视频 视频编码标准H.264的核心技术分析 - 消费电子 - 解决方案 - 嵌入式在线 H.264/MPEG4等编码格式 H.264/ H.264整数DCT公式推导和蝶形图分析-多视角视频编码(mvc)研究-搜狐博客 H.264整数DCT公式推导和蝶形图分析-多视角视频编码(mvc)研究-搜狐博客 视频基础知识之H.264编码 - 高清讨论区 - FTP资源区 - 电玩巴士游戏论坛 ||... H.264编一个I帧多麻烦---JM 9.7中I帧编码分析 关于encode_one_macroblock()中的一个for循环 - H.264乐园 ... 中华视频网 - [原创] 我的H.264学习历程 中华视频网 - [原创] 我的H.264学习历程