2011-04-11 1 views
4

나는 허프만 압축을 사용하여 이미지를 손실없이 유지하면서 크기를 줄 였지만 예측 코딩을 사용하여 엔트로피를 줄임으로써 이미지 데이터를 더욱 압축 할 수 있다고 읽었습니다.C# 이미지 압축에 대한 예측 코딩

무손실 JPEG 표준에서 각 픽셀은 이미 래스터 순서 (위에서 3 개, 왼쪽에서 한 개)로 인접한 4 개의 픽셀의 가중 평균으로 예측됩니다. 예를 들어, 픽셀 값을 예측하려고 왼쪽뿐만 아니라 위 화소 (X) 이전에 기초 :

x x x 
x a 

그럼 계산하고 잔여 (예측과 실제 값 사이의 차이)을 인코딩한다.

하지만 평균 4 개의 이웃 픽셀이 4의 배수가 아니면 분수를 얻을 수 있습니까? 그 부분을 무시해야합니까? 나는이 정말 엔트로피를 줄일 수 표시되지 않습니다

public static void Encode(byte[] buffer, int width, int height) 
{ 
    var tempBuff = new byte[buffer.Length]; 

    for (int i = 0; i < buffer.Length; i++) 
    { 
     tempBuff[i] = buffer[i]; 
    } 

    for (int i = 1; i < height; i++) 
    { 
     for (int j = 1; j < width - 1; j++) 
     { 
      int offsetUp = ((i - 1) * width) + (j - 1); 
      int offset = (i * width) + (j - 1); 

      int a = tempBuff[offsetUp]; 
      int b = tempBuff[offsetUp + 1]; 
      int c = tempBuff[offsetUp + 2]; 
      int d = tempBuff[offset]; 
      int pixel = tempBuff[offset + 1]; 

      var ave = (a + b + c + d)/4; 
      var val = (byte)(ave - pixel); 
      buffer[offset + 1] = val; 
     } 
    } 
} 

public static void Decode(byte[] buffer, int width, int height) 
{ 
    for (int i = 1; i < height; i++) 
    { 
     for (int j = 1; j < width - 1; j++) 
     { 
      int offsetUp = ((i - 1) * width) + (j - 1); 
      int offset = (i * width) + (j - 1); 

      int a = buffer[offsetUp]; 
      int b = buffer[offsetUp + 1]; 
      int c = buffer[offsetUp + 2]; 
      int d = buffer[offset]; 
      int pixel = buffer[offset + 1]; 

      var ave = (a + b + c + d)/4; 
      var val = (byte)(ave - pixel); 
      buffer[offset + 1] = val; 
     } 
    } 
} 

: 그렇다면, (A byte[]에 저장) 8 비트 이미지의 적절한 인코딩은 같은 것입니까? 이 방법은 여전히 ​​무손실 상태에서 이미지를 압축하는 데 어떻게 도움이됩니까? 어떤 깨달음

에 대한

감사 편집 :

그래서 예측 코딩 이미지 재생 후, 나는 히스토그램 데이터가 배포판에있는 다양한 픽셀 + -1의 많이 보여줍니다 것으로 나타났습니다. 어떤 경우 엔 엔트로피가 상당히 줄어 듭니다. 여기에 스크린 샷은 다음과 같습니다

enter image description here

답변

3

예, 그냥 잘라. 차이점을 저장하기 때문에 중요하지 않습니다. 작은 값만 저장하기 때문에 엔트로피가 줄어 듭니다. 그 중 많은 수는 -1, 0 또는 1이 될 것입니다. 스 니펫 btw에 하나씩 몇 가지 버그가 있습니다.

+0

정말요? 어느 부분이 하나씩 떨어져 있다는 것을 지적 해 주시겠습니까? 그게 훌륭 할거야 :) 또한, -1 값에 대해 말하면, 어떻게 음의 값을 처리 할 수 ​​있을까요? 루프를 255 개까지 돌리시겠습니까? –

+0

좋아, 이제 알겠지만 너는 국경을 피하고있어. 예, 넘치도록하십시오. –

+0

좋아, 나는 히스토그램을 빨리 비교했고, 네가하는 말을 본다! 나는 그것이 보이는 것의 그림을 게시 할 것이다. 당신 explaination 주셔서 감사합니다! –