Tải bản đầy đủ (.doc) (69 trang)

Tìm hiểu một số phương pháp nén ả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 (562.12 KB, 69 trang )

Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Lời cảm ơn !
Em xin bày tỏ lòng biết ơn sâu sắc nhất tới PGS. TS. Ngô Quốc Tạo,
thầy đã tận tình hớng dẫn và giúp đỡ em rất nhiều trong quá trình thực tập
và tìm hiểu nghiên cứu đề tài đợc giao để em có thể hoàn thành tốt báo cáo
tốt nghiệp của mình.
Em xin chân thành cảm ơn sự dạy bảo của các thầy giáo, cô giáo Khoa
Công Nghệ Thông Tin - Trờng Đại học Dân Lập Hải Phòng đã trang bị cho
em những kiến thức cơ bản để em có thể hoàn thành báo cáo tốt nghiệp về
đề tài đợc giao.
Trong quá trình nghiên cứu đề tài mặc dù đã đợc các thầy cô giáo hớng
dẫn tận tình nhng do nhiều nguyên nhân chủ quan và khách quan nên đề tài
không tránh khỏi sai sót .Em rất mong đợc các thầy cô giáo chỉ dẫn ,đóng
góp những ý kiến quý báu giúp em hoàn thiện hơn báo cáo tốt nghiệp , phát
triển và mở rộng đề tài đựoc giao .
Em xin chân thành cám ơn !
Hải Phòng, ngày

tháng

năm 2007

Sinh viên
Tạ Minh Thắng

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 1




Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Mục lục

Mở đầu
Ngày nay, cùng với sự phát triển không ngừng của khoa học và công
nghệ thì máy tính đóng vai trò ngày càng quan trọng và không thể thiếu
trong cuộc sống xã hội loài ngời. Việc trao đổi thông tin của con ngời trong
tất cả các ngành, các lĩnh vực của đời sống ngày càng trở nên cần thiết cùng
với sự ra đời và phát triển của mạng Internet.
Xử lý ảnh là một ngành khoa học còn tơng đối mới mẻ so với nhiều
ngành khoa học khác nhng nó đang đợc tập trung nghiên cứu và phát triển vì
những ứng dụng thực tiễn của nó trong nhiều ngành , lĩnh vực khác nhau.
Trong đó Nén ảnh là một phần của xử lý ảnh có ứng dụng to lớn trong
truyền thông và trong lu trữ, đã có rất nhiều phơng pháp nén ảnh đợc ra đời
và không ngừng đợc cải tiến để ngày càng hoàn thiện đem lại hiệu quả nén
cao và cho chất lợng ảnh tốt nhất. Trong đồ án tốt nghiệp TìM hiểu một
số phơng pháp nén ảnh đợc sự hớng dẫn của PGS .TS . Ngô Quốc
Tạo em đã đi sâu nghiên cứu một số phơng pháp nén ảnh phổ biến nh : mã
loạt dài RLE, HUFFMAN, LZW, JPEG và phơng pháp nén ảnh JPEG2000
dựa trên biến đổi Wavelet với những đặc tính vợt trội so với các chuẩn nén
trớc đó đem lại hiệu quả nén cao , cho ảnh nén chất lợng tốt và nhiều những
u điểm khác mà các chuẩn nén trớc đó không thể có.
Nội dung đồ án tốt nghiệp bao gồm các phần chính nh : chơng một giới
thiệu tổng quan về xử lý ảnh, mục đích chơng này là giới thiệu một số khái
niệm cần biết về ảnh số và xử lý ảnh số. Chơng hai sẽ giới thiệu một số phơng pháp nén ảnh và cách phân loại các phơng pháp nén ảnh. Chơng ba sẽ

giới thiệu về chơng trình thử nghiệm và kết quả đạt đựơc của chơng trình.

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 2


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Cuối cùng sẽ là phần kết luận đánh giá kết quả nghiên cứu thu đợc và hớng
phát triển của đề tài.

CHơng I:
Giới thiệu tổng quan về nén ảnh
I.1.Giới thiệu về ảnh số và xử lý ảnh số:
I.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à 28 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

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 3


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

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.

Pixel
or PEL

Độ 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 của một mức xám của ảnh số.
I.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 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 lu trữ.
Các giai đoạn chính trong xử lý ảnh có thể đợc mô tả trong hình sau:
Lưu trữ

CAMERA

Thu nhận
ảnh

Số hoá

Phân
tích ảnh

Nhận dạng
ddạngạng

