본문 바로가기

디지털 사진 한 장에 대한 궁금증

3. 디지털 사진에서의 정보 압축

   



    디지털 사진에서 원본 비트맵이미지의 디지털 정보를 압축하는 원리는 크게 6단계로 이루어진다; RGB 데이타를 YCbCr 데이타로 변환, 샘플링, DCT(Discrete Cosine Transform) 이용한 노이즈 제거, 양자화(Quantization), 양자화된 데이타의 정렬, 인코딩.





샘플링 (sampling)



   JPEG 이미지 파일에서 YCbCr 컬러 모델을 이용하여 정보를 압축하는 원리는, 사람의 눈에 영향이 큰 Y값은 원본 값을 유지하면서, 영향이 작은 CbCr값은 샘플링하여 취함으로써 적은 수의 데이터로 원본 이미지와 비슷한 이미지로 표현할 수 있다. <그림 7>2048x1536 픽셀의 RGB 컬러 이미지를 YCbCr 컬러 모델로 변환하고 나서, Y 2048x1536 개의 값 모두를 이용하고, CbCr은 연속하는 2, 10, 20개의 정방데이터 중에서 첫 번째 값만 취함으로써 각각 1024x868, 204x153, 102x86개의 데이터만을 이용하여 표현한 것이다. 샘플링이 20인 경우에 경계선 근처에서 원본과 컬러가 다르게 보이고, 2, 10인 경우에는 원본의 컬러와 육안으로 구분이 어렵다.






 이렇게 CbCr 데이터를 샘플링하는 것을 채도 샘플링(chroma subsampling)이라 한다. 채도 샘플링에 대한 표기는 <그림 8>처럼 CbCr에 대한 X-축 및 Y-축의 샘플링 방법에 따라 4:1:1, 4:2:0, 4:2:2, 4:4:4, 4:4:0처럼 표현한다. Y는 샘플링하지 않는다[1]. JPEG은 주로 4:2:0을 채용한다.




  




 군더더기 정보의 제거 (DCT, Discrete Cosine Transform)




<그림 9>은 원본 이미지에서 Y-축으로 800번째(점선) 지점에서, Y, Cb Cr의 각 2,048개의 값에 대하여 그래프를 그린 것이다. 그래프에서 보듯이 Y, Cb, Cr은 연속적인 이산데이터이므로 데이터 여러 가지 디지털 데이터 처리기법을 적용할 수 있다








이미지 데이터의 압축을 위해서는 Y, Cb, Cr 각각의 그래프에서 최소의 데이터 량으로 그래프의 패턴은 최대한 유지하는 과정, , 사람의 눈으로 구분이 어려운 군더더기 컬러정보를 제거하는 과정이 필요하다. 이 과정은 디지털 필터를 이용하여 고주파 성분을 제거하는 방식과 비슷하지만, 필터링된 데이터의 크기가 원본 데이터의 크기보다 작을 수 있어야 한다는 점에서 일반적인 디지털 필터와는 다르다. 데이터의 크기를 줄이면서 군더더기 컬러정보를 제거하기 위하여 많이 사용하는 기법이 DCT(Discrete Cosine Transform)이다.  



DCT는 이미지 데이터에서 인간의 시각으로 인지 시스템에서 구분이 어려운 고주파(AC성분)을 필터링하여 최소화하고, 인간의 시각으로 구분이 가능한 컬러 정보, 즉 컬러 데이터의 패턴에 영향을 주는 주요 성분(DC성분과 저주파 성분)을 분리할 수 있다. DC성분은 전체 데이터의 평균 값을 의미한다. IDCT(Inverse Discrete Cosine Transform)을 이용하면 역으로 원본과 비슷한 데이터로 복원시킬 수 있다.



DCT는 푸리에 변환과 비슷한 원리로 구성되며, 이산 데이터를 주파수 성분 별 크기로 변환해준다. 1차원 데이터는 ( 3)과 같이 정의된다.  



IDCT ( 4)와 정의되고, 변환된 데이터는 원본 데이터와 동일한 데이터 수를 가진다.



<그림 10>은 셈플 데이터를 이용하여 DCT 변환과 IDCT 역변환의 예를 보여준다. 원본 데이터에서 8개 샘플 주기가 있는 데, 6번째 DCT변환 계수가 가장 큰 값을 보여주는 데, ( 3)에서 i=6을 대입하면 N=20이기 때문에 이때의 주파수는 5/40=1/8이고, 주기는 8이 된다.



이 결과는 원본 데이터에서 사인파 성분의 주기가 8인 것과 일치한다. 변환 계수 X를 보면, 8~20번째 계수의 값은 거의 0이기 때문에, 원본 데이터에서 대부분의 주파수 성분은 DCT 변환계수에서 1~7번째에서 포함하고 있음을 내포한다. 이는 DCT 변환계수로부터 원본 데이터를 복원하는 데 있어서 DCT계수의 1~7번째 값만을 이용해도 충분히 가능하다는 의미이다.

 






