Search

JPEG와 PNG의 압축방식

JPEG
PNG
파일크기
비교적 작다
비교적 크다
압축방식
손실압축
비손실 압축
알파채널
X
O

JPEG의 파일처리 과정

JPEG는 간단히 말해 사람의 눈에 거슬리지 않을 정도로 원본을 훼손해 압축효과를 극대화시키는 알고리즘이다.
사람의 눈은 이미지의 전체적인 구조가 손실되는 것에는 민감하지만, 디테일한 부분이 바뀌는 것에는 비교적 둔감하다는 점을 활용
이미지의 전체적인 구조 : 저주파성분과 관련
이미지의 디테일한 부분 : 고주파성분과 관련
⇒ 고의적으로 고주파성분의 일부를 제거한다 !
RGB → YCbCr 색공간 변환
Y는 휘도 성분이며 Cb 와 Cr 은 색차 성분이다.
Cb=BY,Cr=RYCb = B - Y, \quad Cr = R - Y
ㅇ 인간시각 특징이, 컬러 보다휘도에 민감하므로,
휘도 성분(Y)을, 보다 세밀하게 고해상도로 표현하고
색차 성분(CbCr)은, 저해상도로 표현하면,
이때, YCbCr 방식은,RGB 표현 방식 보다,데이터 량을 줄일 수 있음
따라서 밝기정보보다 색상정보를 더 많이 압축하기 위해 색공간 변환을 했다고 할 수 있다
Downsampling or Subsampling
보통의 subsampling 전략은 J : a : b의 비율로 표현된다
J : sampling을 실행할 픽셀블럭의 너비 ( 픽셀블럭의 높이는 2로 정해져있다 )
a : j 픽셀들의 첫번째 행에서 추출한 샘플들의 갯수
b : j 픽셀들의 두번째 행에서 추출된 샘플들의 갯수
사진을 보면 더 쉽게 이해할 수 있다.
주의할 점은 Y값은 subsampling하지 않는다는 것이다!
JPEG에서는 주로 4:2:0 방식을 사용한다
4:2:0으로 Cb, Cr성분을 subsampling하면 8개 픽셀 당 2개의 값을 추출하고 6개의 값을 버리므로 용량을 줄일 수 있다.
DCT(discrete cosine transform) Transform(이산코사인변환) and Quantization ( 양자화) 단계
DCT Transform 은 이미지를 주파수 도메인으로 변환하는 과정이다
subsampling을 하고나면 각 채널은 8x8블락들로 분할되게 된다. 4:2:0의 경우에는 Y채널은 8x8블락들로, CbCr 채널들은 16x16 블락들로 분할된다.
Y채널에 대해 살펴보면
이러한 8x8 블락이 있을 때,
1.
-128을 해주어 각 픽셀값의 범위를 [0, 255]에서 [-128, 127]로 변환해준다
2.
각 블락에 DCT를 적용해준다
그럼 주파수 도메인으로 변환되며,
가장 왼쪽 위의 절댓값이 가장 큰 계수를 DC계수라고 하고, 나머지 63개의 계수들을 AC계수라고 한다. 특히 DC계수는 저주파성분과 관련되어 있고 해당 블락의 기본적인 명도를 결정하는 매우 중요한 정보를 담고 있는 계수이다.
AC계수들은 고주파 성분들과 연관되어 있다.
이후 양자화를 진행시켜준다. 핵심적인 부분이다.
양자화는 고주파 성분을 제거하기 위한 방법이라고 할 수 있다
→ 연속된 빛의 파장을 이산값으로 변환
→ 양자화를 하면 자연스러운 색상을 단순화시키게 된다 ( 색 수가 줄어들게 된다 → 데이터손실 )
1bit : binary image (0,1)
8bit : gray scale 282^8개의 색상
24bit : True color(RGB) 28×32^{8 \times 3}개의 색상
 24bit까지 필요없다고 해 확률적으로 많이 사용하는 256개의 RGB 조합을 선정한 8bit colotmap이 사용되기도 한다
