지난 "벡터 양자화(Vector Quantization) 이론"편에서는 클로드 섀넌의 정보 이론에 뿌리를 둔 벡터 양자화의 수학적 정의와 최적 양자화기가 갖추어야 할 조건, 그리고 이를 학습하는 LBG 알고리즘 등 이론적 토대를 자세히 살펴보았습니다. 해당 이론이 연속적인 신호를 효율적인 이산 기호로 변환하는 우아한 수학적 뼈대였다면, 이번 글에서는 이러한 벡터 양자화 이론이 우리가 매일 접하고 사용하는 이미지 압축 분야에 어떻게 구체적으로 적용되는지 실용적인 관점에서 다루어 보고자 합니다.
이론적으로 동일한 비트율에서 스칼라 양자화보다 항상 우수한 성능을 보장하는 벡터 양자화는, 방대한 픽셀 데이터로 이루어진 이미지를 다룰 때 그 진가를 발휘합니다. 인접한 픽셀들은 강한 공간적 상관관계를 가지며, 작은 영역 안의 픽셀 묶음은 제한된 몇 가지 패턴(평탄한 영역, 경계, 질감 등)으로 분류됩니다. 이러한 중복성은 픽셀을 하나씩 양자화하는 스칼라 방식으로는 활용할 수 없지만, 픽셀 블록을 하나의 벡터로 묶어 다루는 벡터 양자화로는 효과적으로 압축할 수 있습니다.
이번 글에서는 이미지를 벡터로 변환하는 블록 단위 처리에서 시작하여, 벡터 양자화 기반 압축 파이프라인의 구조, 압축률과 화질의 트레이드오프, 이미지에 특화된 변형 기법들, 변환 부호화(JPEG)와의 관계, 그리고 친숙한 색상 양자화와 최신 신경망 응용까지 단계적으로 다룹니다.
1. 이미지 데이터의 공간적 상관관계와 벡터 양자화
디지털 이미지는 2차원 평면 위에 배열된 수많은 픽셀의 집합입니다. 자연 이미지의 가장 큰 통계적 특징은 인접한 픽셀들이 색상과 밝기 측면에서 매우 유사한 값을 가진다는 점입니다. 이를 공간적 상관관계라고 부릅니다.
스칼라 양자화를 사용하여 각 픽셀을 독립적으로 압축하게 되면, 이러한 픽셀 간의 강한 상관관계를 전혀 활용하지 못하고 중복된 정보를 그대로 저장하게 됩니다. 이전 글에서 언급한 바와 같이 벡터 양자화의 핵심 이득 중 하나인 메모리 이득은 바로 이 지점에서 발생합니다. 인접한 픽셀들을 묶어 하나의 다차원 벡터로 취급하면, 이미지 내에 자주 등장하는 특정 패턴을 찾아내어 훨씬 효율적인 공간 분할과 데이터 압축이 가능해집니다.
벡터 양자화를 적용하려면 먼저 이미지를 벡터들의 집합으로 표현해야 합니다. 가장 일반적인 방법은 이미지를 서로 겹치지 않는 $n \times n$ 크기의 작은 블록(Block)으로 분할하고, 각 블록을 하나의 벡터로 간주하는 것입니다.
예를 들어 $4 \times 4$ 블록을 사용하면 각 블록은 16개의 픽셀로 구성되며, 이를 16차원 벡터 $x \in \mathbb{R}^{16}$으로 표현합니다. 그레이스케일 이미지에서 각 픽셀이 0부터 255까지의 밝기 값을 가진다면, 블록 벡터는 16개의 밝기 값을 일정한 순서로 나열한 것입니다.
이렇게 블록 단위로 묶으면, 블록 내부 픽셀들의 공간적 상관관계가 벡터의 차원 간 상관관계로 자연스럽게 포착됩니다. 즉, 평탄한 영역의 블록들은 서로 비슷한 벡터가 되어 벡터 공간에서 가까이 모이고, 유사한 경계를 가진 블록들 역시 한 곳에 군집을 이룹니다. 벡터 양자화는 이렇게 모인 군집들을 소수의 대표 벡터(코드워드)로 표현함으로써 압축을 달성합니다.
2. 벡터 양자화 기반 이미지 압축 파이프라인
이미지 압축을 위한 벡터 양자화는 다음 네 단계로 구성됩니다.
코드북 학습(Codebook Training)
학습용 이미지를 블록으로 분할하여 벡터 집합을 만들고, LBG 알고리즘으로 크기 $N$의 코드북 $\mathcal{C} = \{y_1, \dots, y_N\}$을 설계합니다. 각 코드워드는 자주 등장하는 블록 패턴의 대표값입니다.
부호화(Encoding)
압축할 이미지를 같은 크기의 블록으로 분할하고, 각 블록 벡터를 가장 가까운 코드워드로 매핑하여 그 인덱스를 기록합니다. 결과적으로 이미지는 인덱스의 배열, 즉 인덱스 맵(Index Map)으로 표현됩니다.
저장 및 전송(Storage and Transmission)
코드북과 인덱스 맵을 저장하거나 전송합니다. 인덱스 하나는 $\log_2 N$ 비트로 표현됩니다.
복호화(Decoding)
인덱스 맵의 각 인덱스를 코드북에서 조회하여 해당 코드워드(블록)로 복원하고, 블록들을 원래 위치에 배치하여 이미지를 재구성합니다.
여기서 주목할 점은 복호화기가 단순한 테이블 조회(Table Lookup)만으로 동작한다는 것입니다. 부호화 과정에서 최근접 코드워드를 찾는 계산은 무겁지만, 복호화는 인덱스로 코드북을 참조하기만 하면 되므로 매우 빠릅니다. 이러한 부호화-복호화의 비대칭성은 한 번 압축하여 여러 번 재생하는 응용(예: 영상 배포, 디스플레이 출력)에 특히 유리합니다.
3. 압축률과 화질: 속도-왜곡 트레이드오프
이미지 압축의 효율은 픽셀당 비트 수(bpp, bits per pixel)로 측정합니다. 원본 그레이스케일 이미지는 픽셀당 8비트를 사용하므로 8 bpp입니다.
$n \times n$ 블록에 크기 $N$의 코드북을 사용하는 벡터 양자화에서, 블록 하나($n^2$개 픽셀)는 $\log_2 N$ 비트의 인덱스로 표현됩니다. 따라서 인덱스 맵만 고려한 픽셀당 비트 수는 다음과 같습니다.
예를 들어 $4 \times 4$ 블록($n^2 = 16$)에 256개 코드워드($N = 256, \log_2 N = 8\text{비트}$)를 사용하면 다음과 같습니다.
원본 8 bpp 대비 1/16로 압축되어 압축률은 16:1이 됩니다. 다만 이 계산은 인덱스 맵만 고려한 것이며, 실제로는 코드북 자체도 저장해야 합니다. 코드북은 $N \times n^2$개의 값을 담으며, 이 오버헤드는 이미지가 클수록 상대적으로 작아지지만 작은 이미지에서는 무시할 수 없습니다.
벡터 양자화는 손실 압축(Lossy Compression)이므로 복원 이미지는 원본과 다릅니다. 이 차이를 정량화하는 대표 지표가 PSNR(Peak Signal-to-Noise Ratio)이며, 원본과 복원 이미지 간의 평균 제곱 오차(MSE)를 기반으로 합니다.
벡터 양자화의 MSE는 본질적으로 양자화 왜곡(Quantization Distortion)입니다. 각 블록 벡터와 그것이 매핑된 코드워드 사이의 거리가 그대로 복원 오차가 되며, 이는 이론 글에서 다룬 평균 왜곡 $D$와 직접 연결됩니다.
여기서 속도-왜곡 트레이드오프(Rate-Distortion Tradeoff)가 드러납니다. 설계 시 다음 세 가지 요소가 압축률과 화질의 균형을 결정합니다.
블록 크기 $n \times n$: 블록을 크게 하면 한 인덱스로 더 많은 픽셀을 표현하므로 압축률이 높아집니다. 그러나 같은 화질을 유지하려면 더 큰 코드북이 필요하고, 고차원 벡터의 학습에는 기하급수적으로 많은 데이터가 요구됩니다(차원의 저주). 실무에서는 $4 \times 4$나 $2 \times 2$ 같은 작은 블록이 주로 사용됩니다.
코드북 크기 $N$: 코드워드가 많을수록 다양한 블록 패턴을 정밀하게 표현하여 화질이 좋아지지만, 인덱스 비트 수($\log_2 N$)와 부호화 시 탐색 비용이 함께 증가합니다.
코드북 오버헤드: 작은 이미지에서는 코드북 저장 비용이 전체 효율을 크게 떨어뜨립니다. 이를 완화하기 위해 여러 이미지가 공유하는 범용 코드북(Universal Codebook)을 미리 학습해 두기도 하지만, 이 경우 학습 데이터와 다른 특성의 이미지에서는 화질이 저하될 수 있습니다.
4. 이미지에 특화된 벡터 양자화 변형
기본적인 블록 VQ는 이미지의 통계적 특성을 더 잘 활용하기 위해 다양하게 변형되어 왔습니다.
평균 제거 VQ(Mean-Removed VQ): 각 블록에서 평균 밝기를 빼고, 평균값은 따로 스칼라 양자화합니다. 블록의 형태(질감과 경계)와 밝기(DC 성분)를 분리하여 코드북이 형태 패턴에만 집중하게 합니다. 모양은 같지만 밝기만 다른 블록들을 하나의 코드워드로 공유할 수 있어 효율이 높아집니다.
이득-형태 VQ(Gain-Shape VQ): 블록 벡터를 크기(Gain, 스칼라)와 방향(Shape, 단위 벡터)으로 분해하여 각각 따로 양자화합니다. 신호의 에너지와 패턴을 분리하는 접근입니다.
분류 VQ(Classified VQ): 블록을 경계 방향이나 활동도에 따라 미리 여러 부류로 분류하고, 부류별로 별도의 코드북을 사용합니다. 경계가 많은 블록과 평탄한 블록을 서로 다른 코드북으로 다루어 경계 보존 성능을 높입니다.
유한 상태 VQ(Finite-State VQ): 인접 블록 간의 상관관계를 활용하여, 이전 블록의 상태에 따라 현재 블록의 코드북을 적응적으로 선택합니다.
5. 변환 부호화와의 비교: 왜 JPEG는 벡터 양자화를 쓰지 않는가
공간 영역에서의 순수 벡터 양자화는 디코더의 구조가 단순히 메모리에서 값을 읽어오는 룩업 테이블 형태로 구현되므로, 하드웨어 구현이 매우 간단하고 복호화 속도가 빠르다는 강력한 장점이 있습니다. 그러나, 정작 가장 널리 쓰이는 이미지 압축 표준인 JPEG는 벡터 양자화가 아닌 변환 부호화(Transform Coding), 구체적으로는 이산 코사인 변환(DCT)을 사용합니다. 그 이유는 다음과 같습니다.
부호화 복잡도: 벡터 양자화의 부호화는 모든 코드워드와의 거리를 계산해야 하므로 코드북이 클수록 계산량이 급증합니다. 또한, 시각적으로 복잡한 텍스처나 엣지를 정확히 표현하려면 코드북의 크기가 기하급수적으로 커져야 하며, 이는 인코더의 탐색 복잡도를 극도로 증가시킵니다. 반면 DCT는 고속 알고리즘으로 효율적으로 계산됩니다.
코드북 의존성: 벡터 양자화는 학습된 코드북에 의존하므로 코드북을 함께 저장하거나 전송해야 하고, 학습 데이터와 다른 이미지에서는 성능이 저하될 수 있습니다. DCT는 데이터에 무관한 고정 기저(Fixed Basis)를 사용하므로 이런 부담이 없습니다.
표준화 용이성: 고정 기저를 쓰는 변환 부호화는 인코더와 디코더가 동일한 규칙을 공유하기 쉬워 표준화에 유리합니다.
이러한 이유로 벡터 양자화는 범용 이미지 압축 표준에서 주류가 되지 못했습니다. 그러나 다음 두 영역에서는 여전히 중요한 역할을 합니다.
6. 색상 양자화: 가장 친숙한 이미지 벡터 양자화
블록 단위가 아닌 픽셀 단위로 벡터 양자화를 수행하는 아주 직관적이고 친숙한 예시가 있습니다. 바로 색상 양자화입니다. GIF나 팔레트 기반 PNG 같은 포맷은 24비트 풀컬러(약 1,670만 색)를 제한된 수의 색(예: 256색)으로 줄여 표현합니다.
여기서 각 픽셀의 RGB 값은 3차원 벡터 $(R, G, B) \in \mathbb{R}^3$이며, 색상 팔레트가 바로 코드북입니다. 이미지에 등장하는 모든 픽셀 색을 256개의 대표 색으로 양자화하는 것은, 3차원 공간에서 $N = 256$인 벡터 양자화를 수행하는 것과 정확히 같습니다. 이미지 내에 존재하는 모든 픽셀의 RGB 벡터들을 모아 클러스터링을 수행하고, 이미지를 가장 잘 표현할 수 있는 256개의 대표 색상을 뽑아내어 팔레트를 만듭니다. 이후 모든 픽셀을 이 팔레트의 인덱스로 대체하여 압축을 완료합니다. 팔레트 설계에는 벡터 양자화뿐 아니라 미디언 컷(Median Cut), Wu 알고리즘 같은 색상 양자화 전용 기법도 사용됩니다.
블록 단위 VQ와 달리 색상 양자화는 차원이 3으로 낮고 직관적이어서, 벡터 양자화의 개념을 시각적으로 이해하기에 좋은 예입니다. 아래 위젯은 브라우저 상에서 동작하는 간단한 색상 양자화 시뮬레이터입니다.
색상 양자화 시뮬레이터
이미지의 각 픽셀 색상은 (R, G, B) 3차원 벡터입니다. 색상 양자화는 이 수많은 색을 소수의 대표 색(코드북)으로 매핑하는 3차원 벡터 양자화입니다. 팔레트 색상 수를 조절하며 코드북 크기에 따른 화질 변화를 확인해 보세요.
7. 현대적 부활: VQ-VAE와 신경망 이미지 압축
고전적 블록 VQ가 변환 부호화에 밀려난 이후에도, 벡터 양자화의 핵심 아이디어는 딥러닝 시대에 다시 부상했습니다. VQ-VAE(Vector Quantized Variational AutoEncoder)는 신경망이 추출한 잠재 표현(Latent Representation)을 학습된 코드북으로 양자화합니다.
이때 양자화의 대상이 원본 픽셀 블록이 아니라 신경망이 학습한 의미 있는 특징 벡터라는 점이 고전 방식과 다릅니다. 신경망 인코더가 이미지를 압축적인 잠재 공간으로 사상하고 그 공간에서 벡터 양자화가 이루어지므로, 단순한 픽셀 패턴이 아닌 고수준 구조를 효율적으로 표현할 수 있습니다. 이는 최신 신경망 이미지 압축과 생성 모델의 핵심 구성 요소가 되었습니다.
결국 블록 단위로 픽셀을 직접 양자화하던 1980년대의 아이디어는, 신경망의 잠재 공간을 양자화하는 현대적 형태로 진화하여 이미지 압축의 최전선에서 다시 활용되고 있습니다.
마치며
이번 글에서는 이론적인 벡터 양자화 기법이 실제 이미지 데이터를 압축하는 데 어떻게 응용되는지를 살펴보았습니다. 이미지를 작은 패치 단위의 다차원 벡터로 구성하고, 방대한 학습 데이터에서 추출한 대표 패턴의 집합인 코드북을 활용하여 정보를 획기적으로 축약하는 원리는 매우 직관적이면서도 수학적으로 견고한 접근입니다.
비록 범용 이미지 압축 표준의 자리는 계산 효율과 표준화 용이성을 갖춘 변환 부호화에 내주었지만, 벡터 양자화는 색상 양자화라는 친숙한 형태로 지금도 널리 쓰이고 있으며, VQ-VAE를 통해 신경망 이미지 압축의 핵심 기술로 부활했습니다. 픽셀 블록을 양자화하던 고전적 발상이 잠재 공간 양자화로 진화한 흐름은, 하나의 원리가 도메인을 바꾸며 어떻게 재해석되는지를 잘 보여줍니다. 이론에서 출발한 개념이 실제 응용을 거쳐 다시 최신 기술로 이어지는 이러한 연결 고리를 이해하는 것이야말로, 변화하는 기술의 본질을 꿰뚫는 가장 확실한 방법일 것입니다.
📖 참고문헌
- Nasrabadi, N. M., & King, R. A. (1988).
Image Coding Using Vector Quantization: A Review.
IEEE Transactions on Communications, 36(8), 957–971. https://doi.org/10.1109/26.3776 - Linde, Y., Buzo, A., & Gray, R. M. (1980).
An Algorithm for Vector Quantizer Design.
IEEE Transactions on Communications, 28(1), 84–95. https://doi.org/10.1109/TCOM.1980.1094577 - Gersho, A., & Gray, R. M. (1992).
Vector Quantization and Signal Compression.
Kluwer Academic Publishers. - Baker, R. L., & Gray, R. M. (1983).
Differential Vector Quantization of Achromatic Imagery.
Proceedings of the International Picture Coding Symposium, 105–106. - Ramamurthi, B., & Gersho, A. (1986).
Classified Vector Quantization of Images.
IEEE Transactions on Communications, 34(11), 1105–1115. https://doi.org/10.1109/TCOM.1986.1096466 - Foster, J., Gray, R. M., & Dunham, M. O. (1985).
Finite-State Vector Quantization for Waveform Coding.
IEEE Transactions on Information Theory, 31(3), 348–359. https://doi.org/10.1109/TIT.1985.1057037 - Heckbert, P. (1982).
Color Image Quantization for Frame Buffer Display.
ACM SIGGRAPH Computer Graphics, 16(3), 297–307. https://doi.org/10.1145/965145.801294 - Wu, X. (1992).
Color Quantization by Dynamic Programming and Principal Analysis.
ACM Transactions on Graphics, 11(4), 348–372. https://doi.org/10.1145/146443.146475 - Wallace, G. K. (1992).
The JPEG Still Picture Compression Standard.
IEEE Transactions on Consumer Electronics, 38(1), xviii–xxxiv. https://doi.org/10.1109/30.125072 - van den Oord, A., Vinyals, O., & Kavukcuoglu, K. (2017).
Neural Discrete Representation Learning.
NeurIPS 2017. https://arxiv.org/abs/1711.00937