深度图无损压缩——RVL算法

深度图无损压缩——RVL算法

RVL算法(Run length encoding and Variable Length encoding)是微软自研的深度图无损压缩算法。论文下载

算法流程

差分编码
正负数重映射
游程编码
变长编码

差分编码

编码规则

d [ t ] = x [ t ] − x [ t − 1 ] d[t]=x[t]-x[t-1] d[t]=x[t]x[t1]

数据还原

x [ t ] = d [ t ] + x [ t − 1 ] x[t]=d[t]+x[t-1] x[t]=d[t]+x[t1]

深度图无损压缩——RVL算法_第1张图片
  用相邻两个数据的差取代原先的序列,对于平滑的数据,可以大幅压缩其动态范围,如上图所示。

算法细节

  传统图像存储是如下图第一幅图所示,扫描换行时会从头开始,由于深度数据具有局部性,换行会出现距离值的跳跃,增加动态范围。第二幅、第三幅图是对应的优化方式,将深度图以折回扫描的形式“拉直”成一维数据序列,或者从左上到右下的扫描方式。
深度图无损压缩——RVL算法_第2张图片

正负数重映射

  由于负数对后面无损压缩算法处理不友好,会造成压缩效率下降,所以需要通过某一方法将负数映射到正数。

映射算法

核心思想:将正数映射到偶数,将负数映射到奇数
u = { 2 d , d ≥ 0 − 2 d − 1 , d < 0 u=\left\{ \begin{aligned} 2d, &&{d\ge0} \\ -2d-1,&&{d<0} \end{aligned} \right. u={2d,2d1,d0d<0

//映射代码
int u = (d << 1) ^ (d >> 31)
//反映射代码
int d = (u >> 1) ^ -(u & 1)

游程编码——Run Length Encoding(RLE)

核心思想:检测重复的比特或字符序列,并用它们的出现次数取而代之

传统游程编码

以ASCLL文本压缩为例:
  原始文本:aaaaabbbcdeeeeeeef
  RLE编码:5a3b1c1d7e1f

RVL中的游程编码

深度图无损压缩——RVL算法_第3张图片

变长编码

编码规则

从低位开始,每3bit位一组,映射成4bit一组的序列,具体如下:

  • 当高位还有数据时,第4bit记录位1
  • 当高位没有数据时,第4bit记录位0

编码示例

深度图无损压缩——RVL算法_第4张图片

你可能感兴趣的:(算法,图像处理,算法,计算机视觉,图像处理)