본문 바로가기
Computer Science(컴퓨터 과학)/영상처리

영상처리 - 영상압축

by BioLearner 2024. 12. 12.
반응형

영상 처리에서 영상 압축은 매우 중요한 기술입니다. 예를 들어, 이미지가 RGB 형식으로 저장될 때, 이를 압축하지 않고 RAW 데이터로 저장하면 파일 용량이 매우 커진다. 반면, JPEG와 같은 압축 기술을 사용하면 용량을 현저히 줄일 수 있다.

예로 들어, 100MB의 RAW 이미지를 JPEG로 압축할 경우, 대체로 10MB에서 50MB 정도로 크기가 줄어들 수 있다. 다만 압축이 클수록 사진이 뭉게진다.

 

이번 포스팅에서는 영상 압축 기술에 대해 자세히 설명하도록 하겠다.

 

1. 영상압축의 2가지 방법

영상 압축에는 두 가지 주요 방법이 있다: 무손실 압축과 손실 압축이다.

  • 무손실 압축은 데이터 손실 없이 압축되므로, 압축 후에도 영상의 품질이 그대로 유지되는 장점이 있다. 그러나 압축률이 상대적으로 낮아 용량 절감에는 한계가 있다.
  • 반면, 손실 압축은 중요도가 낮은 정보를 일부 제거하는 방식으로 압축을 수행한다. 이로 인해 압축률이 높아 용량을 크게 줄일 수 있지만, 그만큼 영상의 품질이 저하될 수 있다.

다음 내용은 이러한 압축기술에 대해서 알아보도록 하겠다.

2. 런 길이 부호화

가장 먼저 가장 간단한 방법으로 런 길이 부호화라는 것이 있다. 이것은 만화와 같은 단순 그림에 적합한 방법이다

이 이미지 압축방법은 다음과 같다. 

 

AAAABBBBBCCCCCCEEEE 이렇게 존재하면 다음과 같이 바꾸는 방법이다.

 

4A5B6C4E

 

압축률 = 19 바이트 / 8바이트 = 2.2

 

이것의 단점은 반복된 자료에 적용하지 않으면 비효율적이라는 점에 있다. 

 

MyDoghasFleas -> 1M1y1D1o1g1H1a1s1F1l1e1a1a

압축률 13바이트 / 26바이트 = 0.5 

 

2.1. 런 길이 부호화의 보완

그러나 이러한 반복되지 않는 것을 보완하는 방법도 있다. 그 방법은

1) 반복되지 않는 데이터는 그대로 표현

2) 런 길이 부호화는 단지 반복된 자료에 적용, 이를 가능하기 위해서는 런 길이를 나타내기 위해 앞에다 특수문자를 삽입하는 방법을 고려할 수 있다.

ABCDDDDDDDDEEEEEEEEE -> ABC*8D*9E

압축률 = 19 바이트 / 9바이트 = 2.11

 

2.2. 런 길이 부호화의 예

이러한 기술을 사용해서 압축을 하는 것은 PCX, RLE, GEM 등이 존재한다.

그 중 PCX형식은 장하는 방식을 사용한다.

 

2.3 PCX 형식

PCX는 이러한 방법을 사용한다.

1) FF FF FF FF FF -> C5 FF

  • 원본 데이터: FF FF FF FF FF (5개의 연속된 FF 색상)
  • 압축 후: C5 FF
  • C5는 5번 연속된 픽셀을 의미하는 길이 정보이고, FF는 실제 색상 값을 나타낸다.

2) 01 05 1A 1C 3F -> 01 05 1A 1C 3F

  • 원본 데이터와 압축된 데이터가 동일하다. 이는 연속된 값이 없을 경우, RLE 압축을 적용할 수 없으며, 원본 데이터를 그대로 저장한다.

3) FF F5 C1 -> C1 FF C1 F5 C1 C1

  • 원본 데이터: FF F5 C1
  • 압축 후: C1 FF C1 F5 C1 C1
  • C1은 첫 번째 색상의 반복 횟수를 의미하고, FF, F5, C1은 각 색상의 값을 나타낸다.
  • 압축된 데이터에서는 반복된 색상 값들을 연속적으로 압축하여 저장한다.

3. 허프만 코딩

허프만 코딩은 데이터의 발생 빈도에 따라 각 문자를 다른 길이의 코드로 표현하는 압축 기법이다. 이 방식은 자주 등장하는 문자는 짧은 코드로, 드물게 등장하는 문자는 긴 코드로 표현하여 데이터의 크기를 줄이는 효과적인 방법이다.

 