주파수 영역의 각 계수에 대해 특정 상수 ( 양자화 행렬 )로 나누고 반올림한 값들을 취하며, 전형적인 양자화 행렬은 다음과 같다
이 행렬을 보면 DC계수값은 비교적 작고 AC 계수들 값은 오른쪽, 아래로 갈 수록 커진다
== DC계수는 작은값으로 나눠짐, AC계수들은 오른쪽 아래에 위치할수록 (주파수가 높을 수록) 큰 값으로 나눠준다
다음과 같이 많은 AC계수값들이 0이 된다 즉, 고주파 성분들이 손상됐다.
ZIGZAG 스캐닝
2차원으로 배열된 양자화된 DCT계수들을 1차원의 데이터로 만들어주기
[-26, -3, 0, -3, -2, -6, 2, -4, 1, -3, 1, 1, 5, 1, 2, -1, 1, -1, 2, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
양자화된 DC계수 부호화
DC계수와 AC계수는 각각 다른 방식으로 부호화
DC계수 : 해당 블락의 기본적인 명도와 관련이 있기에 인접한 블럭들의 DC계수는 비슷한 경우가 많음. 따라서 이전 블럭의 DC계수와 현재 블럭의 DC계수의 차이를 구함 (변동값을 구함) = DPCM, 작은 숫자일수록 적은 비트 차지
이런식이다
AC계수: run-length encoding. 0이 아닌 양자화된 AC계수들을 앞에 0이 몇개 나오며, 자신의 값은 얼마인지를 사용해 부호화
그리고 이것에 허프만 부호화를 적용 ( 이렇게만 알고있겠다 )
이것이 다 끝난 후 DC계수와 AC계수들의 부호들을 연결!

PNG의 파일 처리 과정

Portable Network Graphics. 인터넷에 표현될 이미지를 염두로 개발되었기 때문에, RGB가 아닌 색공간은 지원하지 않는다.
JPEG처럼 픽셀로 이뤄진 비트맵 그래픽이나, 8bit 알파채널을 지원해 투명도를 표현할 수 있다. 일종의 마스크 영역을 갖는 것이다.
무손실 압축방법을 사용해 용량보다 품질을 우선으로 생각한다.
LZ77 알고리즘으로 데이터를 압축하고, 허프만 부호화를 통해 한번 더 압축한다.
LZ77 알고리즘
dictionary 방식의 압축 알고리즘으로, 현재 압축하려는 데이터가 이전에 존재했는지 파악해 반복여부를 표시하는 방식이다.
즉, 부호화 도중 새로 나타나는 심볼열을 dictionary에 기록하고, 그 내용을 다음 부호화에 사용
그림으로 살펴보면 이해가 쉽다.
파란영역은 메모리를 거의 차지하지 않는 영역이고, 빨간색은 메모리를 많이 차지하는 영역이다.
처음으로 색이 다른 공이 나오면 저장공간을 사용하고, 그 다음에 나올 땐 사용하지 않는다
세번째 빨간공에서 메모리를 꽤 차지하는 이유는 반복되는 거리가 멀기 때문!
허프만부호화
데이터 문자가 출현하는 빈도를 파악해 빈도수가 높은 기호에 짧은 접두어 코드를 부여하는 방식.
예를 들어,
aaabbaabcd
Plain Text
복사
라는 문자열이 있습니다.
가장 많이 쓰인 건 a(5번), 그 다음은 b(3번), 적게 쓰인 건 c(1번)와 d(1번)입니다.
이제 이 순서대로 짧은 코드를 부여합니다. a=0, b=01, c=011, d=111 이런 식으로요.
그럼
00001010001011111
Plain Text
복사
으로 압축할 수 있겠죠!
압축 전의 문자열은 80비트지만, 부호화 후에는 17비트로 줄어들게 되므로 21%나 압축한 셈이 됩니다
(이정도로만 정리 )
하여튼 결론

LZ77과 허프만 부호화는 빈도수를 파악해 더 자주 나타날 수록 더 적은 비용으로 압축한다