코딩 애플 보다가 좋은 내용이 있어서 스크랩

오래된 사진들이나 인터넷에서 돌고 돌던 사진은
아래 사진처럼 깨져 있는 경우가 많다.
왜 JPEG는 디지털 풍화가 생길까?

만약 스마트폰으로 찍은 1000*1000px 사진을 업로드하려면 저장 공간이 얼마나 필요할까?
먼저 색상 하나(하나의 픽셀)를 저장하려면 3Byte의 용량이 필요하다.

하나의 픽셀에는
하나의 RGB색상이 들어 있는데
일반적으로 RGB는 Red, Green, Blue 3개의 색상을 조합해야 하나의 색상이 나온다.
따라서 하나의 가로 세로 1000픽셀인 사진 한 장을 저장하는데에는 적어도 3mb의 공간이 필요하다고 계산 해 볼 수 있다.
하나의 사진 용량 = 1000*1000*3Byte = 3mb
근데 우리가 인터넷에 사진을 업로드 해 보면?

훨씬 작은 용량인 126KB 으로 뜬다.
왜일까?
한정된 적은 저장 공간에 많은 이미지를 저장하려고 손실 압축을 하기 때문이다.
예를 들어 가장 일반적으로 사용되는 JPEG(제이팩) 압축방법을 살펴 보자
1. JPEG 압축
JPEG는 손실 압축이라는 걸 하는데, 아래 그림처럼 JPEG 저장에 필요한 색상숫자의 양을 지워버리는 것이다.
즉 손실 압축이 반복될수록 색상 가짓수가 적어지면서 사진이 선명하지 않게 되는 것이다.

2. RGB -> YCbCr

JPEG의 핵심은 인간 시력의 허점을 이용한다. 사람 눈은 생각보다 멍청하다. 그래서 밝기 구분은 잘 하는데 섬세한 색깔 구분은 잘 하지 못한다.


아래 두 색은 분명히 다른 색인데 사람의 시력은 별 차이를 느끼지 못한다.

그렇기 때문에 이미지의 밝기는 그대로 두고 이미지의 색상 부분만 추출하고 인접한 픽셀을 그냥 하나의 색으로 칠해버린다. 즉, 이런 식으로 색을 뭉개버려도 사람의 눈은 큰 차이를 느끼지 못한다.

원본에서는 이렇게 생긴 픽셀 조각들을 아래와 같이 4영역으로 나누어 조각이 가진 평균 색상 4가지로 인접한 색상들을 채워버린다.


JPEG을 만들고 싶으면 일단 이미지 색상에 있는 RGB 정보를 YCbCr로 변환해 준다.
R : 130, G : 90, B : 62 값인 갈색 블럭이 있다.
RGB에서 R은 Red, G는 Green, B는 Blue을 나타내는 값으로 갈색은
레드가 130만큼, 그린이 90만큼, 블루가 62만큼 혼합되었다는 뜻이다.
하지만 이걸 Y, Cb, Cr로 바꿀 수 있다.
Y: 밝기
Cb: 초록색에서 파란색이 얼마나 섞였는가
Cr: 초록색에서 빨강이 얼마나 섞였는가?

하나의 이미지에서 밝기, Cb, Cr 을 추출하면 이렇게 세 장의 이미지로 분리할 수 있다.
세 장의 이미지를 하나로 겹치면, 원본이미지가 된다.


3. Downsampling(다운샘플링)
RGB를 Y, Cb, Cr로 분리하고 Cr에서 4*4 픽셀 블럭을 확대 해 보자
비슷한 계열의 다양한 색으로 이루어져 있다.

2픽셀씩 칸을 나누어 격자를 그리고, 격자 안에 있는 부분은 모두 같은 색으로 칠해서 뭉개버린다.