<그림 11>( 4)을 이용하여 역변환으로 실제 원본 데이터를 복원하는 예를 보여준다. 첫 번째 그래프는 역변환 시에 DCT변환 계수 중에서 첫 번째 값만을 이용하여 복원하고, 두 번째 그래프는 역변환 시에 1~2번째 DCT 변환계수, 여덟 번째 그래프는 1~8번 번째 DCT 변환 계수를 이용하여 복원한 것이다. DCT 역변환 시에 사용하지 않는 DCT변환 계수는 모두 0으로 대체한다. 역변환 결과를 보면 7번째 주파수 성분까지만을 이용하더라도 원본 데이터에 근사하게 복원할 수 있음을 보여준다. 이로부터 원본 데이터의 수는 20개였지만, DCT변환을 이용하면 7개의 데이터, 35% 수준으로 압축할 수 있음을 알 수 있다.







<그림 12>는 데이터의 크기가 2,048바이트인 ‘P1010194.jpg’Y값에 DCT 변환을 적용한 결과이다. 역변환 시에 1~100번째의 변환계수만을 이용하는 경우에는 원본 데이터가 제대로 복원되지 않고, 1~600번째의 변환계수를 이용하여 복원하면 원본 데이터에 거의 가까운 패턴을 볼 수 있다. DCT 변환은 디지털 필터의 역할을 하면서 고주파 성분을 제거함으로써 2,048바이트의 정보를 600바이트로 압축할 수 있다는 의미이다.

 





JPEG에서는 이미지 데이터를 8x8 픽셀로 이루어지는 블록으로 나누고, 각 블록에서의 YCbCr 데이터에 대하여 2차원 DCT변환을 이용하여 데이터를 압축하고 2차원 역변환을 이용하여 복원한다. 2차원 DCTIDCT (5) ( 6)으로 정의된다.










양자화 (quantization)

 



   <그림 11> <그림 12>의 예에서 보았듯이, DCT변환 후에 정보의 압축을 위해서 영향도가 적은 고주파에 해당하는 DCT 변환 계수의 값들을 0으로 대체하였다. <그림 12>의 예에서는 DCF 계수 그래프를 보면서 영향이 많은 주파수 성분까지를 100번째까지와 600번째까지로 주관적으로 판단하여 분리하였지만, JPEG 파일에서는 양자화라는 과정을 통하여 0으로 대체할 DCT 변환 계수 값들을 지정한다.  JPEG 파일을 구성할 때는 8x8(64)픽셀로 구성되는 각 이미지 블록의 DCF 계수 값에서 영향도가 적은 고주파 계수 값들을 0으로 대체한다. 양자화를 위해서는 DCT 계수 값들을 양자화 상수로 나눈 결과에서 가장 가까운 정수 값을 취한다. 하나의 블록에서의 양자화 상수는 통상 다음과 같은 값들이 이용되지만, 디지털 카메라는 메이커별로 다른 값을 사용한다.



 

1

2

3

4

5

6

7

8

 

 

1

2

3

4

5

6

7

8

1

16

11

10

16

24

40

51

61

 

1

6

4

4

6

10

16

20

24

 

2

12

12

14

19

26

58

60

55

 

2

5

5

6

8

10

23

24

22

 

3

14

13

16

24

40

57

69

56

 

3

6

5

6

10

16

23

28

22

 

4

14

17

22

29

51

87

80

62

 

4

6

7

9

12

20

35

32

25

 

5

18

22

37

56

68

109

103

77

 

5

7

9

15

22

27

44

41

31

 

6

24

35

55

64

81

104

113

92

 

6

10

14

22

26

32

42

45

37

 

7

49

64

78

87

103

121

120

101

 

7

20

26

31

35

41

48

48

40

 

8

72

92

95

98

112

100

103

99

 

8

29

37

38

39

45

40

41

40

 

 

Y성분의 양자화 상수

 

Cb, Cr 성분의 양자화 상수

 

              <2> 양자화 상수

                   




양자화 상수 값이 크면 작은 DCT계수에 대한 양자화 계수 값이 0이 되기 때문에 저주파 성분까지 제거되고, 데이터의 압축률도 높아진다. 데이터 복원 시에 DCT 계수는 양자화 계수로부터 다음과 같이 역순서로 계산한다.


    



양자화하고 이미지 데이터를 복원하는 예를 보자. <그림 13>에서 작은 박스는8x8 펙셀로 구성된 첫 번째 블록이고, 이 블록에서의 Y값이 행렬형태로 표현되었다. Y값을 DCT변환(DCT_Y)하고, 양자화 상수(Q_Y)로 나누어 양자화(DCT_Y_Q)하고 DCT 계수를 복원할 수 있다(DCT_YY).
















<그림 16>에서 DCT_YYDCT역변환(YY)하고 원본 데이터(Y)와 비교해 보면 원본 휘도(Y)와 복원된 휘도(YY)의 차이가 크지 않고 비슷하다JPEG파일에서 양자화 계수 값들은 zig-zag순서로 저장된다. 이는 비슷한 주파수 계수들끼리 정렬되도록 하여 인코딩을 수월하게 하는 목적이다. DCT_Y_Q 데이터를 zig-zag로 읽으면 다음과 같이 된다.