SENSOR

Lưu trữ

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Hệ quyết
định

Trang : 4


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

I.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 lu trữ ảnh và chi phí thời gian để truyền ảnh đi xa trong truyền
thông nhng 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 nhng vẫn thỏa mãn chất lợng yêu cầu. Dới đây là ví
dụ về lu 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 800 x 600, 8 bit/điểm
ảnh, cần 3.840.000 bit lu trữ và mất 6.67 phút để truyền.

ả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 để lu trữ và 20 phút để truyền.

Một phim âm bản có kích thớc 24 ì 36 mm (35 mm) chia bằng các
khoảng cách nhau 12 àm, vào khoảng 3000 ì 2000 điểm, 8 bit / pixel, yêu
cầu 48 triệu bit cho lu giữ ảnh và 83 phút để truyền.
Qua ví dụ trên ta thấy nhiều vấn đề trong việc lu 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.

Sinh viên thực hiện : Tạ Minh Thắng CT 702


Trang : 5


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp 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 .

I.3.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: 320 x 200, 640x350, 800x600,
1024x768,

Mức xám (Graylevel)
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ự, ... nhng 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.

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 6


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Nén dữ liệu
Nén dữ liệu là quả trình giảm dung lợng thông tin d thừa trong dữ liệu
gốc và làm cho lợng thông tin thu đợc sau nén thờng nhỏ hơn dữ liệu gốc rất
nhiều. Do vậy, tiết kiệm đợc bộ nhớ và giảm thời gian trao đổi dữ liệu trên
mạng thông tin mà lại cho phép chúng ta khôi phục lại dữ liệu ban đầu.

Tỷ lệ nén
Tỷ lệ nén là một trong các đặc trng 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).

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 7


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Chơng II:
Các phơng pháp nén ảnh
II.1.Cách phân loại các phơng pháp nén ảnh:
II.1.1.Cách 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.

II.1.2.Cách 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.

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.

II.1.3.Cách phân loại dựa vào lý thuyết mã hoá:

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 8


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

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.
II.1.4.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 lu 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 nhng 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:

Quá trình nén
Dữ liệu gốc

Dữ liệu nén
Quá trình giải nén

Hình 2.1 : Quá trình nén và giải nén

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 9


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

II.2.Phơng pháp mã hoá độ dài loạt RLE:
Mã hoá theo độ dài loạt RLE (Run Length Encoding) là một phơng pháp
nén ảnh dựa trên sự cắt bớt các d thừa về không gian (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). 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ị.
II.2.1.Nguyên tắc :
Nguyên tắc của phơng pháp 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 lu trữ toàn bộ các điểm ảnh có giá trị 0

ta chỉ cần lu trữ chúng bằng cách sử dụng các cặp (độ dài loạt, giá trị).
Ví dụ:
Cho một chuỗi nguồn d :
d =5 5 5 5 5 5 5 5 5 5 19 19 19 19 19 0 0 0 0 0 0 0 23 23 23 23 23 23 23 23
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 :
Cho một chuỗi nguồn d:
000000000000000111111111100000000001111111111000000000000000
Ta có chuỗi mới :
(15, 10, 10, 10, 15)
Tỷ số nén = 60 bit / (5*4 bit) = 3 ( chỉ sử dụng 4 bit để thể hiện độ dài
loạt và không thể hiện giá trị loạt vì ảnh đen trắng chỉ có 2 giá trị bit là 0
hoặc là 1)
Chú ý:

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 10


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Đối với ảnh chiều dài của một dãy lặp có thể lớn hơn 255, nếu ta dùng 1
byte để lu trữ chiều dài thì sẽ không đủ. Giải pháp đợc dùng là tách chuỗi đó
thành 2 chuỗi: một chuỗi có chiều dài là 255, chuỗi kia có chiều dài còn lại.


