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

时间:2013-01-26 21:15:29

标签: image algorithm data-structures compression

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


修改

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

enter image description here

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

7 个答案:

答案 0 :(得分:1)

“贪婪地删除最小系数”让我想起SVD压缩,在这里你使用与第一个k个最大特征值相关的数据来近似数据。小的其余特征值不包含重要信息,可以丢弃 大k - >高品质,低压缩
小k - >质量较低,压缩率高

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

编辑:
here是SVD压缩的更好说明

答案 1 :(得分:1)

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

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

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

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

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

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

请告诉我。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

  1. 通过行程编码可以非常有效地处理大部分“无数据”。
  2. 在减去固定噪声之后,强度图像中的测量误差在图像上是恒定的,但是来自Kinect和立体视觉系统的深度图具有作为深度的反函数而增加的误差。如果这些是你所针对的扫描仪,那么你可以使用有损压缩来获得更接近的像素 - 因为有损函数引入的误差与传感器误差无关,在有损函数的误差大于传感器误差之前,总误差不会增加
  3. 微软的一个团队在一个非常低损耗的算法上取得了很大的成功,该算法严重依赖于游程编码(see paper here),击败了具有更好压缩和卓越性能的JPEG 2000;然而,他们成功的部分原因似乎是他们的传感器产生的相对粗糙的深度图。如果您的目标是Kinects,您可能会发现很难改进他们的方法。

答案 4 :(得分:1)

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

  • 术语“近无损压缩”是指有损算法,其中每个重建图像样本与对应的原始图像样本相差不大于预定值(通常小)“损失”。无损压缩对应于loss = 0. link to the original reference

答案 5 :(得分:1)

此答案不能满足您的参考请求,但发布评论时间太长。

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

基于变换的压缩器(DCT,小波等等)的一个主要问题是找不到满足硬最大误差标准的紧凑系数是不容易的。 (你最终得到的问题看起来很像linear programming。小波可以在大多数基础向量中具有局部行为,这可能有所帮助,但它仍然相当不方便。)为了达到你想要的准确性,你可能需要添加另一个细化步骤,但这也会增加更多的计算时间,复杂性,并会引入另一层不完美的entropy coding,从而导致压缩效率降低。

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

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

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

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

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

如果您正在寻找更简单的实现方法,我建议采用“过滤”类型的方法(类似于PNG)并绑定Golomb-Rice编码器。您可以编码为“足够好”的程度,而不是完美地对增量进行编码以达到无损压缩。与量化然后无损编码式压缩器相比,这样做的优点是可以保持更高的连续性。

答案 6 :(得分:0)

我尝试预处理图像,然后使用常规方法压缩,例如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]