그럼 용량이 4분의 1로 줄어 드는데!?
하지만 이렇게 해도 생각보다 저장용량이 많이 줄어들지는 않는다.
그렇기 때문에 DCT 와 Quantization을 써서 용량을 더 줄여준다.
4. DCT(이산코사인변환) 와 Quantization(양자화)
이미지를 8 * 8 픽셀 블록들로 나누어서 이 블록을 가지고 주파수 단위로 패턴을 찾는 것이 DCT이다.

이 사진을 확대하면, 가로선, 세로선, 점박이 패턴 등 각종 패턴이 있다.
똑똑한 사람들은 흔하게 사용되는 64개의 패턴 표를 만들어 두었다.
현재 이미지를 64개의 패턴만을 사용해서 재구성 할 수 있게 하는 것이다.


전문 용어로 말하면 푸리에 변환(Fourier transform, FT)을 하는 것이다. 시간이나 공간에 대한 함수를 시간 또는 공간 주파수 성분으로 분해하는 변환을 말한다. 이걸 하려면 이미지를 8*8픽셀로 자르고, 해당 구역은 패턴들을 각각 몇개씩 써야 재현할 수 있는지 기록을 해 두는 것이다.



이렇게 칸마다 각 패턴이 몇 개씩 필요한지 계산해서 숫자를 넣어 준다.

이 상태에서 가장 쉽게 압축하는 방법은 연속된 숫자를 짜부시키는 것이다.
1 1 1 1 1 1 1 1 1 1 이렇게 1이 열 개 이면 1 * 10이라고만 저장해 주면 된다.
또 숫자를 10으로 나눠준 다음 가장 가까운 정수로 반올림 해 버린다. 그러면 많이 사용이 되는 것들은 숫자 변화가 거의없으나 많이 사용되지 않는 것들은 0값이 된다. 0이 많아지면 압축이 쉬워져서 용량이 적어진다.
근데 임의의 10같은 숫자로 일괄적으로 나눠버리는 것보다
중요한 패턴들은 10보다 낮은 숫자, 안 중요한 패턴은 높은 숫자로 나눠주면 이미지 화질이나 압축률이 계산된다.
그래서 똑똑한 사람들이 만들어 놓은 quantization table이라는 테이블이 있다.
이 테이블에 있는 값으로 나누어 지면 오른쪽 밑으로 갈수록 0이 많아 진다.
(오른쪽 하단에 있는 패턴은 거의 쓰지지 않는 테이블임)

이 quantization 테이블로 숫자를 나누고, 나눈 값을 차례로 나열 한다.
중복된 숫자들은 * 곱셈 기호로 압축 해 준다. 그리고 허프만 테이블을 이용해서 허프만 인코딩을 거치면 압축이 완료 된다!

이게 바로 JPEG의 압축 알고리즘
지금까지 JPEG 사진을 확대하면 왜 격자무늬로 디지털 풍화가 일어나는지 알아보았다.
결론
8*8 픽셀 단위로 quantization이 일어나기 때문이다.
한 번 압축이 일어나면 원본이미지로 되돌리기 어렵다.
풍경 사진은 디테일이 뭉개져도 이미지에 별 차이가 없다.

하지만 다루는 이미지가 로고, 텍스트 등 날카로운 패턴이 많이 들어가면
JPEG으로 압축했을 때 이미지가 더 많이 깨진다.
'ETC > ETC_Software' 카테고리의 다른 글
[Excel] 엑셀로 만드는 To Do List 대시보드 1 (57) | 2024.12.08 |
---|---|
[Excel] 엑셀 채우기 핸들, date, text 함수로 날짜와 요일 자동 채우기 하는 방법 (60) | 2024.12.08 |
📌 맥북 개발자도구 실행 안 될 때 해결 법 -> safari 환경설정, 개발자 도구 단축키 (17) | 2024.11.07 |
유용한 맥북 단축키 모음 : 복사, 붙여넣기 등 자주쓰이는 단축키 (3) | 2024.10.30 |
Mac에서 스크린샷 찍기 : 맥북 캡쳐 단축키 모음 (4) | 2024.10.30 |
코딩 애플 보다가 좋은 내용이 있어서 스크랩

