Tải bản đầy đủ (.pdf) (77 trang)

Tìm hiểu một số thuật toán mã hóa và nén dữ liệu, xây dựng ứng dụng để nén dữ liệu ảnh

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.44 MB, 77 trang )

1

ĐẠI HỌC THÁI NGUYÊN
TRƢỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG



NGUYỄN THÀNH DƢƠNG




TÌM HIỂU MỘT SỐ THUẬT TOÁN MÃ HÓA VÀ NÉN DỮ
LIỆU, XÂY DỰNG ỨNG DỤNG ĐỂ NÉN DỮ LIỆU ẢNH






LUẬN VĂN THẠC SỸ KHOA HỌC















Th¸i Nguyªn - 2012
2

MỤC LỤC

Trang
TRANG PHỤ BÌA

LỜI CAM ĐOAN

MỤC LỤC
i
LỜI CÁM ƠN
iii
DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT
iv
DANH MỤC CÁC BẢNG BIỂU
v
DANH MỤC CÁC HÌNH VẼ
vi
MỞ ĐẦU
1
Chƣơng 1: CƠ SỞ LÝ THUYẾT
4
1.1. Mã hóa thông tin
4

1.2. Nén dữ liệu
5
1.3. Entropy
5
1.4. Các kết quả cơ bản về nén dữ liệu
8
1.4.1. Phân loại nén dữ liệu
8
1.4.2. Các định lý về nén dữ liệu
9
1.5. Lý thuyết về hình ảnh
14
1.5.1. Giới thiệu về ảnh số và xử lý ảnh số
14
1.5.2. Mục đích và sự cần thiết của nén ảnh
15
1.5.3. Phân loại các phƣơng pháp nén ảnh
16
Chƣơng 2: MỘT SỐ THUẬT TOÁN MÃ HÓA VÀ NÉN DỮ LIỆU
19
2.1. Thuật toán HUFFMAN
19
2.1.1. Ý tƣởng của thuật toán
19
2.1.2. Thuật toán
19
2.2. Thuật toán tách đoạn (RLE – Runlength Coding)
22
2.2.1. Ý tƣởng của thuật toán
22

2.2.2. Thuật toán
24
2.4. Thuật toán nén ảnh JPEG
25
2.3.1. Ý tƣởng của thuật toán
25
2.3.2. Thuật toán nén ảnh JPEG
26
2.4. Thuật toán nén ảnh nâng cao AIC
32
2.4.1. Chuẩn H.264/AVC
34
2.4.2. Thuật toán AIC
40
2.4.3. Các kết quả AIC
55
Chƣơng 3: XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM
56
3.1. Xây dựng chƣơng trình
56
3.2. Một số thủ tục của chƣơng trình chạy thử nghiệm
56
3.2.1. Thủ tục của chƣơng trình nén ảnh và giải nén bằng thuật toán
56
3

HUFFMAN
3.2.2. Thủ tục của chƣơng trình nén ảnh và giải nén bằng thuật toán
RLE
61

3.2.3. Thủ tục của chƣơng trình nén ảnh bằng thuật toán JPEG
62
3.3. Giao diện chính của chƣơng trình
64
3.4. Các bƣớc thực hiện chƣơng trình
66
3.5. So sánh kết quả thử nghiệm
68
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN
72
TÀI LIỆU THAM KHẢO
74

4

PHẦN MỞ ĐẦU


Nén dữ liệu hiện đang đƣợc sử dụng hầu nhƣ ở mọi nơi. Tất cả các hình ảnh
mà chúng ta xem hoặc sao chép đƣợc từ các trang web là các tệp hình ảnh đã đƣợc
nén, thông thƣờng trong định dạng JPEG hoặc GIF; đa số các modem đều sử dụng
tính năng nén dữ liệu; truyền hình độ phân giải cao (HDTV) sử dụng phƣơng pháp
nén theo chuẩn MPEG-2. Một số hệ thống quản lý tệp tin tự động nén các tệp tin
khi lƣu trữ và chúng ta cũng thƣờng sử dụng các chƣơng trình nén khác nhau để nén
tệp dữ liệu. Quá trình làm giảm kích thƣớc của một tệp dữ liệu đƣợc gọi một cách
phổ biến là nén dữ liệu (data compresion), còn tên gọi trong lý thuyết thông tin là
mã hóa nguồn (source coding). Trong khoa học máy tính và lý thuyết thông tin, nén
dữ liệu (hoặc mã hóa nguồn) là việc mã hóa thông tin bằng số ít bit hơn so với biểu
diễn ban đầu.
Có thể chia các phƣơng pháp nén ra hai lớp: nén không mất thông tin và nén

có mất thông tin. Nén không mất thông tin làm giảm bit số bít biểu diễn bằng cách
xác định và loại bỏ độ dƣ thừa thống kê trong cách biểu diễn ban đầu. Nhƣ tên gọi,
thông tin không bị mất trong quá trình nén không mất thông tin. Nén có mất thông
tin cố gắng giảm số bit bằng cách xác định thông tin không quan trọng và loại bỏ
chúng. Nếu nói ngắn gọn về bản chất nén, đó là tập hợp các thuật toán, bao gồm từ
phân loại, hàm băm, cho đến biến đổi Fourier nhanh (FFT), Ngoài ra các thuật
toán dựa trên nền tảng lý thuyết vững chắc đóng một vai trò quan trọng trong các
ứng dụng thực tế.
Nén dữ liệu hữu ích vì giúp giảm tài nguyên sử dụng nhƣ không gian lƣu trữ
dữ liệu hoặc dung lƣợng truyền. Vì dữ liệu nén phải đƣợc giải nén trƣớc khi sử
dụng, điều này đòi hỏi thêm chi phí tính toán để giải nén. Ví dụ, một chƣơng trình
nén cho video có thể yêu cầu phần cứng đắt tiền cho video đƣợc giải nén đủ nhanh
để đƣợc xem nhƣ là nó đang đƣợc giải nén, và tùy chọn để giải nén video đầy đủ
trƣớc khi xem nó có thể là bất tiện hoặc yêu cầu lƣu trữ bổ sung. Việc thiết kế các
chƣơng trình nén dữ liệu liên quan đến việc dung hòa các yếu tố khác nhau, bao
5

gồm cả mức độ nén, lƣợng thông tin bị mất khi sử dụng phƣơng pháp nén dữ liệu có
mất thông tin và các nguồn lực tính toán cần thiết để nén và giải nén dữ liệu.
Thuật ngữ tƣơng đƣơng thông điệp, bản tin hay dãy tin đƣợc sử dụng chung
cho các đối tƣợng cần nén. Nhiệm vụ của nén dữ liệu bao gồm hai thành phần: một
thuật toán mã hóa nhận bản tin ban đầu (mà ta gọi là bản tin gốc) và biểu diễn nó
dƣới dạng "nén" (hy vọng với ít bit hơn), và thuật toán giải mã đƣợc dùng để tái tạo
lại bản tin ban đầu hoặc xấp xỉ của bản tin ban đầu từ bản tin đã đƣợc nén. Hai
thành phần này thƣờng đƣợc xây dựng gắn kết với nhau.
Nén không mất thông tin và nén có mất thông tin: Nén không mất thông tin
thƣờng đƣợc sử dụng cho văn bản và nén có mất thông tin thƣờng đƣợc sử dụng để
nén các tệp âm thanh và hình ảnh khi việc mất một số bit thông tin về độ phân giải
thƣờng là không thể phát hiện đƣợc hoặc ít nhất là chấp nhận đƣợc. Tuy nhiên nén
có mất thông tin không có nghĩa là bị mất các pixel một cách ngẫu nhiên, thay vào

