JPEG 압축과정
- 사람의 시각적특성을 이용하여 Color Sampling 과 주파수 계수 양자화 과정에서 정보를 손실하면서도 화질을 유지하는 손실 압축을함
- 이후 허프만 코딩으로 확률에 기반한 엔트로피 코딩을 무손실 압축을 하여 압축성능을 높임
- 사람의 눈은 색보다 명암에 훨씬 더 많은 정보를 처리함
RGB to YCbCr 변환
- Color Space Transform (RGB to YCrCb)
- Y(빛의 밝기), Cr(Chrominace Red: 적색), Cb(Chrominace Blue: 청색)
- Cr 과 Cb를 버려도 사람의 눈이 보는 화질에는 영향이 그다지 없음
- Y` = (Kr * R`) + (Kg * G`) + (Kb * B`)
- kr 0.299
- kg 0.587
- kb 0.114
- 사람 명암에 대한 반응
- 녹색(0.5) > 적색(0.3) > 청색(0.1)
- 사람 명암에 대한 반응
- R`,G`,B` 은 센서에 들어온 R,G,B 빛의 세기를 사람의 빛의 세기에 대한 시작 특성에 맞추어 감마를 정정한것 (0~1.0) 의 값으로 신호의 세기 표현
- (R,G,B) 가 (255,0,0) 을 갖는 빨간 픽셀을 (Y,Cb,Cr)로 변환
- Y = (Kr * R) + (Kb * B) + (Bg * G)
- Cb = 128 - () - () + ()
- Cr = 128 + () - () - ()
세부 변환 과정
- YBR = (Y`, Pb, Pr) 로 구성된 벡터
- RGB = (R`, G`, B`) 로 구성된 벡터
- M = RGB 벡터를 YBR벡터로 변환하는 과정
- YBR = M X RGB
- M = 역행렬 M-1 존재
- M^-1 X YBR = M^-1 X M X RGB
- RGB = M^-1 X YBR
- RGB -> YCrCb → RGB
- Y, Cb, Cr 값을 만들때 Floor 연산을 사용해서 0~255까지의 정수로 만들면서 정확도가 손상됨
Color down sampling
- a:b:c
- a = Y Total Horizontal Sampling 수
- b = Cr, Cb 1st Row Sampling 수
- c = Cr, Cb 2nd Row Sampling Change 수
- 흑백영상에서는 화질의 저하를 볼 수 있지만, 컬러영상에서 화질의 차이가 크지 않기 때문에 subsampling 하여 압축을 함
- Cr, Cb = 수평, 수직방향으로 2배가 감소함
- 이후로는 8 * 8 블록 단위로 처리가 됨
- 픽셀값은 영상의 밝기 값
- DCT
- 픽셀 정보를 주파수 정보로 변환하는 과정
DCT Transform
- 8 x 8 입력 픽셀 블럭 → dot product → (u, v) 8 x 8 kernel
- 벡터의 크기 = 각 노드의 제곱근을 전부더한후 square
- Kernel Vector = Unit Vector (크기가 1)
- 모든 두개의 Kernel Vector = Orthogonol
- Dot Product (V1, V2) = 0 ==> 직교
- 상관관계가 없다는 의미
- K1, K2 가 직교관계이기 때문에 각 값을 더해서 원래의 입력벡터를 구할 수 있음
- 다른 직교 transform 이랑 다른점은 Kernel vector들이 다양한 주파수를 나타내는 벡터들이라는 점
- 수평, 수직 주파수가 (0,0) 인 커널벡터의 패턴을 보면 값의 변화가 없음
- 컴퓨터에서 DCT 변환을 할 시에는 공식을 변환할때 마다 계산하는 것이 아닌 커널의 패턴을 미리 만들어서 저장해놓음
양자화
- 주파수 계수를 양자화 스텝 크기로 나누기 정수화 하는 과정
- JPEG 에서는 양자화 스텝 크기를 주파수별로 다르게 하는 Quantization Matrix 를 사용함
- 저주파 영역에서는 양자화 스텝 크기를 작게 해서 정보의 손실을 줄이고, 고주파 영역에서는 스텝 크기를 크게해서 정보의 손실을 크게함
- 양자화 하기전에 대부분의 영상에서는 고주파 영역의 계수들이 0근처의 값으로 매우 작아서 정보 손실이 거의 없음
ZigZag Scanning
- 8 * 8 크기의 양자화된 주파수 계수 블록 → (직렬화) → 양자화된 주파수 값이 0 인 고주파 계수들이 모두 마지막에 집중되도록 함
- 0 이 아닌 마지막 계수 이후에 0이 많으면 많을수록 압축이 많이 됨