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

Image 深度图像压缩达到最大允许误差,image,algorithm,data-structures,compression,Image,Algorithm,Data Structures,Compression,关于图像压缩的文章通常侧重于在给定固定压缩比的情况下生成尽可能最佳的图像质量(PSNR)。我很好奇,在允许的最大每像素误差的情况下,如何获得尽可能好的压缩比。我的本能是贪婪地删除转换数据中的最小系数,跟踪我造成的错误,直到我无法再删除而不通过最大错误。但我找不到任何文件来证实这一点。有人能给我指一个关于这个问题的参考资料吗 编辑 让我提供更多细节。我试图压缩3D扫描仪的深度图像,而不是普通图像。颜色不是一个因素。深度图像往往具有较大的平滑面片,但精确的不连续性很重要。一些像素将是空的-超出扫描

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


编辑 让我提供更多细节。我试图压缩3D扫描仪的深度图像,而不是普通图像。颜色不是一个因素。深度图像往往具有较大的平滑面片,但精确的不连续性很重要。一些像素将是空的-超出扫描仪的范围或低置信水平-不需要压缩

该算法需要快速运行——最佳运行速度为30 fps,如微软Kinect,或者至少在100毫秒范围内。该算法将包含在我分发的库中。我更喜欢最小化依赖关系,因此我可以用少量代码实现的压缩方案更可取。

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

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

编辑:

是SVD压缩的更好说明

对于您提出的问题,我不知道有任何参考资料

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

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

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

为了解决这个问题,您可以选择使用适当的函数来调节目标函数,该函数不鼓励目标函数值接近零,并且是阈值后的单调递增函数。像| log(\epsion+f)|这样的函数就足够了

如果你觉得我的建议有趣,一定要告诉我。我随身带着一个遗传算法的实现。但它是根据我的需要量身定做的,你可能无法适应这个问题。我愿意和你们一起研究这个问题,因为这个问题似乎很有趣


一定要让我知道

我认为您已经非常接近解决方案,但有一个问题我认为您应该注意一下。 因为不同的小波系数对应于不同尺度(和位移)的函数,所以通过消除部分系数引入的误差不仅取决于它的值,而且取决于它的位置(特别是尺度),因此系数的权重应该类似于
w(c)=amp(c)*F(尺度,位移)
式中,amp(c)是系数的振幅,F是取决于压缩数据的函数。当你确定像这样的重量时,问题被简化为背包问题,这可以通过多种方式解决(例如重新排序系数并消除最小的系数,直到你得到受相应函数影响的像素的阈值误差)。困难的部分是确定F(刻度、移位)。你可以用下面的方法来做。如果正在压缩的数据相对稳定(例如监控视频),则可以将F估计为接收到不可接受错误的中等概率,从而消除具有给定比例的分量,并从小波分解中偏移。因此,您可以对历史数据执行SVD(或PCA)分解,并将“F(scale,shift)”计算为具有给定比例的分量的标量积的加权(权重等于特征值)和,并移动到特征向量
F(标度,位移)=求和估值(i)*(w(标度,位移)*向量(i))
其中估值是对应于特征向量的特征值-向量(i),w(标度,位移)是一个具有给定尺度和位移的小波函数。

迭代计算不同的系数集无助于实现帧生成后快速压缩的目标,也无助于降低复杂度

深度贴图与强度贴图在几个方面有所不同,可以为您提供帮助

  • 运行长度编码可以非常有效地处理大面积的“无数据”
  • 在减去固定噪声后,强度图像中的测量误差在整个图像中保持不变,但Kinect和立体视觉系统的深度贴图的误差随着深度的反函数而增加。如果这些是您要瞄准的扫描仪,那么您可以对更接近的像素使用有损压缩-因为有损函数引入的错误与传感器错误无关,因此
    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]