DCT_Y_Q = [ 58, 10, -1, -3, 7, 26, 8, -4, 5, 0, 0, -3, 0, 1, 5, 6, 1, 0, 2, -1, -1, 0, 1, 0,1, 0, -1, 2, 2, -1, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

 

 








인코딩 (encoding)

 

 


JPEG에서는 이미지 데이타를 8x8 픽셀로 이루어지는 블록으로 나누고, 각 블록에서 정보의 압축과 복원이 이루어진다. 8x8 픽셀로 구성되는 하나의 이미지 블록 데이터가 YCbCr 컬러모델 변환채도 샘플링, DCT 변환그리고 양자화를 거치고 나더라도 픽셀 하나당 Y, Cb, Cr에 각각 1바이트씩 할당되므로 하나의 블록 데이터를 표현하기 위해서는 아직 64*3=192바이트가 필요하다이 192바이트에 포함된 정보에서 중복 정보와 군더더기 정보를 압축하고 제거하여 표현함으로써 이미지 데이터 용량을 줄일 수 있도록 인코딩해야 한다. JPEC파일에서 가장 많이 채용되는 인코딩 방식은 Huffman coding이다.



ASCII 코딩인 경우에 모든 문자는 동등하게 하나의 바이트로 표현되는 데이러한 코딩을 고정길이 인코딩(fixed-length encoding)이라 한다반면에 모르스 부호는 영어 알파벳을 4개의 코드로 표현하는 데자주 사용되는 문자일수록 숫자가 적고 단순한 코드 조합으로 표현하고 자주 사용되지 않는 문자일수록 많고 복잡한 코드 조합으로 구성된다. <표 3>은 성경책에 나오는 알파벳 문자의 빈도 수를 정규화시킨 것이고, <표 4>는 모르스 부호이다.











   Huffman coding은 모르스 부호와 비슷하게 데이터의 심벌들을 나타내기 위한 비트의 수를 가변 길이의 코드로 표현한다빈도 수가 많은 심벌은 코드 수를 작게 하고빈도 수가 적은 심벌은 코드 수를 길게 하는 것이다예를 들어, 28개의 문자로 구성되어 있는 영어문장을 Huffman coding으로 표현하는 방법을 살펴보자.



          A MAN A PLAN A CANAL PANAMA



Huffman coding은 다음의 단계로 수행된다.




단계1) 각 심벌들의 빈도수를 구한다.

     


   



단계 2) 빈도 수가 가장 적은 두 개의 심벌간에 트리 노드를 구성하고트리 노드를 구성한 두 심벌의 빈도 수를 더한다.  이 과정을 반복한다.





단계 3) 트리에서 가지의 왼쪽에는 이진수 ‘0’, 오른쪽에는 ‘1’을 기입한다.






단계4) 위에서 밑으로 가지를 따라가면서 이진수 ‘0’ 또는 ‘1’를 나열한다.




이런 과정을 거치면 빈도 수가 가장 큰 ‘A’는 1 bit로 코딩되고빈도수가 가장 적은 ‘C’ 4 bit로 코딩된다.  총 코드 크기는 68 bit로 원본 데이터 216bit 31%로 압축된다. <표 5>은 각 심벌의 coding을 정리한 사전이다이 사전을 이용하여 원본 정보를 인코딩하면 다음과 같다.




    인코딩 결과: 1 000 0011 1 010 000 1 000 0010 0 110 1 010 000 1 000 0111 1 010 1 0110 000 0010 1 010 1 0011 1

    8bit단위로 표시:    1000 0011 10100001 00000100 11010100 0010000 11110101 01100000 01010101 00111000

    16진수로 표시:   0x83 0xA1 0x04 0xD4 0x20 0xF5 0xA0 0x55 0x38




마지막 3bit는 8bit단위로 만들어 주기 위한 더미(dummy)데이터로 실제로 활용할 때는 총 데이터 비트의 길이 정보를 포함하여 더미 데이터를 제외하여 인코딩하면 된다. JPEG 파일에서 0xFF는 특수 목적의 마커 또는 2바이트의 정보를 표현할 사용하기 때문에 심벌을 인코딩 할 때는 0xFF를 사용하지 않는다.



<그림 13>의 첫 번째 이미지 블록(8x8 픽셀, 512byte))을 양자화한 데이터(DCT_Y_Q)를 Huffman coding을 이용하여 인코딩하면 145bit(=9byte, 7bit는 더미로 추가)로 표현이 가능하고 1.8%로 정보를

압축할 수 있다.




DCT_Y_Q = [ 58, 10, -1, -3, 7, 26, 8, -4, 5, 0, 0, -3, 0, 1, 5, 6, 1, 0, 2, -1, -1, 0, 1, 0,1, 0, -1, 2, 2, -1, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]










이미지 정보의 압축 인코딩 절차

 



 지금까지 살펴본 RGB 데이터로부터 이미지 압축파일인JPEG을 만들기 위한 정보 인코딩 과정은 <그림 19>과 같이 정리된다역의 과정을 거쳐 디코딩하면 JPEG 이미지로부터 원본과 근사한 RGB데이터를 얻을 수 있다.

 









[1] https://en.wikipedia.org/wiki/Chroma_subsampling