오래된 사진들이나 인터넷에서 돌고 돌던 사진은
아래 사진처럼 깨져 있는 경우가 많다.
왜 JPEG는 디지털 풍화가 생길까?

만약 스마트폰으로 찍은 1000*1000px 사진을 업로드하려면 저장 공간이 얼마나 필요할까?
먼저 색상 하나(하나의 픽셀)를 저장하려면 3Byte의 용량이 필요하다.

하나의 픽셀에는
하나의 RGB색상이 들어 있는데
일반적으로 RGB는 Red, Green, Blue 3개의 색상을 조합해야 하나의 색상이 나온다.
따라서 하나의 가로 세로 1000픽셀인 사진 한 장을 저장하는데에는 적어도 3mb의 공간이 필요하다고 계산 해 볼 수 있다.
하나의 사진 용량 = 1000*1000*3Byte = 3mb
근데 우리가 인터넷에 사진을 업로드 해 보면?

훨씬 작은 용량인 126KB 으로 뜬다.
왜일까?
한정된 적은 저장 공간에 많은 이미지를 저장하려고 손실 압축을 하기 때문이다.
예를 들어 가장 일반적으로 사용되는 JPEG(제이팩) 압축방법을 살펴 보자
1. JPEG 압축
JPEG는 손실 압축이라는 걸 하는데, 아래 그림처럼 JPEG 저장에 필요한 색상숫자의 양을 지워버리는 것이다.
즉 손실 압축이 반복될수록 색상 가짓수가 적어지면서 사진이 선명하지 않게 되는 것이다.

2. RGB -> YCbCr

JPEG의 핵심은 인간 시력의 허점을 이용한다. 사람 눈은 생각보다 멍청하다. 그래서 밝기 구분은 잘 하는데 섬세한 색깔 구분은 잘 하지 못한다.


아래 두 색은 분명히 다른 색인데 사람의 시력은 별 차이를 느끼지 못한다.

그렇기 때문에 이미지의 밝기는 그대로 두고 이미지의 색상 부분만 추출하고 인접한 픽셀을 그냥 하나의 색으로 칠해버린다. 즉, 이런 식으로 색을 뭉개버려도 사람의 눈은 큰 차이를 느끼지 못한다.

원본에서는 이렇게 생긴 픽셀 조각들을 아래와 같이 4영역으로 나누어 조각이 가진 평균 색상 4가지로 인접한 색상들을 채워버린다.


JPEG을 만들고 싶으면 일단 이미지 색상에 있는 RGB 정보를 YCbCr로 변환해 준다.
R : 130, G : 90, B : 62 값인 갈색 블럭이 있다.
RGB에서 R은 Red, G는 Green, B는 Blue을 나타내는 값으로 갈색은
레드가 130만큼, 그린이 90만큼, 블루가 62만큼 혼합되었다는 뜻이다.
하지만 이걸 Y, Cb, Cr로 바꿀 수 있다.
Y: 밝기
Cb: 초록색에서 파란색이 얼마나 섞였는가
Cr: 초록색에서 빨강이 얼마나 섞였는가?

하나의 이미지에서 밝기, Cb, Cr 을 추출하면 이렇게 세 장의 이미지로 분리할 수 있다.
세 장의 이미지를 하나로 겹치면, 원본이미지가 된다.


3. Downsampling(다운샘플링)
RGB를 Y, Cb, Cr로 분리하고 Cr에서 4*4 픽셀 블럭을 확대 해 보자
비슷한 계열의 다양한 색으로 이루어져 있다.

2픽셀씩 칸을 나누어 격자를 그리고, 격자 안에 있는 부분은 모두 같은 색으로 칠해서 뭉개버린다.



