【问题标题】:what compression algorithm to use for highly redundant data对高度冗余的数据使用什么压缩算法
【发布时间】:2013-09-03 10:56:41
【问题描述】:

这个程序使用套接字来传输高度冗余的二维字节数组(类似图像)。虽然传输速率​​相对较高(10 Mbps),但阵列也是高度冗余的(例如,每一行可能包含几个因此相似的值)。 我已经尝试过 zlib 和 lz4 并且结果很有希望,但是我仍然想到了一种更好的压缩方法,请记住它应该像 lz4 一样相对较快。有什么建议吗?

【问题讨论】:

  • 您已标记“图像压缩”。您正在压缩的数据是图像流吗?如果是这样,我建议您使用无损视频/图像编解码器。
  • 数据不是真实的图像,但是它们满足了像图像一样表现的所有要求,我看过无损视频编解码器,但是数据是实时生成的,视频编解码器倾向于在压缩阶段要慢。
  • 尝试阅读this paper
  • 感谢 jxh,我审阅了这篇论文。我不确定它与问题到底有什么关系。

标签: c++ compression image-compression


【解决方案1】:

您可以创建自己的,如果行中的数据相似,您可以创建资源/索引映射,从而大大减少大小,像这样

原始文件:
第 1 行:1212, 34,45,1212,45,34,56,45,56
第 2 行:34,45,1212,78,54,87,....

您可以创建一个唯一值列表,而不是使用和索引替换,

34,45,54,56,78,87,1212

第 1 行:6,0,2,6,1,0,.....

这可以为您节省超过 30% 或更多的数据传输,但这取决于数据的冗余程度

更新

这里是一个简单的实现

std::set<int> uniqueValues
DataTable my2dData; //assuming 2d vector implementation
std::string indexMap;
std::string fileCompressed = "";

int Find(int value){
  for(int i = 0; i < uniqueValues.size; ++i){
     if(uniqueValues[i] == value) return i;
  }
  return -1;
}

//create list of unique values
for(int i = 0; i < my2dData.size; ++i){
  for(int j = 0; j < my2dData[i].size; ++j){
     uniqueValues.insert(my2dData[i][j]);
  }
}    

//create indexes
for(int i = 0; i < my2dData.size; ++i){
  std::string tmpRow = "";
  for(int j = 0; j < my2dData[i].size; ++j){
     if(tmpRow == ""){ 
       tmpRow = Find(my2dData[i][j]);     
     }
     else{
       tmpRow += "," + Find(my2dData[i][j]);
    }
  }
  tmpRow += "\n\r";
  indexMap += tmpRow;
}

//create file to transfer
for(int k = 0; k < uniqueValues.size; ++k){
  if(fileCompressed == ""){ 
       fileCompressed = "i: " + uniqueValues[k];     
     }
     else{
       fileCompressed += "," + uniqueValues[k];
    }
}
fileCompressed += "\n\r\d:" + indexMap;

现在在接收端你只是做相反的事情,如果行以“i”开头你得到索引,如果它以“d”开头你得到数据

【讨论】:

  • 感谢法布里齐奥。我有类似的想法,但是,在实现这种方法之前,我正在寻找一种为冗余(具有上述特定模式)数据设计的标准压缩算法。
  • 我认为@Fabrizio 是对的,但我猜zlib 也是您问题的一个完全可以接受的解决方案。您需要在高性能和高复杂性之间找到平衡点。
  • 您提到的库在这方面做得很好,但是由于任何通用库都被实现为“通用”,这可能不是所有情况下的最佳选择,因此使用了我为您提供的示例由 .obj 3d 数据文件格式,不需要很长时间即可实现,而且非常强大en.wikipedia.org/wiki/Wavefront_.obj_file
【解决方案2】:

您应该在压缩之前查看PNG algorithms for filtering image data。它们是基于先前值预测 2D 数组中的值的简单到更复杂的方法。在预测良好的情况下,过滤可以显着改善后续压缩步骤。

您应该简单地对您的数据尝试这些过滤器,然后将其提供给 lz4。

【讨论】:

  • 谢谢马克,我明白了这个概念,我认为相邻像素的概念可以扩展到超过周围 1 个像素的邻居......我正在考虑有一个距离为 n 个像素的窗口方向,然后也许使用过滤器类型 3...
  • 但我仍然不确定如何 1- 在合理的时间内找到 n 以及 2- 如何处理边缘...
  • 对于边缘,将其视为数组被零包围。
  • 从距离 1 过滤器开始,在尝试使用更多以前的数据之前,看看它能让你走多远。一般来说,当你看得更远时,你会得到递减的回报,甚至更糟糕的压缩。
  • 我会试试的,谢谢马克的建议。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 2011-03-12
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2016-08-15
相关资源
最近更新 更多