đó có nghĩa là sự mất mát một đại lƣợng nhƣ một thành phần tần số, hoặc nhiễu.
Chẳng hạn, ngƣời ta có thể nghĩ rằng nén văn bản có mất thông tin là không thể
chấp nhận đƣợc bởi vì họ nghĩ tới việc mất hoặc chuyển đổi các ký tự. Thay vì đó ta
có thể nghĩ tới một hệ thống các câu chuẩn, hoặc các từ thay thế bằng từ đồng
nghĩa, nhờ đó có thể nén tập tin tốt hơn. Về mặt kỹ thuật nén mất dữ liệu có thể gây
ra sự thay đổi của văn bản, nhƣng ý nghĩa và tính rõ ràng của văn bản vẫn có thể
đƣợc giữ nguyên hoặc thậm chí cải thiện.
Khi xét các thuật toán nén, điều quan trọng là cần phân biệt giữa hai thành
phần: mô hình và bộ mã hóa. Mô hình cho biết phân phối xác suất của các dãy tin
bằng cách nhận biết hoặc phát hiện cấu trúc của đầu vào. Bộ mã hóa tạo ra các dãy
mã dựa trên các xác suất tạo ra mô hình. Để có hiệu quả nén, bộ mã hóa thƣờng tạo
ra các dãy mã dài cho các dãy tin có xác suất thấp và gán dãy mã ngắn cho các dãy
tin có xác suất cao. Ví dụ, trong bảng chữ cái của một ngôn ngữ tự nhiên thƣờng có
một vài chữ cái xuất hiện trong các văn bản viết với xác suất cao hơn các chữ cái
khác, điều này còn rõ ràng hơn với các cặp chữ cái. Khi đó bộ mã hóa sẽ gán từ mã
có độ dài ngắn cho chữ cái xuất hiện với xác suất cao và ngƣợc lại. Thông thƣờng
6

sự tách biệt giữa mô hình và thành phần mã hóa không phải luôn luôn đƣợc xác
định một cách rõ ràng.
Lý thuyết thông tin là lĩnh vực có thể gắn mô hình với thành phần mã hóa.
Nó cho lý thuyết rất tốt sự liên quan giữa xác suất và độ dài từ mã. Lý thuyết này
phù hợp với thực tế gần nhƣ hoàn hảo, và chúng ta có thể đạt đƣợc độ dài mã gần
nhƣ giống hệt với những gì lý thuyết dự đoán.
Trong trƣờng hợp mã hóa có mất thông tin, ta có thể lấy tiêu chuẩn đánh giá
là thời gian nén, thời gian để tái tạo lại dãy tin ban đầu (giải mã) kích thƣớc của tệp
nén. Trong trƣờng hợp nén có mất thông tin, các tiêu chuẩn thƣờng là phức tạp hơn,
chẳng hạn xấp xỉ dãy tin ban đầu nhƣ thế nào đƣợc gọi là chấp nhận đƣợc. Thông
thƣờng cần dung hòa giữa kích thƣớc nén, thời gian chạy, và chất lƣợng dãy tin
đƣợc giải mã.

Nội dung luận văn bao gồm 3 chƣơng:
Chƣơng 1: CƠ SỞ LÝ THUYẾT
Trình bày các khái niệm cơ bản, lý thuyết chung về mã hóa, nén dữ liệu, các
định lý cơ bản về nén dữ liệu, lý thuyết về xử lý ảnh số.
Chƣơng 2: MỘT SỐ THUẬT TOÁN MÃ HÓA VÀ NÉN DỮ LIỆU.
Chƣơng này trình bày ý tƣởng và các thuật toán mã hóa và nén dữ liệu nhƣ:
RLE, HUFFMAN, JPEG, H.264/ACV, AIC.
Chƣơng 3: XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM
Chƣơng này trình bày các kết quả cài đặt và chạy thử nghiệm của các thuật
toán mã hóa và nén dữ liệu nhƣ: RLE, HUFFMAN, JPEG. Các kết quả so sánh với
các phần mềm hiện có.
7

Chƣơng 1
CƠ SỞ LÝ THUYẾT
1.1. Mã hóa thông tin
Để tìm hiểu về mã hóa thông tin, ta bắt đầu từ những khái niệm cơ bản sau:
Bảng chữ cái: Bảng chữ cái là tập bất kỳ hữu hạn các phần tử, khác rỗng. Mỗi
phần tử của bảng chữ cái gọi là kí tự.
Bản tin: Cho bản chữ cái A = {a
1
,a
2
, a
n
}, dãy X gồm các kí tự của A gọi là
bản tin. Bản tin theo nghĩa rộng nó có thể là bức ảnh, có thể là băng ghi âm thanh
v.v…, tuy nhiên khi thực hiện số hóa để lƣu trữ hay truyền đi vẫn phải sử dụng
bảng chữ cái nào đó.
Mã hoá: Giả sử có bảng chữ cái A = {a

1
,a
2
, ,a
n
}, X là một bản tin trên bảng
chữ cái A. Ta gọi bản tin Y trên bảng chữ cái B = {b
1
,b
2
,…,b
m
} là bản mã của bản
tin X nếu tồn tại ánh xạ f sao cho Y = f(X). Khi đó f đƣợc gọi là phép mã hóa.
Cách ghi mã: Có nhiều cách ghi mã, giả sử mã văn bản ngƣời ta hay sử dụng
những nhóm ký hiệu đƣợc phân cách bởi một dấu Space, cách mã nhƣ vậy gọi là mã
bằng phƣơng pháp từ. Mã chỉ sử dụng hai ký tự "0" và "1" để biểu diễn gọi là mã
nhị phân. Loại mã dùng ký hiệu bằng một nhóm ký tự có độ dài nhất định cho mỗi
từ mã là mã có độ dài cố định. Loại mã này ta luôn giải mã đƣợc. Nhƣng nếu lƣu trữ
nhƣ vậy sẽ rất tốn kém, nên ngƣời ta thƣờng dựa vào tần suất xuất hiện các chữ cái
để mã, với tần suất càng nhiều mã càng ngắn. Mã nhƣ vậy gọi là mã có độ dài thay
đổi. Tuy nhiên nếu độ dài của từ mã thay đổi thì không phải với ánh xạ mã nào cũng
có thể giải mã đƣợc.
Xét ví dụ ánh xạ mã: a  100; b  1000; c  0
Mã của "ac" và "b" đều là dãy bit "1000". Nhƣ vậy khi nhận đƣợc chuỗi bit
1000 chúng ta không thể biết đƣợc rằng văn bản ban đầu là "b" hay là "ac". Cho nên
khi mã hoá sử dụng mã có độ dài thay đổi cần có tính chất là giải mã đƣợc, đó là
tính phân tách. Tính phân tách đƣợc đƣa ra dƣới đây sẽ đảm bảo cho tính giải đƣợc
của mã.
8


