JPEG 디지털 풍화 현상과 압축 알고리즘

eunjee·2025년 4월 26일
0

JPG와 JPEG

Joint Photographic Experts Group이라는 단체에서 만든 이미지 압축 방식으로 JPG와 JPEG는 기본적으로 같은 파일 형식

그럼 왜 이름이 다를까?

  • 과거 MS-DOS 운영체제 시절의 파일 확장자 길이 제한 때문
  • DOS는 파일 확장자를 최대 3글자까지만 허용했기 때문에 .jpeg 대신 .jpg로 줄여서 사용했던 것이 지금까지 이어져 오는 것!
  • 최신 운영체제(Windows, macOS 등)에서는 4글자 이상의 확장자를 지원하므로 .jpeg.jpg 모두 사용 가능하며, 기술적으로는 아무런 차이가 없음
  • 확장자를 서로 바꿔도 대부분의 이미지 뷰어에서 문제없이 열 수 있음

JPEG의 디지털 풍화 (Digital Weathering)

  • JPEG 이미지가 반복적인 저장과 편집을 거치면서 화질이 점점 떨어지는 현상을 흔히 "디지털 풍화"라고 부름
  • 이는 JPEG가 손실 압축(lossy compression) 방식을 사용하기 때문에 발생

JPEG 압축 알고리즘은 이미지의 데이터를 줄이기 위해 사람의 눈에 덜 민감한 부분의 정보를 영구적으로 제거합니다. 이 과정은 한 번만 거쳐도 약간의 화질 손실을 발생됩니다.

문제는 이미 JPEG으로 압축된 이미지를 다시 편집하고 저장할 때마다 압축 과정이 반복된다는 점인데, 매번 저장할 때마다 추가적인 정보 손실이 발생하고, 이 손실이 누적되면 결국 눈에 띄는 화질 저하, 즉 "디지털 풍화" 현상이 나타나는 것입니다.

→ 사진을 복사하고 또 복사할수록 원본의 선명도가 떨어지는 것과 비슷하다고 생각하면 됨

  • 색상하나를 컴퓨터에 저장하려면 3bytes의 용량이 필요합니다. 왜냐하면 일반적으로 RGB의 3개의 색상을 조합해야 하나의 색을 표현할 수 있기 때문

  • 예를들어, 갈색 color를 구현하려면 R(빨강):100, G(초록): 50, B(파랑):30 의 색을 섞어야 함
    이 숫자 하나하나(R, G, B)가 1byte임 ⇒ 총 3bytes

  • 따라서, 1px x 1px 은 3bytes의 저장공간이 필요

  • 그렇다면 1000px x 1000px 의 사진을 저장하려면 1000 x 1000 x 3bytes = 3MB 용량을 차지

  • 하지만 실제 사진의 용량은 100KB 정도로 훨씬 작음 → 그 이유는 압축을 하기 때문!!

jpg, png, webp 이런 여러가지 형식과 알고리즘으로 이미지 사이즈를 압축할 수 있음 → 그렇다면 압축은 어떻게 할까?

JPEG 압축

  • 인간 시력의 허점을 이용한 압축방법
  • 사람의 눈은 밝기 구분만 잘하고 섬세한 색 구분은 상대적으로 떨어짐
  • 색을 아래 사진처럼 하나도 합쳐버려도 사람 눈은 멀리서 보면 차이를 인식하지 못함

JPEG 압축 알고리즘 단계

1. 색 공간 변환 (Color Space Transformation)

  • RGB 색상 모델을 YCbCr 색상 모델로 변환
  • Y는 밝기(Luminance) 성분이고, Cb와 Cr은 색상(Chrominance) 성분
  • 사람의 눈은 색상 변화보다 밝기 변화에 더 민감하기 때문에, 이후 단계에서 색상 정보에 대한 압축률을 높일 수 있음

2. 다운샘플링 (Downsampling)

  • 인접한 픽셀들의 색상 성분(Cb, Cr)의 해상도를 줄입니다.
  • 일반적으로 4개의 픽셀을 하나의 평균 색상으로 처리하는 방식(4:2:0)이 많이 사용됩니다.
  • 이렇게 하면 이미지를 저장할 때 숫자를 4개가 아니라 1개만 저장할 수 있어서 용량을 1/4으로 저장 가능!

  • 그렇다면, 이론 상 1000 x 1000 사이즈의 이미지를 저장할 때, 3MB가 아니라, 1.5MB 밖에 차지하지 않음
  • 하지만 이렇게 색상을 합쳐서 파일 크기를 줄여 봤자 한계가 있음
  • DCT + Quantization을 사용해 이미지를 획기적으로 줄일 수 있음

3. 블록 분할 (Block Splitting)

  • 이미지를 8x8 픽셀 크기의 작은 블록으로 나눔

4. DCT (Discrete Cosine Transform)

  • 왼쪽의 64개의 패턴 표만 이용해서 이미지를 만드는 방법 → 재구성을 해버림
  • 빨간색의 패턴을 만드려면 화면에서 1번 패턴 몇 개, 2번 패턴 몇 개… 이런식으로 해서 이미지의 패턴을 새로 재구성
  • 푸리에 변환(Fourier transform)이라고 함
  • 일반적으로 왼쪽 위 패턴이 사용빈도가 높고, 오른쪽 맨 아래 끝으로 갈수록 가장 덜 사용됨
  • 각 8x8(64) 블록에 대해 DCT를 수행하여 공간 영역의 픽셀 값을 주파수 영역의 계수로 변환
  • 이게 어떻게 압축에 도움이 될까?
    • 연속된 숫자를 합쳐주기
    • 예를 들어, 1이 10개가 있는 것을
      • 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 이렇게 작성하는 것이 아닌,
      • 1 x 10 1이 10번 있음을 저장 하는 것

5. 양자화 (Quantization)

임의로 10으로 나누는 것보다 중요하고 자주 쓰는 패턴은 낮은 숫자, 중요하지 않은 패턴은 높은 숫자로 나눠주면 훨씬 더 이미지 압축이나 화질이 개선됨 → Quantization table을 이용해 나눠주면 됨

  • DCT 계수들을 양자화 테이블을 사용하여 나눕니다.
  • 이 단계에서 정보 손실이 가장 많이 발생하는데, 사람의 시각 시스템이 덜 민감한 고주파 성분의 계수들을 0에 가깝게 만들거나 작은 값으로 줄입니다. (양자화 테이블로 압축률과 화질의 균형을 조절)

6. 엔트로피 부호화 (Entropy Encoding)

결론

  • 디지털 풍화가 생기는 이유는 8 x 8 픽셀 단위로 Quantization(양자화)이 일어나기 때문임
  • 기존의 숫자를 많이 뭉개버리고 원본 숫자를 변형해 버리는 압축을 lossy compression(손실 압축)이라고 함
  • 한 번 압축이 일어나면 원본으로 되돌릴 수 없음
  • 이미지가 크고 손실이 일어나도 상관 없는 경우, 압축이 더 중요한 경우: 배경 이미지 등에 적합
  • 로고, 텍스트, 날카로운 모서리들이 많이 들어있다면 다른 방식의 압축 방법(비손실 압축, 예: png, webp, jpegxl이 더 적합)

참고

https://www.youtube.com/watch?v=tHvZngU14jE

0개의 댓글