Phơng pháp nén RLE chỉ đạt hiệu quả khi chuỗi lặp lớn hơn 1 ngỡng
nhất định nào đó hay nói các khác trong ảnh cần nén phải có nhiều điểm ảnh
kề nhau có cùng giá trị màu.Do đó phơng pháp này không đem lại cho ta kết
quả một cách ổn định vì nó phụ thuộc hoàn toàn vào ảnh nén chỉ thích hợp
cho những ảnh đen trắng hay ảnh đa cấp xám.
Ví dụ:
Ta có một chuỗi nguồn: d=5 7 9 11 13 18 28 38 48 58 30 35 40 45
Chuỗi kết quả sau khi mã hoá :
1 5 1 7 1 9 1 11 1 3 1 18 1 28 1 38 1 48 1 58 1 30 1 35 1 40 1 45
Tỷ số nén = 14 / 28 = 0.2
Nh vậy chuỗi sau khi mã hoá đã lớn hơn nhiều chuỗi nguồn ban đầu. Do
đó cần phơng pháp cải tiến để xử lý những trờng hợp nh trên tránh làm mở
rộng chuỗi dữ liệu nguồn nghĩa là chỉ mã hoá độ dài loạt dữ liệu lặp lại. Ngời ta đã đa ra cách đó là thêm kí tự tiền tố vào trớc độ dài loạt, việc giải mã
đợc thực hiện nếu gặp kí tự tiền tố với độ dài loạt và giá trị điểm ảnh theo
sau.
Ví dụ:
Ta có chuỗi nguồn :
d = 5 8 4 8 8 8 8 8 8 8 8 10 10 10 10 10 10 10 10 10
Giả sử kí tự tiền tố là + ta có : 5 8 4 +7 8 + 9 10
Tỷ số nén = 19 / 9 = 2.1
Tuy nhiên trong một số trờng hợp các điểm ảnh có độ tơng quan với nhau
vể giá trị mức xám nh trong ví dụ dới đây ta có thể tiến hành xử lý nh sau.

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 11


Đồ án tốt nghiệp


Tìm hiểu một số phơng pháp nén ảnh

Ví dụ:
Ta có một chuỗi nguồn:
d = 5 7 9 11 13 18 28 38 48 58 55 60 65 70 75 80 85 90 95 100
Ta có dựa vào độ tơng quan này để có đợc hiệu quả nén cao , bằng
việc áp dụng e(i) = d(i) d(i-1) sẽ thu đợc :
5 2 2 2 2 5 10 10 10 10 -3 5 5 5 5 5 5 5 5 5
áp dụng phơng pháp nén loạt dài ta dễ dàng thu đợc :
(5 1)( 2 4)(5 1)(10 5)(-3 1)(5 9)
II.2.2.Thuật toán:
Thuật toán nh sau :

Tiến hành duyệt trên từng hàng cho đến khi kết thúc vùng dữ liệu
ảnh, trong quá trình duyệt tiến hành kiểm tra để tìm ra những loạt có cùng
giá trị đồng thời chú ý những kí hiệu xuống dòng (hay kết thúc dòng) ,kết
thúc ảnh Bitmap,

Khi gặp loạt có độ dài > 3 thì nhảy đến chế độ nén ngợc lại nhảy đến
chế độ không nén tuy nhiên nếu loạt > 255 thì sẽ tách ra chỉ mã < 255 sau
đó mã tiếp phần còn lại. Ngoài ra còn các chế độ khác nh : bắt đầu , kết thúc
1 dòng.



Kết thúc khi gặp kí hiệu kết thúc bitmap ( end o f- bitmap)

II.2.3.Một số thủ tục chơng trình :

Chơng trình nén theo phơng pháp RLE :


Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 12


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

