본문 바로가기
IT 개인학습/Memo

이미지 및 영상 압축 방식

by kiimy 2022. 9. 4.
728x90

<이미지>

" 사진(이미지) = (가로 * 세로)를 가득 메우고 있는 점 Pixel들이 모여있는 것  "

사진의 한 점 한 점마다 어떤 색에 해당되는지를 색깔에 대응되는 숫자로 기록해두면 사진을 볼 때는

역으로 그 숫자들을 읽어 대응되는 색들을 한 점 한 점 화면에 표현해주는 것

 

RGB Color Space

원본 사진 파일은 사진을 이루는 각 점들의 정보를 RGB 각각 나누어 저장한다.

R 0 - 255 (각각 256단계 1Byte = 8bits로 표현)

G 0 - 255

B 0 - 255

한 점마다 24bits, 즉 3Byte가 필요한 것
예) 6936 * 9248(64,144,128 Pixel)크기의 사진이 있다면 원본 사진의 용량을 계산한다면 * 3Byte = 약 184MB

하지만 이미지 저장시 파일 크기를 보면 약 1/10로 줄어든 상태를 확인할 수 있다

 

JPG파일은 JPEG Joint Photographic Experts Group 표준에 따라 만들어진다.

표준 적용 방식에 따라 JPG JPEG JIF 다양한 형태로 사용되고 있다.

 

여기서 원본의 품질을 줄이게 된다면 1% 수준까지도 파일 크기를 줄일 수 있다.

 

인간의 눈이 빛을 감지하는 곳은 
밝기를 감지하는 곳(간상체)과 색변화를 감지하는 곳(추상체) 이루어져 있다.

LG OLED = 자체발광하는 소자를 사용하여 TV에 밝기에 신경 쓴 모델
일반 LCD TV보다도 선명한 화질을 보여주는 건 인간의 눈이 색보다는 밝기에 더욱 예민하게 반응하기 때문이다.
실제로 색의 차이는 크게 구별할 수 없지만 밝기만 조금 바뀌어도 무엇인가 변했다는 것을 알아차린다.

 

JPEG 표준

- 손실 압축의 대표적 표준

- RGB로 표현했던 사진의 점들(Pixel)을 YCbCr

Y - 사진의 밝기 Luminance

Cb - 파란색(= 밝기 정보 Y와 대비했을 때의 색의 차이 즉, 색차 Chrominace 정보로 바꾸어 저장)

Cr - 빨간색(= 밝기 정보 Y와 대비했을 때의 색의 차이 즉, 색차 Chrominace 정보로 바꾸어 저장)

원래 RGB정보를 YCbCr로 변환하면(= 정보 단축)

- 흑백 사진 - Y 정보만 보내면 됨

- G = Cb + Cr 

But, 이렇게만 보낸다면 RGB와 마찬가지로 한 점당 똑같이 3Byte(YCbCr)를 쓴다.
우리 눈은 밝기에 예민하면서 색의 차이는 둔감하다.
그래서 파란색과 빨간색의 색차 정보인 Cb, Cr을 줄여서 보내게함
= 원본의 색차 정보를 잃어버리게 되겠지만 사람이 느끼는 전체 사진 품질에는 크게 차이가 없다 
= Chroma Down-Sampling(Sub-Sampling)

 

압축 1단계 Chroma Down-Sampling(Sub-Sampling)

- 색차 정보를 활용하여 압축하는 방식

- 색차 정보를 어떤 비율로 줄일지, 어떤 정보를 선택적으로 줄이냐에 따라 YCbCr기준에서 줄일 수 있는 양이 달라지게 된다.

Y Cb Cr

2단계 DCT Discrete Cosine Transform(이산 코사인 변환)

그림을 그릴 때 바탕이 되는 널찍한 부분을 먼저 과감하게 색칠한 뒤 
아주 세밀한 부분들은 마지막에 심혈을 기울여 붓 터치를 하게 된다.
다시 말해 붓으로 넓게 칠하는 부분들과 그 크기가 점점 작아지며 세밀하게 칠해지는 부분들의 여러 겹으로 표현할 수 있다.

사진(이미지) 역시 전체적인 색감이 어떤지부터 디테일한 부분이 어떻게 생겨먹었는지를 
여러 겹의 그림이 겹쳐진 형태로 표현할 수가 있다.

YCbCr변환, DCT적용

YCbCr로 변환된 사진에 DCT를 적용하면 사진 자체의 특성을 낮은 주파수에서 높은 주파수 성분으로 분해해서 나타낼 수 있다.

경계부분

물리적으로는 각 점과 점들을 살펴 보았을 때 갑자기 변하는 경계부분이 얼마나 자주 나타나는지를 표현할 수가 있다.

= 일반적으로 사진에서 인접한 점들끼리는 비슷한 색상인 경우가 많다.

인접한 점들끼리는 비슷한 색상

JPEG에서는 전체사진을 8*8 조각으로 나누어서 가로 세로로 (2차원) DCT를 통해 변환한다.

웬만한 굵직굵직한 중요 정보들이 저주파 축에 해당하는 왼쪽 위로 몰려들게 된다.

*저주파 = 부드러운 성분
*고주파 = 픽셀 값이 급격하게 바뀌는 성분, 디테일한 부분의 정보

왼쪽 윗 부분은 원본 8*8 부분 색의 평균 색상 값(저주파), 오른쪽 아랫 부분(고주파)

- 나머지 부분은 평균 색상과의 차이 값을 기록

높은 주파수 제거= 양자화 Quantization

- 사람의 눈은 작은 점들 사이에서의 세밀한 변화에는 둔감하다.= 높은 주파수에 해당하는 부분을 제거

