SYDLAB_inha/AI semiconductor

AI.semi - JPEG 압축 알고리즘

빈그레 2023. 10. 24. 23:27

 

 


JPEG 압축 알고리즘

 

 

 

 

 

 

 

What's JPEG 

 

: Joint Picture Expert Group의 약어로 bitmap 방식의 이미지 압축 표준 중 하나이다.

 

*** Bitmap : 그래픽 디자인 및 이미지 처리에서 사용되는 파일 형식응로, 이미지를 픽셀 단위로 표현하는 이미지 파일 형식을 의미한다. bitmap이미지는 이미지를 작은 정사각형 영역인 픽셀로 나누어 각 픽셀의 색상 정보를 저장하는 방식으로 구성된다.

 

JPEG은 손실 압축 기법을 사용하는 알고리즘이며, 손실의 정도를 압축 매개변수를 이용해 조정할 수 있다.

압축률이 높아질수록 손실이 심하고, 이미지 품질이 떨어진다.

 

 

 

 

JPEG 압축 알고리즘

 

1. 이미지 준비 (Sampling & Quantization )

: 아날로그 이미지에 대해 Sampling 및 Quantization을 수행하여 디지털 이미지로 변환한다.


- Sampling (표본화)
 : 이미지를 작은 단위로 분할하는 프로세스로, 2차원의 이미지의 x축과 y축을 일정한 표본으로 나누는 것이다.
인쇄 출력용 단위는 DPI(Dots per inch), 모니터 출력용 단위로는 PPI ( Pixel per Inch)를 사용한다.
흔히 말하는 해상도가 표본화의 결과이다.


이렇게 나뉘어진 각각의 pixel은 색정보를 가지고있다. 연속된 빛의 파장을 이산 값으로 변환하기 위해서는 양자화를 해야한다.


- Quantization (양자화)
: 연속적인 색상이나 강도를 갖는 값을 특정 수준의 이산적인 값으로 나타내는 프로세스를 나타낸다. 



이미지의 경우 보통 1bit,8bit,24bit로 양자화한다.
각 sub pixel은 8bit의 gray scale을 가지며 RGB sub pixel이 각각 8bit 가 할당되어, 한 pixel안에에서 총 24bit로 color가 표현되므로 2^24가지 색상을 표현할 수 있다. 표현은 할 수 있으나, 색상 표현에 24비트까지 할당할 필요가 없다고 생각하여 확률적으로 가장 많이 사용되는 256개의 RGB 조합을 선정하여 구성한 8bit color map 규격이 사용되기도 한다.

 

 

2.색 공간 변환 ( RGB -> YCbCr )

: sampling과 quantization으로 디지털 이미지가 준비되었다면 RGB로 양자화된 색 공간을 YCbCr 색 공간으로 변환한다.  

Y 밝기 정보 표현
CbCr 색상 정보 표현
색 공간을 YCbCr방식으로 변환하는 이유는 1차적인 압축을 하기 위해서이다. 
사람의 눈은 색상보다는 밝기에 훨씬 민감하다. 따라서 밝기 정보를 가지는 Y성분은 유지하고, 색상 정보를 가지는 Cb*Cr  성분은 줄여서 압축을 한다. 

- Downsampling (다운 샘플링)
 : 이미지 해상도를 감소시켜 픽셀의 수를 줄이는 과정으로, 주로 밝기 정보는 유지하면서 이미지를 축소시킨다.

*** chrominance sample : 크로마 정보 (색상 정보)를 표현하는 단위


먼저, 이미지에 대해 인접한 픽셀끼리 그룹화하여 각 그룹에서 픽셀 값들의 평균을 계산하여 그룹의 대표값을 얻는다. 여기서 Y성분은 다운 샘플링 하지 않으며, CbCr 성분에 대해서만 다운 샘플링을 수행한다.

그렇게 얻어진 각 그룹의 대표값으로 새로운 이미지를 생성하며, 그룹화되지 못한 나머지 픽셀들은 다음 단계로 진행하기 전에 제거된다. 다음 과정을 반복하며 이미지를 계속해서 축소하며 해상도를 낮추고 파일 크기를 줄이게 된다. 

- Chroma subsampling ( 크로마 서브샘플링 ) 
 : 이미지의 색상 정보를 효과적으로 압축하여 저장하는 방법으로, 주로 UV 성분을 줄여 파일 크기를 감소시킨다.


일반적으로 JPEG 이미지에서는 4:4:4, 4:2:2, 4:2:0 비율로 다운샘플링을 구행하며 주로 4:2:0 방식이 사용된다.
여기서의 3개의 숫자는 Y,U,V 성분의 샘플링 비율을 나타낸다.

첫 번째 숫자 (Y) Y 성분은 밝기 정보를 나타낸다.
두 번째 숫자 (U) U 성분은 파란색 차이 (blue-difference)를 나타낸다.
ex) 4:2:0에서 수평 방향으로 색상 정보를 절반으로 줄인 것을 의미한다.
세 번째 숫자 (V) V 성분은 빨간색 차이 (red- difference)를 나타낸다.
ex)  4:2:0에서 수직 방향으로 색상 정보를 모두 버린 것을 의미한다.
what...? 잘 모르겟음,,,,일단 넘어가,,