void CRLE::CompressInRLE8(BYTE*pSrcBits,CByteArray& pRLEBits, int&
RLE_size)
{
int line;
int src_index = 0, dst_index = 0, counter, i;
for ( line = 0; line < m_dib.dsBmih.biHeight; line++)
{
state_start:
if ( EndOfLine(src_index))
{
pRLEBits[dst_index++] = 1;
pRLEBits[dst_index++] = pSrcBits[src_index];
src_index++;
goto end_of_line;
}
if(pSrcBits[src_index]==pSrcBits[src_index+1]) goto tate_compress;
if ( EndOfLine(src_index+1))
{
pRLEBits[dst_index++] = 1;
pRLEBits[dst_index++] = pSrcBits[src_index++];

pRLEBits[dst_index++] = 1;
pRLEBits[dst_index++] = pSrcBits[src_index++];
goto end_of_line;
}
if (pSrcBits[src_index+1] == pSrcBits[src_index+2])
{
pRLEBits[dst_index++] = 1;
pRLEBits[dst_index++] = pSrcBits[src_index++];
goto state_compress;
}
else

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 13


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

goto state_no_compress;
state_compress:
for ( counter = 1; counter <= 254; counter++)
{
if ( pSrcBits[src_index+counter] != pSrcBits[src_index] )
break;
if ( EndOfLine(src_index+counter) )
{
pRLEBits[dst_index++] = counter+1;

pRLEBits[dst_index++] = pSrcBits[src_index];
src_index += counter +1;
goto end_of_line;
}
}
pRLEBits[dst_index++] = counter;
pRLEBits[dst_index++] = pSrcBits[src_index];
src_index += counter;
goto state_start;
state_no_compress:
for (counter = 2; counter <= 254; counter++)
{
if ( EndOfLine(src_index+counter) ) {
pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = counter + 1;
for (i = counter + 1; i > 0; i--)
pRLEBits[dst_index++]=pSrcBits[src_index++];
if ( 0 != ((counter+1) % 2) ) pRLEBits[dst_index++];
goto end_of_line;
}
if(EndOfLine(src_index+counter+1) ||
pSrcBits[src_index+counter] != pSrcBits[src_index+counter+1] )

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 14


§å ¸n tèt nghiÖp


T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

continue;
if(EndOfLine(src_index+counter+2) ||
SrcBits[src_index+counter+1] != pSrcBits[src_index+counter+2] )
continue;
else
{
if ( counter > 2) counter--;
pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = counter+1;
for (i = counter+1; i > 0; i--)
pRLEBits[dst_index++] = pSrcBits[src_index++];
if ( 0 != ((counter+1) % 2) ) pRLEBits[dst_index++];
goto state_compress;
}
}
pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = counter;
for (i = counter; i > 0; i--)
pRLEBits[dst_index++] = pSrcBits[src_index++];
if ( 0 != ((counter) % 2) )
pRLEBits[dst_index++];
goto state_start;
end_of_line:
if ( 0 != (src_index % 4 ))
{
int pad = 4 - (src_index%4);
src_index += pad;
}

pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = 0;
}

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 15


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = 1;
RLE_size = dst_index;
}

• Ch¬ng tr×nh gi¶i nÐn ph¬ng ph¸p RLE :
BOOL CRLE::DecRLE8(ifstream &fil, BYTE *pDest)
{
DWORD x, y, paddedwidth;
paddedwidth =BMPWIDTHBYTES(pInfo->biWidth*pInfo-> biBitCount);
BYTE FirstByte, SecondByte;
WORD data;
x = y = 0;
while (!fil.eof())
{
if (!fil.read((char*)&data, 2)) return FALSE;
FirstByte = LOBYTE(data);

SecondByte = HIBYTE(data);
if (FirstByte == 0)
{
switch (SecondByte)
{
case 0:
x = 0;
y++;
break;
case 1:
return TRUE;
case 2:
if (!fil.read((char*)&data, 2)) return FALSE;

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 16


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

x += LOBYTE(data);
y += HIBYTE(data);
break;
default:
char ch;
for (BYTE i = 0; i < SecondByte; i++)
{

if (!fil.get(ch)) return FALSE;
pDest[paddedwidth * y + x++] = (BYTE)ch;
}
if ((SecondByte % 2) == 1)
if (!fil.get(ch)) return FALSE;
}
}
else
{
for (BYTE i = 0; i < FirstByte; i++)
pDest[paddedwidth * y + x++] = SecondByte;
}
}
return FALSE;
}

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 17


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

II.3.Phơng pháp mã hoá Huffman:
II.3.1. Nguyên tắc:
Phơng pháp mã hoá Huffman là phơng pháp 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 một từ mã ngắn, các ký tự có tần suất thấp 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 chiều dài biến đổi tuy nhiên cũng có trờng hợp bị
thiệt 1 ít bit khi tần suất là rất thấp.
II.3.2. Thuật toán:

Thuật toán mã hoá 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ã.

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 18


Đồ án tốt nghiệp


Tìm hiểu một số phơng pháp nén ảnh

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
lu 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ự
0

Tần suất
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ự
0

Xác suất (%)
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


Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 19


Đồ án tốt nghiệp

0
6
3
5
2
4
1
8
7
9

0.3905
0.1535
0.1051
0.0982
0.0824
0.0577
0.0457
0.0388

0.3905
0.1535

0.1051
0.0982
0.0824
0.0577
0.0388
0.0286
0.0235

Tìm hiểu một số phơng pháp nén ảnh

0.3905
0.1535
0.1051
0.0982
0.0824
0.0674
0.0577

0.3906
0.1535
0.1051
0.1034
0.0982
0.0824

0.3905
0.1535
0.1498
0.1051
0.1034


0.3905
0.2016
0.1535
0.1498
0.1051

0.3905
0.2549
0.2016
0.1535

