2013-08-30 3 views
5

이 프로그램은 소켓을 사용하여 고도로 이중화 된 2 차원 바이트 배열 (이미지)을 전송합니다. 전송 속도가 비교적 높은 (10Mbps) 동안, 어레이는 또한 매우 과잉이다 (예를 들어, 각 행은 몇몇 결과적으로 유사한 값을 포함 할 수있다). 나는 zlib과 lz4를 시도해 보았지만 그 결과는 유망했다. 그러나 나는 여전히 더 나은 압축 방법을 생각하고 있으며, lz4에서와 같이 상대적으로 빠르다는 것을 기억해야한다. 어떤 제안? 행의 데이터는 따라서 감소 자원/인덱스 맵을 만들 수 있습니다 비슷한 경우고도의 중복 데이터에 사용할 압축 알고리즘

+1

"이미지 압축"이라는 태그가 지정되었습니다. 압축 된 데이터가 이미지 스트림입니까? 그렇다면 무손실 비디오/이미지 코덱을 사용할 것을 제안합니다. – Aron

+0

데이터는 실제 이미지가 아니지만 이미지와 같이 작동하는 데 필요한 모든 요구 사항을 충족하며 무손실 비디오 코덱을 살펴 보았습니다. 그러나 실시간으로 생성되는 비디오 코덱은 압축 단계에서 느려지는 경향이 있습니다. – beebee

+0

[이 신문] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf)을 읽어보십시오. – jxh

답변

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 % 이상 데이터 전송을 통해 당신을 저장할 potantialy 수 있지만, 데이터가

얼마나 중복에 따라 달라집니다

여기 UPDATE

간단한 구현 라인이 시작하는 경우가로 시작하는 경우, "난"당신 ", 인덱스를 반대합니까 단지 수신 측에 지금

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; 

d "를 얻는다. 데이터

+0

Fabrizio에게 감사드립니다. 나는 비슷한 것을 염두에두고있다. 그러나 그런 방법을 구현하기 전에 중복 데이터 (언급 한 특정 패턴의 데이터)로 설계된 표준 압축 알고리즘을 찾고있다. – beebee

+0

@Fabrizio가 맞다고 생각하지만, zlib도 문제의 수용 가능한 해결책이라고 생각합니다. 높은 성능과 높은 복잡성 사이의 균형점을 찾아야합니다. – Netherwire

+1

당신이 언급 한 라이브러리는 꽤 훌륭하게 작동하지만 모든 범용 라이브러리가 모든 상황에서 최상이 아닌 "일반"으로 구현 되었기 때문에 내가 제공 한 예제는 .obj 3d 데이터 파일에서 사용됩니다 형식으로 구현하는 데 오랜 시간이 걸리지 않고 조용합니다. 강력한 http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

압축하기 전에 PNG algorithms for filtering image data을 확인해야합니다. 이전 값을 기반으로 2D 배열의 값을 예측하기위한보다 정교한 방법에 간단합니다. 예측이 양호한 정도까지, 필터링은 후속 압축 단계에서 크게 개선 될 수 있습니다.

데이터에 이러한 필터를 사용해보고 lz4로 보내면됩니다.

+0

고마워요, 개념을 가지고 있고 이웃 픽셀의 개념이 주변의 1 픽셀 이웃보다 더 확장 될 수 있다고 생각합니다 ... 모든 방향으로 거리 n 픽셀의 창을 가질 생각입니다. 그럼 아마도 필터 유형 3을 사용하십시오 ... – beebee

+0

하지만 여전히 나는 1- 적절한 시간과 2에서 가장자리를 어떻게 찾지 모르겠어요 ... – beebee

+0

가장자리에 대해서는 마치 배열을 취급 0으로 둘러싸인. –