본 프로젝트는 JPEG 압축 방식을 파이썬으로 구현한 학습용 코드입니다.
이미지를 입력받아 JPEG의 주요 단계를 거쳐 인코딩/디코딩을 수행하고,
각 단계별 메모리 사용량 변화를 확인할 수 있습니다.
JPEG 압축은 크게 6단계로 이루어집니다.
-
RGB → YCbCr 변환
- RGB 이미지를 사람의 시각 특성에 맞게 Y (밝기), Cb/Cr (색차) 성분으로 변환합니
- 밝기에 민감하고 색차에는 둔감한 인간의 눈 특성을 활용하기 위함
-
다운샘플링 (Downsampling)
- Cb, Cr 채널을 2x2 블록 단위로 줄여 해상도를 절반으로 축소합니다.
- 예: 512×512 → 256×256
- 데이터 양을 크게 줄이는 핵심 단계
-
DCT (이산 코사인 변환)
- 이미지를 8×8 블록으로 나눠 주파수 영역으로 변환
- 저주파(좌상단)는 영상의 전반적인 윤곽, 고주파(우하단)는 세부 디테일 표현
-
양자화 (Quantization)
- 사람 눈에 덜 중요한 고주파 계수를 더 거칠게 줄입니다.
- 이 과정에서 많은 계수가 0이 되어 이후 압축 효율을 높임.
-
RLE (Run-Length Encoding)
- 지그재그 스캔 후, 연속된 0의 개수를 기록하여 데이터 줄임.
-
허프만 부호화 (Huffman Coding)
- 등장 빈도 기반의 가변 길이 이진 코드로 무손실 압축
- 자주 등장하는 값은 짧은 비트코드를, 드문 값은 긴 비트코드를 할당
압축된 데이터를 다시 원본 이미지로 복원합니다.
- 허프만 디코딩 → RLE 역변환
- 지그재그 역스캔 → 8×8 블록 복원
- 양자화 역처리 → 근사 DCT 계수 복구
- IDCT (역이산 코사인 변환) → 픽셀 영역 복원
- 업샘플링 (Cb, Cr) → YCbCr 재구성
- YCbCr → RGB 변환
512x512 Image
- 원본 이미지(512x512): 773.00 KB
- YCbCr 분리: 3072.00 KB
- 다운샘플링: 1536.00 KB
- 양자화 후: 1536.00 KB
- RLE 후: 143.22 KB
- 허프만 후: 20.64 KB
1024x0124 Image
- 원본 이미지(1024x1024): 7340.59 KB
- YCbCr 분리: 12288.00 KB
- 다운샘플링: 6144.00 KB
- 양자화 후: 6144.00 KB
- RLE 후: 585.38 KB
- 허프만 후: 80.59 KB
- 원본은 RGB니까 int8로 저장되어있음(0~255니까)
- 이때 코드에서 YCbCr채널로 변경하면서 float32로 변경합니다. 여기서는 변경을 안해도되지만 나중에 결국 변경하기 때문에 먼저 했습니다
- float32로 저장하면서 4배커짐. 저장하는 자리수가 더 많아지기 때문
- 다운샘플링 후에 Cb,Cr픽셀수를 각각 1/4로 줄이니까 Y+1/4Cb+1/4Cr이라 절반으로 줄어듬
- 양자화는 그냥 나눗셈만 하는거임-> 이미지 자체로는 정보를 압축하는 과정이지만 메모리 차원에서 봤을 때는 변화 X
- RLE는 0이 길게 반복되는 부분을 하나로 줄이니가 데이터가 압축됨
- 허프만은 데이터 출현 빈도를 효율적으로 할당하니까 줄어든다

- 이미지가 정사각형이 아니면 오류가 발생합니다. 테스트 파일은 정사각형으로 해주세요
pip install -r requirements.txt
python JPEG.py --이미지경로