0.3905
0.3551
0.2549

0.0982

0.0674

0.0457

0.0286

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 thực hiện theo một thuật toán sau:

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 20

0.6100
0.3905


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

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.
0635241879

B0

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.

Quá 0trình
cây nhị phân Huffman
6 3 5 xây
2 4 1 dựng
8
0 6 3 5đợc
2 4 thể hiện chi tiết nh
B2
trong hình sau :
1
9
B1

7

8

06352

B3

0635

B4
4

2
9

7


063

B5

1

B6

8

06
3

5

4

2
1

9

7

0

B7

0


B8
5

8

6
6

4
7

5

9

Sinh viên thực hiện : Tạ Minh Thắng CT 702
4

7

3

2
1

9

Trang : 21
8



Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh

Hình 2.3 : Quá trình tạo cây nhị phân
Ta có cây mã Huffman tơng ứng nh sau :
0

1

0

6
5

3

2
1

4
7

8

9

Bảng từ mã gán cho các kí tự số nh sau:

Kí tự
0


1

6

001

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 22


Đồ án tốt nghiệp

Tìm hiểu một số phơng pháp nén ảnh
3

011

5

0001

2

0100


4

00000

1

01010

8

01011

7

000010

9

000011

Nh vậy với ví dụ sau đây ta có thể tiến hành mã hoá nh sau:
Chuỗi nguồn : 00000000006666693333 kích thớc = 20*8=160 bit
Sử dụng mã Huffman theo bảng trên
kích thớc =10*1+5*3+1*6+4*3= 43 bit
Vì gía trị trị 0 xuất hiện 10 lần nhng chỉ dùng 1 bit để thể hiện, giá trị 6
xuất hiện 5 lần dùng 3 bit để thể hiện ,giá trị 9 dùng 6 bit và giá trị 3 xuất
hiện 4 lần dùng 3 bit để thể hiện.
Tỷ số nén = 160 / 43 = 3.7

Trong phơng pháp 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 .
II.3.3.Một số thủ tục chơng trình :

Chơng trình nén phơng pháp HUFFMAN :
bool CompressHuffman(BYTE*pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen)

Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang : 23


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

{
CHuffmanNode nodes[511];
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
int nNodeCount = GetHuffmanTree(nodes);
int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
nDesLen = nSrcLen+nNodeCount*nNodeSize;
pDes = (BYTE*)malloc(nDesLen);
BYTE *pDesPtr = pDes;

memset(pDesPtr, 0, nDesLen);
*(DWORD*)pDesPtr = nSrcLen;
pDesPtr += sizeof(DWORD);
*pDesPtr = nNodeCount-1;
pDesPtr += sizeof(BYTE);
for(nCount = 0; nCount < nNodeCount; nCount++)
{
memcpy(pDesPtr, &nodes[nCount], nNodeSize);
pDesPtr += nNodeSize;
}
qsort(nodes, 256, sizeof(CHuffmanNode), asciiCompare);
int nDesIndex = 0;
for(nCount = 0; nCount < nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex>>3))|=nodes[pSrc[nCount]].dwCode<<
(nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
nDesLen = (pDesPtr-pDes)+(nDesIndex+7)/8;

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 24


§å ¸n tèt nghiÖp

T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh

pDes = (BYTE*)realloc(pDes, nDesLen);

return true;
}

• Ch¬ng tr×nh gi¶i nÐn ph¬ng ph¸p HUFFMAN :
bool

DecompressHuffman(BYTE*pSrc,int

nSrcLen,BYTE*&pDes,

int

&nDesLen)
{
nDesLen = *(DWORD*)pSrc;
pDes = (BYTE*)malloc(nDesLen+1);
int nNodeCount = *(pSrc+sizeof(DWORD))+1;
CHuffmanNode nodes[511], *pNode;
int nNodeSize = sizeof(DWORD)+sizeof(BYTE), nSrcIndex = nNodeSize;
for(int nCount = 0; nCount < nNodeCount; nCount++)
{

memcpy(&nodes[nCount], pSrc+nSrcIndex, nNodeSize);
nSrcIndex += nNodeSize;

}
GetHuffmanTree(nodes, false);
CHuffmanNode *pRoot = &nodes[0];
while(pRoot->pParent)
pRoot = pRoot->pParent;

int nDesIndex = 0;
DWORD nCode;
nSrcIndex <<= 3;
while(nDesIndex < nDesLen)
{

nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7);

Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702

Trang : 25


×