Xét A và B là hai đoạn mã tạo ra từ các bít 0/1. Ta nói A là đầu của B nếu
nhƣ có một đoạn C sao cho B = A + C. Một tập hợp M tạo ra đƣợc gọi là phân tách
nếu không có đoạn nào là đầu của đoạn khác.
Nhƣ vậy, mã có độ dài từ mã cố định là mã phân tách.
1.2. Nén dữ liệu
Dữ liệu: Giả sử có bảng chữ cái A = {x
1
,x
2
, x
n
}, X là một bản tin trên bảng
chữ cái A. Ta gọi bản tin Y trên bảng chữ cái nhị phân B = {0,1} là bản mã của bản
tin X, nếu tồn tại ánh xạ f sao cho Y = f(X). Khi đó Y đƣợc gọi là dữ liệu của bản
tin X.
Nén dữ liệu: Ta kí hiệu L(Y) là số bít của bản tin Y. Giả sử L
f
(Y) là dung tích
dữ liệu của bản tin X với phép mã hóa f, việc tìm phép mã hóa g sao cho L
g
(Y) 
L
f
(Y) gọi nén dữ liệu.
Từ các khái niệm, định nghĩa nêu trên chúng ta dễ dàng nhận ra bản chất của
việc nén dữ liệu là đi tìm phép mã hóa bản tin sao cho dung tích dữ liệu của nó càng
nhỏ càng tốt. Một file dữ liệu không thể nén đến bao nhiêu tuỳ ý vẫn cần đảm bảo
sự tồn tại của dữ liệu đó. Một file dữ liệu chỉ có thể nén đến một giới hạn nhất định,
giới hạn ấy gọi Entropy. Entropy chỉ phụ thuộc vào dữ liệu, không phụ thuộc vào

thuật toán.
1.3. Entropy
* Độ đo Logarit của thông tin: Giả sử có hai biến ngẫu nhiên X và Y; X có thể
nhận các giá trị trong tập {x
1
,x
2
, ,x
n
} và Y có thể nhận giá trị trong tập
{y
1
,y
2
,…,y
m
}. Chúng ta cần xác định về mặt định lƣợng thông tin của sự kiện X = x
i

khi đã biết Y = y
j
. Rõ ràng là nếu X và Y là hai biến độc lập thì việc biết trƣớc
Y = y
j
thì không cho lƣợng thông tin nào về việc xảy ra X = x
i
. Mặt khác nếu X và
Y phụ thuộc nhau đầy đủ thì khi Y = y
j
xác định đƣợc X = x

i
thì nội dung thông tin
(Information Content) đơn giản đƣợc cho bởi X = x
i
. Khi đó thông tin có đƣợc về
việc xảy ra sự kiện X = x
i
nhờ đã xảy ra sự kiện Y = y
j
đƣợc tính bằng:
9

)(
)/(
log),(
i
ji
xp
yxp
ji
yxI 

ở đây kí hiệu: p(x
i
|y
j
) = p(X=x
i
|Y=y
j

) và p(X=x
i
) = p(x
i
)
Trong đó: I(x
i
,y
j
) số đo thông tin liên quan giữa x
i
và y
j
.
Đơn vị của I(x
i
,y
j
) đƣợc xác định bởi cơ số của Logarit ngƣời ta thƣờng lấy là
2 hoặc e, nếu cơ số là 2 ta gọi đơn vị của I là bit, nếu là e ta gọi là đơn vị tự nhiên.
Công thức chuyển đổi giữa các đơn vị là :
lna = ln2log
2
a = 0,69315log
2
a

Trƣờng hợp X và Y là hai biến độc lập thì p(x
i
|y

j
) = p(x
i
) khi đó từ công thức
1.1 suy ra I(x
i
,y
j
) = 0. Khi sự kiện Y = y
j
xảy ra, mà chắn chắn sự kiện X = x
i
xảy ra
thì: p(x
i
|y
j
) = 1. Khi đó công thức 1.1 có dạng:
I(x
i
,y
j
) = log 1/p(x
i
) hay I(x
i
,y
j
) = - log p(x
i

)
Công thức 1.3 chính là thông tin của sự kiện X = x
i
, có thể viết công thức 1.3
ở dạng:
I(x
i
) = - log p(x
i
)
Cần chú ý rằng từ 1.4 suy ra sự kiện có xác suất càng cao thì lƣợng thông tin
mang lại ít hơn sự kiện có xác suất thấp. Rõ ràng với sự kiện x bất kỳ mà p(x) = 1
thì I(x) = 0, nghĩa là việc xảy ra sự kiện x không mang lại lƣợng thông tin nào.
Xét ví dụ sau: Giả sử có nguồn rời rạc phát đi các bit 0, 1 với xác suất bằng
nhau bằng 1/2 trong t giây thông tin đƣa ra từ nguồn là:
I(x
i
) = - log
2
1/2 = 1 bit, ở đây x
i
= 0 hoặc x
i
= 1
Hoặc ví dụ khác: Giả sử xét mô hình thống kê độc lập. Xét dãy k bít của nguồn
phát đi, rõ ràng có tất cả M = 2
k
dãy k bit khác nhau do vậy các dãy này có xác suất
xuất hiện bằng nhau và bằng 1/2
k

.
. Khi đó:
I(x
i
) = - log
2
1/2
k
= k bit trong khoảng thời gian k.t
Nhƣ vậy có thể thấy độ đo Logarit của thông tin có tính chất cộng khi ta coi
đầu ra của nguồn ra là một dãy.
1.1
1.2
1.3
1.4
10

)(log)()()()(
11
i
n
i
i
n
i
ii
xPxPxIxPXH




),(),(),(
1 1
ji
n
i
m
j
ji
yxIyxPYXI

 

)()(
),(
1 1
),(),(
ji
ji
ypxp
yxP
n
i
m
j
ji
yxPYXI

 

Bây giờ chúng ta chú ý tới đẳng thức sau:

p(x
i
|y
j
)/p(x
i
) = p(x
i
|y
j
)p(y
j
)/p(x
i
)p(y
j
)
= p(x
i
,y
j
)/p(x
i
)p(y
j
)
= p(y
j
|x
i

)/p(y
j
)
Từ đây suy ra: I(x
i
,y
j
) = I(y
j
,x
i
)
Nhƣ vậy thông tin về sự kiện X = x
i
khi xảy ra sự kiện Y = y
j
đã xảy ra bằng
thông tin về sự kiện Y = y
j
khi sự kiện X = x
i
đã xảy ra.
Ngoài ra từ định nghĩa thông tin phụ thuộc lẫn nhau (Mutual Information) và
thông tin độc lập (Self Information) đƣợc dùng để xác định thông tin có điều kiện
(Condition self - Information)
I(x
i
|y
j
) = log [1/ p(x

i
|y
j
)] = -log p(x
i
|y
j
)
Kết hợp các đẳng thức 1.1 và 1.4 ta có:
I(x
i
,y
j
) = I(x
i
)- I(x
i
|y
j
)
Từ 1.7 có thể suy ra thông tin phụ thuộc lẫn nhau giữa các cặp sự kiện có thể
dƣơng, bằng 0 hoặc âm.
Trung bình của thông tin phụ thuộc: Từ định nghĩa thông tin phụ thuộc lẫn
nhau của các cặp sự kiện (x
i
, y
j
) của hai biến ngẫu nhiên X và Y, khi đó ta có thể
nhận đƣợc giá trị trung bình của thông tin phụ thuộc của hai biến ngẫu nhiên X, Y
có dạng:



Hay :

Ta thấy I(X,Y) = 0 khi X và Y độc lập, vậy một đặc trƣng quan trọng của
I(X,Y) là I(X,Y)  0. Tƣơng tự nhƣ vậy chúng ta định nghĩa thông tin trung bình:


Khi X là bảng chữ cái bao gồm các kí tự sinh ra nguồn, khi đó H(X) là trung
bình thông tin trên các kí tự.
1.5
1.6
1.7
1.8
1.9
1.10
11

)(log)()(
1
i
n
i
i
xPxPXH



Giả sử có không gian xác suất X = {x
1

,x
2
, ,x
n
}, xác suất xuất hiện các sự kiện
tƣơng ứng là P = {p
1
,p
2
, ,p
n
}. Khi đó giá trị trung bình thông tin H(X) của x
i
 X
làm xuất hiện sự kiện p
i
 P đƣợc gọi là Entropy. Công thức tính Entropy là:

Trong trƣờng hợp đặc biệt, khi mã các kí tự trong nguồn có xác suất nhƣ nhau
p(x
i
) = 1/n với i = 1, 2, … n. Khi đó:
n
nnnn
XH log)
1
log
1