그럼 용량이 4분의 1로 줄어 드는데!?
하지만 이렇게 해도 생각보다 저장용량이 많이 줄어들지는 않는다.
그렇기 때문에 DCT 와 Quantization을 써서 용량을 더 줄여준다.
4. DCT(이산코사인변환) 와 Quantization(양자화)
이미지를 8 * 8 픽셀 블록들로 나누어서 이 블록을 가지고 주파수 단위로 패턴을 찾는 것이 DCT이다.

이 사진을 확대하면, 가로선, 세로선, 점박이 패턴 등 각종 패턴이 있다.
똑똑한 사람들은 흔하게 사용되는 64개의 패턴 표를 만들어 두었다.
현재 이미지를 64개의 패턴만을 사용해서 재구성 할 수 있게 하는 것이다.


전문 용어로 말하면 푸리에 변환(Fourier transform, FT)을 하는 것이다. 시간이나 공간에 대한 함수를 시간 또는 공간 주파수 성분으로 분해하는 변환을 말한다. 이걸 하려면 이미지를 8*8픽셀로 자르고, 해당 구역은 패턴들을 각각 몇개씩 써야 재현할 수 있는지 기록을 해 두는 것이다.



이렇게 칸마다 각 패턴이 몇 개씩 필요한지 계산해서 숫자를 넣어 준다.

이 상태에서 가장 쉽게 압축하는 방법은 연속된 숫자를 짜부시키는 것이다.
1 1 1 1 1 1 1 1 1 1 이렇게 1이 열 개 이면 1 * 10이라고만 저장해 주면 된다.
또 숫자를 10으로 나눠준 다음 가장 가까운 정수로 반올림 해 버린다. 그러면 많이 사용이 되는 것들은 숫자 변화가 거의없으나 많이 사용되지 않는 것들은 0값이 된다. 0이 많아지면 압축이 쉬워져서 용량이 적어진다.
근데 임의의 10같은 숫자로 일괄적으로 나눠버리는 것보다
중요한 패턴들은 10보다 낮은 숫자, 안 중요한 패턴은 높은 숫자로 나눠주면 이미지 화질이나 압축률이 계산된다.
그래서 똑똑한 사람들이 만들어 놓은 quantization table이라는 테이블이 있다.
이 테이블에 있는 값으로 나누어 지면 오른쪽 밑으로 갈수록 0이 많아 진다.
(오른쪽 하단에 있는 패턴은 거의 쓰지지 않는 테이블임)

이 quantization 테이블로 숫자를 나누고, 나눈 값을 차례로 나열 한다.
중복된 숫자들은 * 곱셈 기호로 압축 해 준다. 그리고 허프만 테이블을 이용해서 허프만 인코딩을 거치면 압축이 완료 된다!

이게 바로 JPEG의 압축 알고리즘
지금까지 JPEG 사진을 확대하면 왜 격자무늬로 디지털 풍화가 일어나는지 알아보았다.
결론
8*8 픽셀 단위로 quantization이 일어나기 때문이다.
한 번 압축이 일어나면 원본이미지로 되돌리기 어렵다.
풍경 사진은 디테일이 뭉개져도 이미지에 별 차이가 없다.

하지만 다루는 이미지가 로고, 텍스트 등 날카로운 패턴이 많이 들어가면
JPEG으로 압축했을 때 이미지가 더 많이 깨진다.
'ETC > ETC_Software' 카테고리의 다른 글
[Excel] 엑셀로 만드는 To Do List 대시보드 1 (57) | 2024.12.08 |
---|---|
[Excel] 엑셀 채우기 핸들, date, text 함수로 날짜와 요일 자동 채우기 하는 방법 (60) | 2024.12.08 |
📌 맥북 개발자도구 실행 안 될 때 해결 법 -> safari 환경설정, 개발자 도구 단축키 (17) | 2024.11.07 |
유용한 맥북 단축키 모음 : 복사, 붙여넣기 등 자주쓰이는 단축키 (3) | 2024.10.30 |
Mac에서 스크린샷 찍기 : 맥북 캡쳐 단축키 모음 (4) | 2024.10.30 |