암튼..! YUV 색상 공간에서는 Y channel은 유지하면서 U와 V channel을 서브샘플링하여 정보를 줄여나간다.

 

 

3. Block Splitting (8x8)

: 각각 matrix의 형태로 존재하는 Y,U,V channel에 대하여, Y channel은 8x8 블럭으로, CbCr channel은 다운 샘플링 방식에 따라 8x8 (4:4:4), 16x8(4:2:2), 16x16(4:2:0)으로 분할한다. 이를 marco block이라 한다.

 

***채널 : 보통 컬러 이미지에서는 RGB 세 가지 채널이 존재하나, 여기에서는 Y,U,V 세 가지 채널이 존재

 

(4:4:4) Y,U,V 모두 동일한 해상도를 사용
(4:2:2) 수평 방향으로만 U와 V를 줄임
(4:2:0) 수평 및 수직 방향으로 U와 V를 줄임

 

 

4.DCT (Discrete Cosine Transform) - 이산 코사인 변환

: 이미지에서 저주파 성분과 고주파 성분을 분리하기 위해서는 직교 변환이 필요하다.

   직교 변환을 하는 방법 중  DCT방법이 가장 많이 사용된다.

 

 

*** 직교 변환 : 이미지를 공간 영역에서 주파수 영역으로 변환하는 것

각각의 8x8 블럭에 DCT 변환을 수행하면 공간 영역(Spatial Domain)에서 주파수 영역 (Frequency Domain)을 변하며 좌측 상단에 저주파 성분이 배치되고, 우측 하단에 고주파 성분이 배치된다.

DCT 변환식

각 블럭의 64개의 값이 DCT 변환식을 거치면 64개의 DCT 계수를 얻게 된다. 

DC 계수 DCT 계수 중 가장 처음 얻는 값인 0차 계수 (0,0)으로 다른 계수들과 달리 코사인 함수가 아니다.
해당 블록 전체의 명도를 결정하는 평균 색상 값을 가진다.
AC 계수 나머지 63개의 값


대부분의 이미지의 경우 인접한 픽셀은 거의 비슷한 색상으로 형성되어 있으므로, (0,0)에 위치하는 DC 성분에 값이 집중된다. 따라서 평균값과 비슷한 성분 (저주파)이 DC 근처인 좌측 상단에 몰리게 되며, 평균값과 차이가 많이 나는 성분인 고주파 성분들은 DC와 멀어져 우측 하단에 배치된다.

 

 

5. 양자화 수행 (Quantization)

: 고주파 성분을 제거하기 위한 방법이다. 주파수 영역의 각 계쑤에 대해 양자화 행렬 (Qautization table)의 상수로 나눈 후 반올림한다.

 


전체적으로 저주파 성분이 모여있는 좌측 상단은 유지해야 하는 값이므로 작은 값으로 나누고, 고주파 성분이 위치한 우측 하단 줄여야 하는 부분이므로 큰 값으로 나눈다. 일반적으로 사용되는 양자화 행렬은 위와 같다.

압축률을 높이고 싶다면 양자화 테이블의 값을 더욱 크게 하면 되고, 압축률을 줄이는 대신 이미지 품질을 높이고 싶다면 양자화 테이블 값을 줄이면 된다.


DCT 계수 블록에 양자화를 구행하면 다음과 같다. 일반적으로 많은 고주파 성분들이 0으로 반올림되었음을 확인할 수 있다. 대부분의 나머지 성분 또한 작은 양수 또는 음수가 되었기 때문에 표현하는데 이전보다 훨씬 적은 비트가 사용된다.

 

 

6. Entropy Coding

: 모든 블록이 양자화 과정까지 마쳤다면 이 양자화된 DCT 계수들을 압축하기 위한 단계가 남아있다.

이 때, DC 계수와 AC 계수의 압축 방법이 다르다.

 

- DC 계수
: 이전 block의 DC 계수와 현재 block의 DC 계수 간의 차분으로 encoding한다.
즉, 일반적이 이미지에서 인접한 픽셀은 거의 비슷한 색상으로 구성되어 있다고 하였다. (DCT 부분)
인접한 블록의 DC 계수 또한 비슷할 것이며,  이전 block의 DC 계수로부터 현재 block의 DC 계수를 예측할 수 있다. 따라서 기준 표본 값과 예측값의 차이를 저장하는 방식의 압축 알고리즘인 DPCM(different PCM)이 사용되는 것이다.

***  DPCM ( Differential Pulse Code Modulation )
: 시간적 또는 공간적으로 연속적인 데이터를 압축하기 위한 encoidng 기술 중 하나이다.
간단하게 말하면, 인접한 샘플 간의 차이를 인코딩하는 것이다. 현재 샘플과 이전 샘플 간의 차이를  계산하여 그 차이를 인코딩 (부호화)한다.



-AC 계수
: block 내의 63개의 값으로 인코딩한다. 이때 zigzag scanning 기법이 사용된다.
*** zigzag scanning :  아래 그림과 같이 8x8 행렬을 지그재그로 읽어 일차원 배열로 나열하는 것이다.


quantizaiotn 된 행렬의 우측 하단에는 0이 많기 때문에 이를 효율적으로 저장하기 위함이다.