1

log
1
()( 

Nói chung H(X)  logn cho tập nguồn gồm các chữ cái. Nói một cách khác
Entropy của nguồn rời rạc là cực đại khi các kí tự trong bảng chữ cái có xác xuất
bằng nhau.
1.4. Các kết quả cơ bản về nén dữ liệu
1.4.1. Phân loại nén dữ liệu
Kỹ thuật nén dữ liệu có thể đƣợc phân theo 2 hƣớng chính: Nén dữ liệu không
mất thông tin, nén dữ liệu có mất thông tin.
1.4.1.1. Nén dữ liệu không mất thông tin
Nén dữ liệu không mất thông tin đƣợc dùng với bản tin dạng văn bản. Do tính
chất quan trọng của dữ liệu, sau khôi phục dữ liệu phải giống hoàn toàn với dữ liệu
gốc. Ta định nghĩa nhƣ sau:
Gọi X là tệp dữ liệu gốc, Y là tệp dữ liệu đƣợc nén qua phép mã f với
L
f
(Y)  L(X). Nếu tồn tại một ánh xạ f
-1
sao cho X= f
-1
(Y) thì phép mã f gọi là nén
không mất thông tin.
1.4.1.2. Nén dữ liệu có mất thông tin
Nén dữ liệu có mất thông tin thƣờng sử dụng cho các bản tin là hình ảnh, âm
thanh hay video. Trong các bản tin này ngƣời ta thực hiện mã bằng cách loại bỏ đi
các yếu tố mà con ngƣời không thể nhận biết. Sau khi khôi phục, dữ liệu thu đƣợc
khác dữ liệu gốc, nhƣng sự sai khác đó có thể chấp nhận đƣợc.
1.11

1.12
12

Định nghĩa:
Gọi X là tệp dữ liệu gốc, Y là tệp dữ liệu đƣợc nén qua phép mã f sao cho
L
f
(Y)  L(X). Không tồn tại một ánh xạ f
-1
sao cho X = f
-1
(Y), thì phép mã f gọi là
nén có mất thông tin.
Sử dụng kỹ thuật nén có mất thông tin trong nén ảnh, ngƣời ta thực hiện
chuyển từ ảnh Bitmap sang ảnh Jpeg, ở đây sẽ chuyển từ hệ màu này sang hệ màu
khác mà hệ màu mới sẽ giảm bớt các mà mà mắt ngƣời ít cảm nhận thấy. Đối với
Video, thực chất là tập hợp của các ảnh liên tiếp thành các frame với số lƣợng thích
hợp mà mắt ngƣời không phân biệt sự thay đổi. Nhƣ vậy các ảnh gần nhau sẽ có
nhiều thông tin giống nhau. Do vậy khi nén, ngoài việc sử dụng kỹ thuật nén ảnh,
ngƣời ta quan tâm yếu tố nữa là giảm tốc độ chuyển động của các frame. Đối với
âm thanh, ngƣời ta thực hiện mã bằng cách tính toán tín hiệu gốc đƣa ra bộ tham số
đặc trƣng sau khi đã loại bỏ những yếu tố mà con ngƣời ít cảm nhận đƣợc. Việc lƣu
trữ, truyền tin và khôi phục dữ liệu đƣợc thực hiện trên bộ tham số này.
1.4.2. Các định lý về nén dữ liệu
1.4.2.1. Định lý cơ bản về nén dữ liệu
Cho bả ng chƣ̃ cá i A = {a
1
,a
2
, ,a

m
} vớ i xá c suấ t xuấ t hiệ n củ a cá c chƣ̃ cá i
tƣơng ƣ́ ng là p
1
= p(a
1
), p
2
= p(a
2
), , p
m
= p(a
m
).
Nế u văn bả n  =

1

2


n
đƣợ c sinh ra tƣ̀ việ c chọ n ngẫ u nhiên cá c chƣ̃ cá i
thì sẽ có xác suất xuất hiện là p() = p(

1
)p(

2

) p(

n
).
Nén văn bản không phả i là việ c cá c văn bả n bị ghi né n lạ i . Bản chất của các
thuậ t toá n né n văn bả n là ghi lạ i văn bả n (mã lại văn bản ) ở dạng khác . Xuấ t hiệ n
hai câu hỏ i: Câu hỏ i thƣ́ nhấ t có thể né n văn bả n trên nhỏ đế n bao nhiêu c ũng đƣợc
không hay là có mộ t giớ i hạ n nhấ t định nà o đó mà ta không thể vƣợ t qua đƣợ c;
Câu hỏ i thƣ́ hai có hay không mộ t thuậ t toá n né n tố t nhấ t.
Điề u kiệ n đầ u tiên để né n đƣợ c văn bả n là cá c văn bả n khá c nhau thì có cá c
file né n khá c nhau . Bở i nế u không thì ta không thể khôi phụ c lạ i văn bả n nguồ n .
Mọi văn bản không thể nén lại thành một file chỉ có 1 bit vì số lƣợ ng cá c file có 1
13




m
i
i
i
p
p
k
1
2
1
log
1



m
i
i
i
p
p
1
2
1
log
bit là 2. Mộ t qui trình né n nhƣ vậ y thì chỉ có thể dù ng để nén 2 văn bả n mà thôi đế n
văn bả n thƣ́ 3 là nội dung của file nén sẽ bị trùng lặp . Vậ y thì không thể né n mộ t
văn bả n nhỏ tù y ý đƣợ c . Giớ i hạ n né n củ a mộ t văn bả n là bao nhiêu ? Shannon là
ngƣờ i đầ u tiên chƣ́ ng minh đƣợ c sƣ̣ tồ n tạ i mộ t giớ i hạ n né n cho mỗ i văn bả n . Mộ t
văn bả n thƣ̣ c ra chỉ có thể né n đế n mộ t giớ i hạ n nhấ t đị nh , giớ i hạ n ấ y gọ i là lƣợ ng
tin củ a văn bả n. Lƣợ ng tin chỉ phụ thuộ c và o bả n thân văn bả n chƣ́ không phụ thuộ c
vào thuật toán nào. Mọi thuật toán đều không thể nén một văn bản đế n mộ t file nhỏ
hơn lƣợ ng tin mà văn bả n có . Lƣợ ng tin cò n đƣợ c gọ i là Entropy.
Đối với văn bản đƣợc sinh ra từ mô hình rời rạ c thì :
Entropy =
i
m
i
i
p
p
1
log
2

1



 Định lý Shannon
Xét các văn bản đƣợc tạo ra theo cách chọn ngẫu nhiên các chữ cái của bảng
chƣ̃ cá i A = {a
1
,a
2
, ,a
m
} vớ i xá c suấ t xuấ t hiệ n tƣơng ƣ́ ng p
1
 p
2
  p
m
> 0.
1. Vớ i mọ i mã nhị phân.
(a) Bit trung bì nh của mã thoả mãn



n
A
)(L)(p
n
1


i
m
i
i
p
p
1
log
2
1


.
(b) Vớ i hầ u hế t cá c văn bả n bit trung bình (cho mộ t chƣ̃ cá i ) của văn bản không
nhỏ hơn


m
1i
i
2i
p
1
logp
.
2. Tồ n tạ i mã nhị phân cho tƣ̀ ng khố i k chƣ̃ cá i có tí nh phân tá ch sao cho bit
trung bì nh (cho mộ t chƣ̃ cá i) của nó nằm giữa và

Nhƣ vậ y, định lý khẳ ng định rằ ng “ entropy đú ng là giớ i hạ n nhỏ nhấ t có thể mà
bít trung bì nh củ a mộ t mã né n nhị phân có th  đt đưc ” cho dù mã đƣợ c tạ o ra

theo bấ t cƣ́ cá ch nà o.
Định lý đã đƣợc chứng minh trong tài liệu tham khảo [1]
Ví d: Cho văn bả n sau
adbadacbdcbacbdbacbacdcdacbadacbdbacbacbacdbadacbacbacbadacbacbacbadcd
bacbadbacdbdcbacdacbacbacbacdda
1.13
14



m
i
ii
ap
1
)(

Có tất cả 30 chƣ̃ „a‟, 26 chƣ̃ „b‟, 26 chƣ̃ „c‟ và 19 chƣ̃ „d‟ đƣợ c sinh ra mộ t
cách ngẫu nhiên. Entropy = 1.98
Entropy =
)
101
19
log
101
19
101
26
log
101