= 제거하는 것이 아니라 어떤 값(= 고주파)으로 나눈 후 저정하는 방식

How 제거???

양자화 Quantization

- 어떤 값으로 밝기(Y), 색차 정보(Chrominace)를 나누고 매칭되는 구간의 정보를 데이터로 저장하는 것

어떤 값??

양자화 행렬

- 고주파에 해당하는 부분들은 상대적으로 높은 값을 가지고 있다.

- So, 높은 값으로 나눈 값들 대부분이 0이 되버린다.

 

3단계 저장

- JPEG에서 양자화를 통해 바뀐 사진 정보들 중 중복된 숫자들이 있다면 하나하나 다 저장하는 것이 아니라

* "얘는 몇 개 있다"라고 하거나

* 자주 나오는 것들은 1bit으로만 표현하고

* 잘 나오지 않는 것들은 좀 더 많은 bit으로 표현하기로 약속한다면 또 한 번 압축을 할 수 있다.

 

지그재그 스캔

지그재그 스캔을 통해 숫자 나열 =  -26 -3, 0, -3 ...... 0, 0, 0, 0
"얘는 몇개 있다"
==> 끝부분으로 갈수록 0이 엄청나게 나열되는 걸 알 수 있다.
그러면 굳이 0을 매번 저장해둘 필요가 없이 앞으로 0이 몇 개가 나올지 만을 저장함으로써 압축할 수 있다.

"자주 나온 것들"
-1, -3, 1, 2 == 짧은 bit

"잘 안나오는 것들"
-26, -6, 5 == 긴 bit

8글자

 

4단계 허프만 코딩 Huffman Coding

- 통계적인 중복성을 활용하여 압축

 

<정리>JPEG 압축

1. YCbCr 변환 후 8*8 크기의 작은 사진들로 다 쪼갠 뒤 각각의 조각들이 밑에 모든 과정을 거침

2. DCT 적용

3. 양자화

4. 허프만 코딩

JPEG파일을 읽을때는 정반대로 하나하나 복호하게 되면서 원본 사진을 다시 되살리며 나타남

 

<동영상>

" 우리가 영상을 본다는 건 여러 개의 사진을 빠르게 보여주는 것이다. "

이러한 태생적인 이유 때문에 영상이 길어지면 길어질수록 영사기 필름의 길이가 점점 길어짐
= 엄청난 용량을 가지게 된다
예시)
해상도 1280*720
30frame/초 (= 1초에 30개의 장면이 담겨있고)
각 장면의 1280*720개의 점들마다 3Byte가 사용된다고 하면 
1초 짜리 동영상의 용량 = (1280 * 720 * 3Byte) * 30 frame/초 = 79MB

MPEG Moving Picture Experts Group 표준

- 국제 동영상 압축 표준

- 동영상을 구성하고 있는 장면(시간에 따라 변화하는 장면)하나하나를 JPEG에서 이미지를 압축하는 방식으로 압축하게 됨

 1초에 수십 개의 장면이 지나가지만 실제 한 장면씩 보면 별로 바뀌지 않은 부분,
즉, 이전 장면과 이후 장면에서 똑같은 정보들이 굉장히 많음= 대부분 픽셀 값이 달라지지 않는 점을 활용

 

1. 첫 번째 장면과 두 번째 장면을 보고 이 둘 사이의 차이를 확인하기 위해 16 * 16으로 나눈다.

2. 나눠진 블록 단위로 하나하나 비교해보면서 두 장면 사이에 어떤 물체가 어떤 방향에 따라 어느 위치로 이동했는지 움직임을 기록하게 된다 = 움직임 벡터 Motion Vector

Motion Vector
Motion Vector를 따라 첫 번째 벡터의 많은 정보를 그대로 가져올 수 있음

YouTube를 보는데 통신 속도가 느려서 이런 방식(Motion Vector)으로 압축된 영상을 제대로 복원해내지 못한다고 하면 영상의 일부분만 일그러져 이상하게 나오는 이유가 장면들끼리 움직임에 따라 정보를 공유하고 있기 때문이다. 

차이가 있는 부분만 계산

움직임이 일어난 부분은 첫 번째 장면과의 차이 값만을 저장하면서 굉장히 많은 정보를 줄여서 저장할 수 있음

 

<압축>

기준이 되는 첫 번째 장면(Intra Frame, I-Frame)을 저장해두고

시간이 흐른뒤 예측된 장면(Predictive Frame, P-Frame)을 만들어낸다

과거와 미래를 모두 알고 있게 된다면 ,이전 장면(I-Frame)과 이후 장면(P-Frame)에서 변하는 부분만 저장

 

기준이 되는 I-Frame 수가 적으면 압축은 둘째치고 우리가 영상을 중간에 재생시켜 하려고 해도 기준이 되는 I-Frame까지 다 읽어들여야 하기에 버퍼링이 한참 걸리게 된다. = GOP

GOP, Group of Pictures

- 언제든지 어떤 곳이든지 빠르게 재생시킬 수 있다.

- 기준이 되는 I-Frame을 주기적을 넣는 구조를 가지고 있음

https://www.youtube.com/playlist?list=PLH3j6V0I2cbnpiYpxfqSjsOymUP_OL9Tp 

 

그래픽스 / 코덱 / 신호처리

MPEG, MP3, JPEG, 렌더링 파이프라인, 쉐이딩, 그래픽스, Ray Tracing

www.youtube.com

 

728x90

'IT 개인학습 > Memo' 카테고리의 다른 글

Github, 유용한 윈도우 app  (0) 2023.06.23
Python 함수 주석  (0) 2022.08.29
if not 문  (0) 2022.08.15
프로세스 메모리 구조  (0) 2022.08.15
README template  (0) 2022.06.08

댓글