예)

T -> 111

O -> 0100

U -> 10111

P -> 10110

E -> 100

 

허프만 코딩은 0과 1을 사용하여 데이터를 표현하는데, 중요한 점은 코드 길이가 겹치지 않도록 설계된다는 것이다. 예를 들어, 001과 0011처럼 코드가 겹치는 경우를 방지하여, 해석할 때 혼동을 피할 수 있도록 한다. 이것의 장점은 압축률이 뛰어다는 점인데

 

반대로 단점은 부호화 시 두 단계를 필요로 한다는 점이다. (문자의 빈도수를 측정, 압축 수행) 그러나 전자의 경우 고정된 표를 사용하는 방법을 사용하여 이를 개선할 수도 있다. 

3.1. 하프만 코딩 알고리즘

허프만 코딩은 자세하게 이야기하면 다음과 같은 방법으로 이를 가능하게 한다.

1) 초기화: 각 문자의 빈도수를 독립적인 노드로 간주하여 리스트에 저장한다.

2) 노드 결합: 빈도수가 가장 낮은 두 개의 노드를 선택하여 하나의 부모 노드를 만든다.

  • 부모 노드는 두 자식 노드의 빈도수 합을 가진다.
  • 빈도수가 높은 노드를 왼쪽 자식으로, 낮은 노드를 오른쪽 자식으로 배치한다.

3) 노드 갱신: 선택된 두 자식 노드는 자유 노드 리스트에서 제거하고, 새로 생성된 부모 노드는 리스트에 추가한다.

4) 반복: 위의 과정을 하나의 노드가 남을 때까지 반복한다.

5) 코드 할당: 최종적으로 생성된 트리에서 각 노드에 코드를 할당한다.

  • 왼쪽 자식 노드에는 0, 오른쪽 자식 노드에는 1을 할당한다.

이것을 예로 들어 다음이 있다고 하자. 다음과 같이 할 수 있다. 

1) 초기화

[100, 134, 70, 44, 50, 98]

 

2) 노드 결합

가장 작은 2개 선택

44(왼쪽)+50(오른쪽) = 94 (부모 노드)

이제 리스트에서 44와 50은 제거되고, 새로운 부모 노드가 추가된다.

[100, 134, 70, 94, 98]

 

3) 노드 갱신

다시 두 개의 가장 작은 노드를 선택하여 결합한다. 

70과 94를 결합하여 부모 노드를 만든다.

70(왼쪽) + 94(오른쪽) = 164(부모 노드)

[100, 134, 98, 164]

 

4) 반복

[198, 134, 164]

[298, 198]

[496]

 

5) 트리 만들기 

왼쪽 자식은 0, 오른쪽 자식은 1을 할당

 

6) 결과

134: 00

100: 10

98: 11

70: 010

44: 0110

50: 0111

 

이 과정을 통해 빈도수가 높은 데이터에는 짧은 코드, 빈도수가 낮은 데이터에는 긴 코드가 할당되어 데이터를 효율적으로 압축할 수 있다.

 

3.2. JPEG

위에서 설명한 허프만 코딩 알고리즘을 활용한 압축 방식은 우리가 일상적으로 사용하는 JPG 파일 포맷에서도 적용된다. JPEG는 이미지 압축에서 매우 널리 사용되는 형식으로, 압축 효율을 높이기 위해 인간의 시각적 특성을 고려한 방법을 채택했다.

 

특히, 인간은 밝기 변화에 민감하지만 색상 변화에는 상대적으로 덜 민감하다는 점을 반영하여, 밝기 정보를 더 많이 유지하고 컬러 정보는 상대적으로 더 많이 제거하는 방식으로 압축을 진행한다. 이를 통해 이미지 품질을 크게 손상시키지 않으면서 파일 크기를 크게 줄일 수 있다.

 

이러한 jpeg는 흑뱍 또는 컬러 사진의 압축에 적합하며 여러가지 압축 모드를 제공한다.(순차적 인코딩, 점진적 인코딩, 무손실 인코딩, 계층적 인코딩) 결과 영상의 화질에 대한 수준(Q인자)을 지정하여 압축한다. 

 

이것은 다음과 같은 방법으로 이를 가능하게 한다.

 

( )
1) RGB YCbCr(Y=/ CbCr=)
2) ( )
3) 8x8 DCT(Discrete Cosine Transform) 행 (주파수 공간으로 변환)
4) DCT 화 (DCT계수 있음)
5) DCT

3.3. jpeg 파일 읽기


1) ->
2) -> 
3)
4) DCT
5)

반응형