什么压缩算法用于高度冗余的数据

时间:2013-08-30 16:26:13

标签: c++ compression image-compression

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

2 个答案:

答案 0 :(得分:4)

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

您只需在数据上尝试这些过滤器,然后将其提供给lz4。

答案 1 :(得分: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”开头就得到数据