关于哥伦布编码,求大虾们说说原理。

kfanffvga 2011-02-15 07:14:39
如题,最好有例子说明,不需要代码,求大虾说说原理
...全文
1354 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cabbage2008 2012-07-04
  • 打赏
  • 举报
回复
哥伦布编码
luckyjungle 2012-01-16
  • 打赏
  • 举报
回复
和mpeg-2和mpeg-4的编码比较起来,h264编码的复杂度要高很多
kfanffvga 2011-03-09
  • 打赏
  • 举报
回复
更正一下,m = 2^12
kfanffvga 2011-03-09
  • 打赏
  • 举报
回复
首先多谢OExpress和tufaqing的论述,但是我还是有不明白的地方,就是阶数,为什么有一个2^阶数的数字的呢?

比如35,把它变成哥伦布编码 是变成什么呢? 假设阶数M为12

附带上解码代码:
void golombDecode(char* source, char* dest, int M)
{
BitReader bitreader(source);
IntWriter intwriter(dest);
int q = 0;
int nr = 0;
while (bitreader.hasLeft())
{
nr = 0;
q = 0;
while (bitreader.getBit()) q++; // potentially dangerous with malformed files.
for (int a = 0; a < log2(M); a++) // read out the sequential log2(M) bits
if (bitreader.getBit())
nr += 1 << a;
nr += q*M; // add the bits and the multiple of M
intwriter.putInt(nr); // write out the value
}
bitreader.close();
intwriter.close()
}
CyberLogix 2011-02-16
  • 打赏
  • 举报
回复
指数哥伦布编码
规定语法元素的编解码模式的描述符如下:
比特串:
b(8):任意形式的8比特字节(就是为了说明语法元素是为8个比特,没有语法上的含义)
f(n):n位固定模式比特串(其值固定,如forbidden_zero_bit的值恒为0)
i(n):使用n比特的有符号整数(语法中没有采用此格式)
u(n):n位无符号整数

指数哥伦布编码:
ue(v):无符号整数指数哥伦布码编码的语法元素
se(v):有符号整数指数哥伦布编码的语法元素,左位在先
te(v):舍位指数哥伦布码编码语法元素,左位在先

以及ce(v):CAVLC和ae(v):CABAC。

指数哥伦布编码过程:
在表9-1中,比特串格式为“前缀1后缀”。1)1后缀=codeNum+1,如codeNum = 3,则1后缀=4,即为100,后缀为00;2)前缀与后缀的比特数相同,且前缀的各位比特为0,如codeNum=3,则最终编码所得的比特串为:00100.

对于ue(v),按上述规则进行编码;

对于se(v),则按照表9-3转换成codeNum,然后按上述规则进行编码;
在表9-3中,1)语法元素值为负数,则乘2取反,转换成codeNum,2)语法元素为正数,则乘2减1,转换成codeNum;

对于te(v),只有7.3.5.1节“宏块预测语法”和7.3.5.2节“子宏块预测语法”中的ref_idx_l0[mbPartIdx]和ref_idx_l1[mbPartIdx]用此模式编码,
如果语法元素值为0,则编码为1,如果语法元素值为1,则编码为0,如果为其他大于1的值,则按ue(v)进行编码。
CyberLogix 2011-02-16
  • 打赏
  • 举报
回复
指数哥伦布码(Exponential-Golomb code, 即Exp-Golomb code)压缩编码方法过程:

用来表示非负整数的k阶指数哥伦布码可用如下步骤生成:

1. 将数字以二进制形式写出,去掉最低的k个比特位,之后加1

2. 计算留下的比特数,将此数减一,即是需要增加的前导零个数

3.将第一步中去掉的最低k个比特位补回比特串尾部

比特串格式为“前缀1后缀”。1)1后缀=codeNum+1,如codeNum = 3,则1后缀=4,即为100,后缀为00;2)前缀与后缀的比特数相同,且前缀的各位比特为0,

下例为对不同codeNum进行的编码结果:

0 => 1 => 1

1 => 10 => 010

2 => 11 => 011

3 => 100 => 00100

4 => 101 => 00101

5 => 110 => 00110

6 => 111 => 00111

7 => 1000 => 0001000

8 => 1001 => 0001001



与此相反,这些语法元素的解析过程是由比特流当前位置比特开始读取,包括非0 比特,直至leading_bits 的数量为0。具体过程如下所示:

leadingZeroBits = ?1;
for( b = 0; !b; leadingZeroBits++ )
b = read_bits( 1 )
变量codeNum 按照如下方式赋值:
codeNum = 2leadingZeroBits ? 1 + read_bits( leadingZeroBits )
这里read_bits( leadingZeroBits )的返回值使用高位在先的二进制无符号整数表示。

如下示例:

二进制比特数 长度 解析值

1001 1 0

001 1001 5 5

01 1010 3 2

010 3 1

000 1011 7 10

0001 001 7 8

tufaqing 2011-02-16
  • 打赏
  • 举报
回复
计算前面有多少个bit位为0,记为n,后面的有效数据就是n+1位(如果n等于0后面的有效数据就是1位),这样2n+1位就是一个编码,其中前面n位是0前缀,后面的n+1位是有效数据。再看定义的是有符号还是无符号型的,无符号型的就是直接后面n+1位有效数据的排列的二进制数据大小,有符号型的要将无符号型的数据稍微转换一下,变成正数或负数(前n位表示数据,最后一位表示符号)。具体详细介绍看H264标准文档说明。
kfanffvga 2011-02-16
  • 打赏
  • 举报
回复
我想知道它的编码规则,而不是具体的应用
zoulie 2011-02-15
  • 打赏
  • 举报
回复
iso14496-10部分里面有算法讲解,不难
CyberLogix 2011-02-15
  • 打赏
  • 举报
回复
看考《H264和MPEG4视频压缩》一书上的介绍

2,552

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