26
101
26
log
101
26
101
30
log
101
30
(
2222

= 1.98
Tuy nhiên, văn bả n do con ngƣờ i tạ o ra không phải các chữ cái xuất hiện một
cách ngẫ u nhiên , đƣơng nhiên là phụ thuộ c lẫ n nhau tuân thủ theo cá c qui tắ c tạ o
tƣ̀ , tạo câu,
1.4.2.2. Mã Huffman
 Định nghĩ a
Cho bảng chữ cái A = {a
1
, a
2
, , a
m
} với xác suất xuất hiện tương ứng là
p
1



p
2




p
m
> 0.
 Xét mã trên A với các từ mã tương ứng dài

(a
1
),

(a
2
), ,

(a
m
).
 Một mã đưc gọi là tối ưu nếu bít trung bình của mã là nhỏ
nhất có th.
Chúng ta sẽ xét một loại mã cho mã tối ƣu. Đó là mã Huffman.
 Cách tạo mã Huffman:
Nế u bả ng chƣ̃ cá i chỉ có 2 chƣ̃ cái thì ta đánh mã chúng là "0" và "1".
Ta định nghĩ a mã Huffman cho bả ng có m chƣ̃ cá i bằ ng đệ qui nhƣ sau:
 Xế p bả ng chƣ̃ cá i theo thƣ́ tƣ̣ xá c suấ t xuấ t hiệ n củ a nó giả m dầ n

(p
1
p
2
 p
m
>0). Nhƣ vậ y chƣ̃ cá i ở cuố i bả ng là chữ cái có xác suất xuất
hiệ n nhỏ nhấ t.
 Ghép 2 chƣ̃ cá i vớ i xá c suấ t nhỏ nhấ t lạ i thà nh mộ t chƣ̃ cá i ké p vớ i xá c
suấ t xuấ t hiệ n là tổ ng củ a hai xá c suấ t ấ y . Nhƣ vậ y trong bả ng chƣ̃ cá i
mớ i 2 chƣ̃ cá i nà y bị loạ i nhƣng chƣ̃ cá i ké p đƣợ c thêm và o.
 Tạo mã Huffman cho bảng chữ cái mới này (có m - 1 chƣ̃ ).
 Tạo 2 tƣ̀ mã mớ i bằ ng cá ch thêm "0" và thêm "1" vào mã của chữ cái kép.
Gán 2 mã này cho 2 chƣ̃ cá i bị ghé p lạ i.
Ví d 1: Với không gian xá c suấ t cá c sƣ̣ kiệ n {e, a, i, o, u, ô} các xác suất tƣơng
ứng là (e,0.3) (a,0.2) (o,0.2) (i,0.1) (u,0.1) (ô,0.1) thì ta cần ghép 5 lầ n nhƣ sau:
15

e  0.3
e  0.3
e  0.3
{a,o}  0.4
{{{u,ô},i,
e}  0.6
{{{{u,ô},i},e,
{a,o}}  1.0
a  0.2
a  0.2
{{u,ô},i}0.3
e  0.3

{a,o} 0.4

o  0.2
o  0.2
a  0.2
{{u,ô},i}0.3


i  0.1
{u,ô}  0.2
o  0.2



u  0.1
i  0.1




ô  0.1















 Định lý :
o Mã Huffman là mã tối ưu.
o Đối với mã tối ƣu thì


m
1i
i
2i
p
1
logp



m
i
ii
p
1

 1+


m

1i
i
2i
p
1
logp
.
Bất đẳng thức thứ nhất đúng cho mã giải đưc bất kỳ.
Định lý đã đƣợ c chƣ́ ng minh trong tà i liệ u tham khảo [1]
{{{{u,«},i},e},{a,
o}}
{a,o}
{{{u,ô},i},e}
{{u,ô},i}
{u,ô}
1
1
0
0
0
0
1
1
1
0
o
a
e
i
ô

u
Bảng mã của các
chữ cái.
u0000
ô0001
i001
e01
a10
o11

Việc gán mã đƣợc thực hiện nhƣ sau:
16

kk
k
f





















2
51
5
1
2
51
5
1
2
1
m
f
2
51
log
1

1
1
log
2
2



m
f
m
2
51
log
2




m
i
ii
i
m
i
i
p
p
p
11
2
1
log

i
i
p



1
log
2
.13log
1
log
22

i
i
p

i
i
p


1
log
2
Ví d 2:
Nếu bảng có n chữ cái thì từ mã Huffman dài nhất có thể là bao nhiêu? Từ
mã dài nhất sẽ xảy ra cây nhị phân Huffman luôn lệch về một phía
nhƣ sau:


Xét bảng chữ cái có tần xuất tƣơng ứng {1,1,1,2,3,5,8, ,f
m
}. Trừ số hạng

đầu tiên còn lại là các số của dãy Fibonaci.
Công thức tổng quát là f
k
= f
k-1
+ f
k-2
. Ta đã biết
Tổng các tần xuất là f
m+2
. Trong quá trình đệ quy thì từ kép bao giờ cũng đứng ở vị
trí áp chót. Cần m bƣớc đệ quy nên từ mã ứng với xác suất dài m + 1. Đối
với mã Shannon thì độ dài từ mã xấp xỉ - log
2
f
m+2
. Nhƣ vậy, độ dài từ mã của chữ
cái này trong mã Huffman dài gấp lần độ dài từ mã của nó trong mã

Shannon (do tỷ số tiến tới < 1 khi m  ).
Nhƣ vậy không nhất thiết từ mã cho các chữ cái của mã tối ƣu luôn phải
ngắn nhất có thể. Thậm chí cũng không thể coi độ dài từ mã, ngay cả khi là mã tối
ƣu, là thƣớc đo lƣợng tin của phần tử.
Chú ý:
Mặc dù chúng ta đã biết đƣợc rằng với mọi mã giải đƣợc thì
Thế nhƣng đối với từng ký tự thì không có bất đẳng thức .
Ta có thể lấy ví dụ nhƣ sau: bảng chữ cái gồm 3 chữ “a”, “b”, “c” với xác
suất là 1/3, 1/3 và 1/3 thì mã hóa Huffman của chúng ta là “a”  “0”, “b”  “10”,
“c”  “11”. Nhƣ vậy, đối với chữ cái “a”, ta có tức là Nhƣng
đối với mã Shannon thì ta có .

0
0
0
1
1
1
17

1.5. Lý thuyết về hình ảnh
1.5.1. Giới thiệu về ảnh số và xử lý ảnh số
1.5.1.1. Ảnh số
Ảnh có thể biểu diễn dƣới dạng tín hiệu tƣơng tự hoặc tín hiệu số. Trong
biểu diễn số của các ảnh đa mức xám, một ảnh đƣợc biểu diễn dƣới dạng một ma
trận hai chiều. Mỗi phần tử của ma trận biểu diễn cho mức xám hay cƣờng độ của
ảnh tại vị trí đó. Mỗi phần tử trong ma trận đƣợc gọi là một phần tử ảnh, thông
thƣờng kí hiệu là PEL (Picture Element) hoặc là điểm ảnh (Pixel).
- Với ảnh đa cấp xám: Nếu dùng 8 bit (1 byte) để biểu diễn mức xám, thì số
các mức xám có thể biểu diễn đƣợc là 2
8
hay 256. Mỗi mức xám đƣợc biểu diễn
dƣới dạng là một số nguyên nằm trong khoảng từ 0 đến 255, với mức 0 biểu diễn
cho mức cƣờng độ đen nhất và 255 biểu diễn cho mức cƣờng độ sáng nhất.
- Với ảnh màu: Cách biểu diễn cũng tƣơng tự nhƣ với ảnh đen trắng, chỉ khác
là các số tại mỗi phần tử của ma trận biểu diễn cho ba màu riêng rẽ gồm: đỏ (red),
lục (green) và lam (blue). Để biểu diễn cho một điểm ảnh màu cần 24 bit, 24 bit này
đƣợc chia thành ba khoảng 8 bit. Mỗi khoảng này biểu diễn cho cƣờng độ sáng của
một trong các màu chính.













1.5.1.2. Xử lý ảnh số
Xử lý ảnh là một khoa học mặc dù còn tƣơng đối mới so với nhiều ngành
khoa học khác, nhất là trên quy mô công nghiệp. Xử lý ảnh số có rất nhiều ứng
Pixel or
PEL
o
r

P
E
L
Độ sáng trung bình trong mỗi hình
chữ nhật = giá trị một điểm ảnh.
Hình 1.1: Biu diễn một mức xám của ảnh số.
18

dụng nhƣ làm nổi các ảnh trong y học, khôi phục lại ảnh do tác động của khí quyển
trong thiên văn học, tăng cƣờng độ phân giải của ảnh truyền hình mà không cần
thay đổi cấu trúc bên trong của hệ thống chuyển tải, nén ảnh trong khi truyền đi xa
hoặc lƣu trữ. Các giai đoạn chính trong xử lý ảnh có thể đƣợc mô tả trong hình sau:













1.5.2. Mục đích và sự cần thiết của nén ảnh
Nén ảnh là một kỹ thuật mã hoá các ảnh số hoá nhằm giảm số lƣợng các bit
dữ liệu cần thiết để biểu diễn ảnh. Mục đích là giảm đi những chi phí trong việc lƣu
trữ ảnh và chi phí thời gian để truyền ảnh đi xa trong truyền thông nhƣng vẫn đảm
bảo đƣợc chất lƣợng của ảnh. Nén ảnh thực hiện đƣợc là do một thực tế: thông tin
trong bức ảnh không phải là ngẫu nhiên mà có trật tự, tổ chức. Vì thế nếu bóc tách
đƣợc tính trật tự, cấu trúc đó thì sẽ biết phần thông tin nào quan trọng nhất trong
bức ảnh để biểu diễn và truyền đi với số lƣợng ít bit hơn so với ảnh gốc mà vẫn đảm
bảo tính đầy đủ của thông tin. Ở bên nhận quá trình giải mã sẽ tổ chức, sắp xếp lại
đƣợc bức ảnh xấp xỉ gần chính xác so với ảnh gốc nhƣng vẫn thỏa mãn chất lƣợng
yêu cầu.
Dƣới đây là ví dụ về lƣu trữ ảnh số và truyền đi xa với đƣờng truyền 9600
baud (9600 bps) để thấy rõ sự cần thiết của việc nén ảnh:
 Ảnh đa cấp xám hay ảnh 256 màu có kích thƣớc 800x600, 8 bit/điểm ảnh,
cần 3.840.000 bit lƣu trữ và mất 6.67 phút để truyền.













Camera
SENSO
Thu nhËn
¶nh

L-u
tr÷
Ph©n tÝch
¶nh
L-u
HÖ quyÕt
®Þnh
NhËn
d¹ng
Hình 1.2: Các giai đon chính trong xử lý ảnh.
19

 Ảnh màu RGB (24 bit/điểm ảnh) cùng độ phân giải nhƣ vậy cần hơn 10 triệu
bit để lƣu trữ và 20 phút để truyền.
 Một phim âm bản có kích thƣớc 24x36 mm (35 mm) chia bằng các khoảng
cách nhau 12 âm, vào khoảng 3000x2000 điểm, 8 bit/pixel, yêu cầu 48 triệu
bit cho lƣu giữ ảnh và 83 phút để truyền.

Qua ví dụ trên ta thấy nhiều vấn đề trong việc lƣu trữ và truyền tải ảnh số
hoá. Nén ảnh có nhiều ứng dụng trong thực tế nhƣ: truyền các văn bản đồ hoạ qua
đƣờng điện thoại (Fax), nén ảnh trong y tế và truyền hình cáp, Chính sự ứng dụng
trong nhiều lĩnh vực của nén ảnh cùng với sự tiến bộ trong lĩnh vực vi điện tử dẫn
đến sự ra đời các chuẩn nén ảnh.
Nén ảnh đạt đƣợc bằng cách loại bỏ các phần dƣ thừa trong ảnh đã đƣợc số
hoá. Dƣ thừa có thể là dƣ thừa thông tin về không gian, dƣ thừa về cấp xám hay dƣ
thừa về thời gian:
 Dƣ thừa thông tin về không gian: trong một bức ảnh luôn tồn tại sự tƣơng
quan giữa các điểm ảnh cạnh nhau.
 Dƣ thừa thông tin về cấp xám: là dƣ thừa dựa vào sự tƣơng quan giữa các
màu sắc cạnh nhau.
 Dƣ thừa thông tin về thời gian: Trong một chuỗi ảnh video, tồn tại sự tƣơng
quan giữa các điểm ảnh của các frame khác nhau.
1.5.3. Phân loại các phương pháp nén ảnh
1.5.3.1. Các khái niệm cơ bản
 Pixel (picture element): phần tử ảnh.
Ảnh trong thực tế là một ảnh liên tục về không gian và về giá trị độ sáng. Để
có thể xử lý ảnh bằng máy tính cần thiết phải tiến hành số hoá ảnh.
Nhƣ vậy một ảnh là một tập hợp các pixel, mỗi pixel là gồm một cặp toạ độ
x, y và màu, cặp toạ độ x, y tạo nên độ phân giải (resolution), màn hình máy tính có
nhiều loại với độ phân giải khác nhau: 320x200, 640x350, 800x600, 1024x768, …
20

 Mức xám (Gray level)
Mức xám là kết quả sự mã hoá tƣơng ứng của mỗi cƣờng độ sáng của mỗi
điểm ảnh với một giá trị số – kết quả của quá trình lƣợng hoá.
 Dữ liệu
Trong một bài toán, dữ liệu bao gồm một tập các phần tử cơ sở mà ta gọi là
dữ liệu nguyên tử. Nó có thể là một chữ số, một ký tự, nhƣng cũng có thể là một

con số, một từ, điều đó phụ thuộc vào từng bài toán.
 Tỷ lệ nén
Tỷ lệ nén là một trong các đặc trƣng quan trọng của mọi phƣơng pháp nén. Tỷ
lệ nén đƣợc định nghĩa nhƣ sau:
Tỷ lệ nén = (1/r)*%
với r là tỷ số nén đƣợc định nghĩa:
r = kích thước dữ liệu gốc/kích thước dữ liệu nén.
Nhƣ vậy hiệu suất nén = (1- tỷ lệ nén)*100%.
+ Đối với ảnh tĩnh, kích thƣớc chính là số bit biểu diễn toàn bộ bức ảnh.
+ Đối với ảnh video, kích thƣớc chính là số bit để biểu diễn một khung hình
video (video frame).
1.5.3.2. Phân loi dựa vào nguyên lý nén
Nén bảo toàn thông tin (losses compression): bao gồm các phƣơng pháp nén
mà sau khi giải nén sẽ thu đƣợc chính xác dữ liệu gốc. Tuy nhiên nén bảo toàn
thông tin chỉ đạt hiệu quả nhỏ so với phƣơng pháp nén không bảo toàn thông tin.
Nén không bảo toàn thông tin (lossy compression): bao gồm các phƣơng
pháp nén sau khi giải nén sẽ không thu đƣợc dữ liệu nhƣ bản gốc. Các phƣơng pháp
này đƣợc gọi là “tâm lý thị giác” đó là lợi dụng tính chất của mắt ngƣời chấp nhận
một số vặn xoắn trong ảnh khi khôi phục lại. Phƣơng pháp này luôn đem lại hiệu
quả cao do loại bỏ đi những thông tin dƣ thừa không cần thiết.
1.5.3.3. Phân loi dựa vào cách thức thực hiện nén
Phƣơng pháp không gian (Spatial Data Compression): các phƣơng pháp này
thực hiện nén bằng cách tác động trực tiếp lên việc lấy mẫu của ảnh trong miền
không gian.
21

Phƣơng pháp sử dụng biến đổi (Transform Coding): gồm các phƣơng pháp
tác động lên sự biến đổi của ảnh gốc chứ không tác động trực tiếp.
1.5.3.4. Phân loi dựa vào lý thuyết mã hóa
Các phương pháp nén thế hệ thứ nhất: gồm các phƣơng pháp có mức độ tính

toán đơn giản nhƣ lấy mẫu, gán từ mã,
Các phương pháp nén thế hệ thứ hai: gồm các phƣơng pháp dựa vào mức độ
bão hoà của tỷ lệ nén bằng cách sử dụng các phép toán tổ hợp đầu ra một cách hợp
lý hoặc sử dụng biểu diễn ảnh nhƣ: phƣơng pháp kim tự tháp Laplace, phƣơng pháp
dựa vào vùng gia tăng, phƣơng pháp tách hợp.
1.5.3.5. Quá trình nén và giải nén
Gồm 2 công đoạn:
Nén: dữ liệu gốc qua bộ mã hoá dữ liệu, bộ mã hoá này thực hiện nén dữ liệu
đến một mức thích hợp cho việc lƣu trữ và truyền dẫn thông tin. Quá trình này sẽ
thực hiện việc loại bỏ hay cắt bớt những dƣ thừa của ảnh để thu đƣợc thông tin cần
thiết nhƣng vẫn đảm bảo đƣợc chất lƣợng ảnh.
Giải nén: dữ liệu nén đi qua bộ giải mã dữ liệu, bộ giải mã sẽ thực hiện giải
nén để thu đƣợc dữ liệu gốc ban đầu. Việc giải nén này thƣờng phải dựa vào các
thông tin đi kém theo dữ liệu nén, tuỳ thuộc vào kiểu nén hay phƣơng pháp nén mà
dữ liệu giải nén đƣợc có hoàn toàn giống với dữ liệu gốc ban đầu hay không.
Tóm lại quá trình nén và giải nén dữ liệu có thể mô tả một cách tóm tắt theo
sơ đồ dƣới đây:
Hình 1.3: Quá trình nén và giải nén.
Quá trình nén
Quá trình giải nén
Dữ liệu nén
Dữ liệu gốc
22

Chƣơng 2
MỘT SỐ THUẬT TOÁN MÃ HÓA VÀ NÉN DỮ LIỆU

2.1. Thuật toán HUFFMAN
2.1.1. Ý tưởng của thuật toán
Ý tƣởng của thuật toán mã hoá HUFFMAN là dựa vào mô hình thống kê.

Ngƣời ta tính tần suất xuất hiện của các ký tự bằng cách duyệt tuần tự từ đầu tệp
gốc đến cuối tệp. Việc xử lý ở đây tính theo bit. Trong phƣơng pháp này các ký tự
có tần suất cao thì đƣợc gán một từ mã ngắn, các ký tự có tần suất thấp thì đƣợc gán
một từ mã dài. Nhƣ vậy với cách thức này ta đã làm giảm chiều dài trung bình của
từ mã hoá bằng cách dùng các từ mã có độ dài khác nhau.
2.1.2. Thuật toán
 Thuật toán HUFFMAN gồm 2 bƣớc chính:
- Bước một:
Tính tần suất của các ký tự trong dữ liệu gốc bằng cách duyệt tệp gốc một
cách tuần tự từ đầu đến cuối để xây dựng bảng mã và tính toán tần suất. Tiếp theo
sau là sắp xếp lại bảng mã theo thứ tự tần suất giảm dần.
- Bước hai:
Duyệt bảng tần suất từ cuối lên đầu để thực hiện ghép hai phần tử có tần suất
thấp thành một phần tử duy nhất có tần suất bằng tổng hai tần suất thành phần. Cập
nhật phần tử này vào vị trí phù hợp trong bảng và loại bỏ hai phần tử đã xét. Thực
hiện cho đến khi bảng chỉ có một phần tử. Đây là quá trình tạo cây nhị phân
HUFFMAN, phần tử có tần suất thấp ở bên phải, phần tử kia ở bên trái. Sau khi cây
đã tạo xong ngƣời ta tiến hành gán mã cho các nút lá. Việc mã hoá thực hiện theo
quy định: mỗi lần xuống bên phải ta thêm một bit „1‟ vào từ mã, mỗi lần xuống bên
trái ta thêm một bit „0‟ vào từ mã.
Quá trình giải nén cũng khá đơn giản đƣợc tiến hành theo chiều ngƣợc lại.
Ngƣời ta cũng phải dựa vào bảng mã tạo ra trong giai đoạn nén (bảng này đƣợc lƣu
23

trữ trong cấu trúc đầu của tệp nén cùng với dữ liệu nén).
Ví d: Một tệp bất kỳ có tần suất xuất hiện của các kí tự số nhƣ bảng sau:

Ký tự
Tần suất
0

1532
1
152
2
323
3
412
4
226
5
385
6
602
7
92
8
112
9
87

Bảng tần suất sắp xếp giảm dần
Kí tự
Xác suất (%)
0
0.3906
6
0.1535
3
0.1051
5

0.0982
2
0.0824
4
0.0577
1
0.0388
8
0.0286
7
0.0235
9
0.0222

24


0
0.3906
0.3906
0.3906
0.3906
0.3906
0.3906
0.3906
0.3906
0.6100
6
0.1535
0.1535

0.1535
0.1535
0.1535
0.2016
0.2549
0.3551
0.3906
3
0.1051
0.1051
0.1051
0.1051
0.1498
0.1535
0.2016
0.2549

5
0.0982
0.0982
0.0982
0.1034
0.1051
0.1498
0.1535


2
0.0824
0.0824

0.0824
0.0982
0.1034
0.1051



4
0.0577
0.0577
0.0674
0.0824
0.0982




1
0.0388
0.0457
0.0577
0.0674





8
0.0286
0.0388

0.0457






7
0.0235
0.0286







9
0.0222









Mô tả: Ta tiến hành hợp nhất hay cộng 2 tần suất nhỏ nhất ở cuối bảng để
thu đƣợc giá trị tần suất mới sau đó đƣa giá trị này trở lại bảng tần suất ban đầu đã

bỏ đi 2 tần suất thành phần tạo thành nó. Sau khi đƣa giá trị mới vào bảng ta phải
tiến hành sắp xếp lại toàn bộ bảng, lúc này số lƣợng tần suất chỉ còn là (n – 1) nếu
ban đầu số lƣợng tần suất là n. Tiếp tục thực hiện lần lƣợt theo thứ tự nhƣ trên cho
đến khi nào số lƣợng tần suất chỉ còn lại duy nhất 1 giá trị.
 Việc tạo cây nhị phân đƣợc thực hiện theo một thuật toán sau:
1. Tất cả những ký tự ban đầu đƣợc xem nhƣ là những ký tự giao điểm tự do.
2. Hai nút tự do với tần số xuất hiện thấp nhất đƣợc phân công tới một nút
gốc với giá trị bằng với tổng của hai nút con tự do.
3. Hai nút con đƣợc chuyển khỏi danh sách nút tự do. Chuyển nút gốc mới
tạo thành công vào danh sách.
4. Bƣớc hai sang bƣớc ba đƣợc lặp cho đến khi chỉ có 1 nút tự do về phía
trái. Nút tự do này là gốc của cây.
Trong thuật toán mã HUFFMAN, mã của ký tự là duy nhất và không mã nào
là phần bắt đầu của mã trƣớc. Vì vậy khi đọc theo từng bit từ đầu đến cuối tệp nén
ta có thể duyệt cây mã cho đến một lá, tức là ký tự đã đƣợc giải mã. Việc giải mã
chắc chắn phải sử dụng cây nhị phân giống nhƣ trong mã hoá. Để đọc, giải mã đƣợc
yêu cầu phải sử dụng theo đúng tiêu chuẩn nhất định.








25

Ƣu điểm: của thuật toán mã hoá HUFFMAN là đạt đƣợc hệ số nén cao (Hệ
số nén tuỳ thuộc vào cấu trúc của các tập tin).
Nhƣợc điểm: bên nhận muốn giải mã đƣợc thông điệp thì phải có một bảng

mã giống nhƣ bảng mã ở bên gửi, do đó khi nén các tập tin bé hệ số nén không
đƣợc cao.
2.2. Thuật toán tách đoạn RLE (Run-length Coding)
Mã hoá theo độ dài loạt RLE (Run-Length Encoding) là một thuật toán nén
dựa trên sự cắt bớt các dƣ thừa về không gian (loại dƣ thừa đơn giản nhất trong một
tập tin là các đƣờng chạy dài gồm các kí tự lặp lại, một vài hình ảnh có vùng màu
lớn không đổi đặc biệt đối với ảnh nhị phân), các vùng dữ liệu hằng của các tập tin
chƣơng trình, một số tập tin văn bản, Loạt đƣợc định nghĩa là dãy các phần tử
điểm ảnh (pixel) liên tiếp có cùng chung một giá trị.
2.2.1. Ý tưởng của thuật toán
Ý tƣởng của thuật toán này là phát hiện một loạt các điểm ảnh lặp lại liên
tiếp, ví dụ: 110000000000000011. Ta thấy điểm ảnh có giá trị 0 xuất hiện nhiều lần
liên tiếp thay vì phải lƣu trữ toàn bộ các điểm ảnh có giá trị 0 ta chỉ cần lƣu trữ
chúng bằng cách sử dụng các cặp (độ dài loạt, giá trị).
Ví d 1:
Cho một chuỗi nguồn d :
d =5555555555191919191900000002323232323232323
Ta sẽ có chuỗi mới:
(10 5) (5 19) (7 0) (8 23)
Tỷ số nén = 20/8 = 2.5
Đối với ảnh đen trắng chỉ sử dụng 1 bit để biểu diễn 1 điểm ảnh thì phƣơng
pháp này tỏ ra rất hiệu quả, ta thấy điều đó qua ví dụ sau :

×