Mã hóa Huffman gán mỗi VLC cho một ký hiệu dựa trên xác suất xuất hiện của các ký hiệu. Theo cách tiếp cận ban đầu của Huffman (1952) thì cần tính toán xác suất xuất hiện của mỗi ký hiệu và thiết lập một tập các VLC. Quá trình này được mô tả qua ví dụ sau.
Ví dụ: Mã hóa Huffman các vectơ chuyển động của chuỗi 1
Dữ liệu sai lệch của các vectơ chuyển động (MVD) của một chuỗi video (“chuỗi 1”) cần được mã hóa. Bảng 2.3 liệt kê các xác suất của các vectơ chuyển động hay xuất hiện nhất trong chuỗi mã hóa và nội dung thông tin của nó, log2(1/p). Để thu được hiệu suất nén tối ưu, mỗi giá trị được biểu diễn đúng bằng log2(1/p) bít, “0” là giá trị phổ biến nhất và loại bỏ các vectơ chuyển động lớn hơn (sự phân phối này là đại diện cho 1 dãy chuyển động trung bình).
Vector Xác suất (p) Log2(1/p)
-2 0.1 3.32
-1 0.2 2.32
0 0.4 1.32
1 0.2 2.32
2 0.1 3.32
Bảng 2.3 Xác suất xuất hiện của các vector chuyển động trong chuỗi 1
Tạo cây mã Huffman
Để tạo bảng mã Huffman cho tập dữ liệu này, phương pháp sau được thực hiện: Sắp xếp danh sách dữ liệu theo thứ tự xác suất tăng dần
Hợp hai phần tử có xác suất thấp nhất vào một “nút” và gán giá trị xác suất liên hợp của các phần tử cho nút này.
Sắp xếp lại danh sách các phần tử và các nút theo thứ tự xác suất tăng dần và lặp lại bước 2.
Quá trình trên được lặp lại cho đến khi một nút “gốc” – chứa tất cả các nút và phần tử khác. Quá trình này được minh họa trên hình 2.17.
Mã hóa
Mỗi “lá” của cây nhị phân được tham chiếu tới một mã có chiều dài thay đổi. Để tìm mã này, cây nhị phân được duyệt từ nút gốc (trong trường hợp này là nút D) tới lá đó (phần tử dữ liệu). Với mỗi nhánh, giá trị 0 hoặc 1 được gán cho mã: 0 với nhánh trên và 1 với nhánh dưới, tạo thành tập mã sau:
Vector Mã Bit (thực tế) Bit (lý tưởng)
0 1 1 1.32
1 011 3 2.32
-1 010 3 2.32
2 001 3 3.32
-2 000 3 3.32
Bảng 2.4 Mã Huffman cho các vector chuyển động chuỗi 1
Mã hóa được thực hiện bằng cách truyền các mã thích hợp đối với mỗi loại phần tử dữ liệu. Chú ý rằng một khi cây nhị phân đã được sinh ra, các mã có thể được lưu trong một bảng tìm kiếm (look-up table).
Giải mã
Để giải mã dữ liệu, bộ giải mã phải có bản sao chính xác của cây mã Huffman (hay bảng tìm kiếm). Có thể đạt được việc này bằng cách truyền bảng tìm kiếm hay gửi danh sách của dữ liệu và xác suất trước khi gửi dữ liệu được mã hóa. Một mã được chuyển ngược về dữ liệu ban đầu, ví dụ:
• 011 được giải mã thành (1) • 1 được giải mã thành (0) • 000 được giải mã thành (-2)
Nếu sự phân bố xác suất chính xác, mã hóa Huffman cho ta một biểu diễn thu gọn của dữ liệu gốc.