首页 文章

深度图像压缩到最大允许误差

提问于
浏览
10

有关图像压缩的文章通常侧重于在给定固定压缩比的情况下生成最佳图像质量(PSNR) . 我很好奇在给定最大允许的每像素误差的情况下获得最佳压缩比 . 我的本能是贪婪地删除转换数据中的最小系数,跟踪我引起的错误,直到我不能删除任何更多而不传递最大错误 . 但是我发现没有任何文件可以证实 . 谁能指点我对这个问题的参考?


编辑

让我提供一些细节 . 我正在尝试从3D扫描仪压缩深度图像,而不是常规图像 . 颜色不是一个因素 . 深度图像往往具有大的平滑斑块,但精确的不连续性是重要的 . 某些像素将为空 - 在扫描仪范围之外或低置信度 - 并且不需要压缩 .

enter image description here

该算法需要快速运行 - 最佳速度为30 fps,如Microsoft Kinect,或至少在100毫秒区域内的某个位置 . 该算法将包含在我分发的库中 . 我更喜欢最小化依赖性,因此我可以在相当少量的代码中实现自己的压缩方案 .

7 回答

  • 1

    这个答案不能满足你的引用要求,但发表评论太长了 .

    首先,计算机生成的图像的深度缓冲压缩可能适用于您的情况 . 通常这种压缩是在硬件级别通过透明接口完成的,因此通常设计为简单快速 . 鉴于此,search for depth buffer compression可能值得您这么做 .

    您无法轻松找到满足最大硬错误标准的紧凑系数的主要问题之一 . (你最终遇到的问题看起来很像linear programming . 小波在大多数基础向量中都可以有局部行为,这在某种程度上有所帮助,但它仍然相当不方便 . )为了达到你想要的准确性,你可能需要添加另一个细化步骤但这也会增加更多的计算时间,复杂性,并会引入另一层不完善entropy coding导致压缩效率的损失 .

    你想要的更像是无损压缩而不是有损压缩 . 在这种情况下,一种方法是简单地丢弃您的错误阈值下的位:如果您的最大允许误差是X并且您的深度表示为整数,则将您的深度整数除以X然后应用无损压缩 .

    你面临的另一个问题是深度的表示 - 根据你的情况,它可能是一个浮点数,一个整数,它可能是一个投影坐标系,甚至更奇怪 .

    鉴于这些限制,我推荐像BTPC这样的方案,因为它允许更容易调整的类似小波的方案,其中错误更明确地本地化并且更容易理解和解释 . 此外,BTPC对许多类型的图像表现出很强的抵抗力,并且具有良好的处理连续渐变和锐边以及低保真度的能力 - 这正是您正在寻找的各种特征 .

    由于BTPC是预测性的,因此深度格式的存储方式无关紧要 - 您只需要修改预测器以考虑坐标系和数字类型(整数与浮动) .

    由于BTPC没有做太多的数学运算,它在普通CPU上的运行速度也很快,尽管它可能不像你想的那样容易矢量化 . (听起来你可能正在进行低级优化的游戏编程,所以这可能是你认真考虑的问题 . )

    如果您推荐"filter"类型的方法(类似于PNG),并且绑定了Golomb-Rice编码器 . 您可以编码为"good enough"度,而不是完美地对增量进行编码以最终实现无损压缩 . 与量化然后无损编码式压缩器相比,这样做的优点是可以保持更高的连续性 .

  • 1

    "greedily remove the smallest coefficients"让我想起了SVD压缩,您可以使用与第一个k个最大特征值关联的数据来近似数据 . 小的其余特征值不具有重要信息并且可以被丢弃 .
    大k - >高质量,低压缩
    小k - >质量较低,压缩率高

    (免责声明:我不知道我在这里说什么,但可能有帮助)

    编辑:
    here是一个更好的例子SVD压缩

  • 0

    如果您提出问题,我不知道有任何参考 .

    但是,我能想到的一个方向是使用优化技术来选择最佳系数 . 在这方面可以使用遗传算法,爬山,模拟湮灭等技术 .

    鉴于我有遗传算法的经验,我可以建议以下过程 . 如果您不了解遗传算法,我建议您阅读遗传算法的维基页面 .

    可以想到您的问题是选择一个系数子集来给出最小的重建误差 . 假设有N个系数 . 很容易确定有2 ^ N个子集 . 每个子集可以由N个二进制数上的字符串表示 . 例如,对于N = 5,字符串11101表示所选择的子集包含除coeff4之外的所有系数 . 使用遗传算法,可以找到最佳位刺 . 可以选择目标函数作为重建信号和原始信号之间的绝对误差 . 但是,我知道在采用所有系数时你可以得到零的误差 .

    为了解决这个问题,您可以选择使用适当的函数调整目标函数,该函数阻止接近零的目标函数值,并且是在阈值之后的单调递增函数 . 像|的功能log(\ epsion f)|可能就够了 .

    如果我的建议看起来很有趣,请告诉我 . 我和我一起实现了遗传算法 . 但它是根据我的需求量身定制的,你可能无法适应这个问题 . 我愿意和你一起解决这个问题,因为这个问题似乎很有趣 .

    请告诉我 .

  • 1

    我认为你非常接近解决方案,但我认为你应该注意一个问题 . 因为不同的小波系数对应于具有不同尺度(和移位)的函数,所以通过消除部分系数引入的误差不仅取决于它的值,而且取决于它的位置(特别是尺度),因此系数的权重应该是类似于 w(c) = amp(c) * F(scale, shift) ,其中amp(c)是系数的幅度,F是取决于压缩数据的函数 . 当您确定问题被减少到背包问题时,这可以通过多种方式解决(例如重新排序系数并消除最小的系数,直到您受到相应函数影响的像素的阈值误差) . 困难的部分是确定 F(scale,shift) . 您可以通过以下方式完成此操作 . 如果您正在压缩的数据相对稳定(例如监视视频),则可以将F估计为接收不可接受的误差的中间概率,从而消除具有给定比例并从小波分解转移的分量 . 因此,您可以对历史数据执行SVD(或PCA)分解,并将'F(scale, shift)'计算为具有给定比例的组件的标量乘积的加权(具有等于特征值的权重)和移位到特征向量 F(scale,shift) = summ eValue(i) * (w(scale,shift) * eVector(i)) ,其中eValue是对应于特征向量的特征值 - eVector(i),w(比例,移位)是具有给定比例和移位的小波函数 .

  • 1

    迭代地评估不同的系数集将无法帮助您在生成框架时尽快压缩框架,并且无法帮助您降低复杂性 .

    深度贴图与强度贴图的不同之处在于可以帮助您的几种方式 .

    • 通过游程编码可以非常有效地处理"no data"的大区域 .

    • 强度图像中的测量误差在减去固定噪声后在整个图像中是恒定的,但来自Kinect和立体视觉系统的深度图具有随深度的反函数而增加的误差 . 如果这些是您要定位的扫描仪,那么您可以使用有损压缩来获得更接近的像素 - 因为您的有损函数引入的错误与传感器错误无关,因此总错误't be increased until your lossy function' s错误大于传感器错误 .

    • 微软的一个团队在一个非常低损耗的算法上取得了很大的成功,该算法严重依赖于游程编码(see paper here),击败了具有更好压缩和卓越性能的JPEG 2000;然而,他们成功的部分原因似乎是他们的传感器产生的相对粗糙的深度图 . 如果您的目标是Kinects,您可能会发现很难改进他们的方法 .

  • 1

    我认为你正在寻找类似JPEG-LS算法的东西,它试图限制像素误差的最大量 . 尽管如此,它主要用于压缩自然或医学图像,并且不适合深度图像(更平滑) .

    • 术语"near-lossless compression"指的是有损算法,其中每个重建图像样本与对应的原始图像样本相差不超过预先指定的值,(通常很小)"loss."无损压缩对应于损失= 0 . link to the original reference
  • 1

    我尝试预处理图像,然后使用一般方法压缩,例如PNG .

    PNG的预处理(首先阅读this

    for y in 1..height
      for x in 1..width
        if(abs(A[y][x-1] - A[y][x]) < threshold)
           A[y][x] = A[y][x-1]
        elsif (abs(A[y-1][x] - A[y][x]) < threshold)
           A[y][x] = A[y-1][x]
    

相关问题