1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu thuật toán nén ảnh LZW (Có Source Code)

9 7,8K 192

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 150,5 KB

Nội dung

Phương pháp nén LZW•Phương pháp LZW hoạt động theo nguyên tắc là tạo ra một từ điển động theo dữ liệu của file ảnh. Từ điển là tập hợp những cặp Khoá và nghĩa của nó. Trong đó khoá được sắp xếp theo thứ tự nhất định, nghĩa là một chuỗi con trong dữ liệu ảnh. •Từ điển được xây dựng đồng thời với quá trình đọc dữ liệu. Sự có mặt của một chuỗi con trong từ điển khẳng định rằng chuỗi đó đã từng xuất hiện trong phần dữ liệu đã đọc. Thuật toán liên tục tra cứu và cập nhật từ điển sau mỗi lần đọc một ký tự ở dữ liệu đầu vào.•Do kích thước bộ nhớ không phải là vô hạn và để đảm bảo tốc độ tìm kiếm, người ta thường dùng từ điển với kích thước 4096 (212) phần tử.

Trang 1

Tìm hiểu thuật toán nén ảnh LZW

BÁO CÁO ĐỒ ÁN XỬ LÝ ẢNH:

TÌM HIỂU THUẬT TOÁN NÉN ẢNH LZW

Nội dung trình bày:

I Thuật toán LZW

2 Giải nén

3 Trường hợp đặc biệt

4 Danh gia

II Ví dụ

III Cài đặt

IV Hướng phát triển

V Tài liệu tham khảo

I.Phương pháp LZW

- Khái niệm nén từ điển được Jacob Lampel và Abraham Ziv đưa ra lần đầu tiên vào năm 1977 Sau đó phát triển thành một họ giải thuật nén từ điển LZ Năm 1984 Terry Welch đã cải tiến thuật giải LZ thành một họ giải thuật mới hiệu quả hơn và đặt tên là LZW

- Phương pháp LZW dựa trên việc xây dựng từ điển cho các “chuỗi ký tự” đã từng xuất hiện trong văn bản, những “chuỗi ký tự” xuất hiện sau đó sẽ được thay thế bằng mã của nó trong bảng từ điển

- Giải thuật LZW được sử dụng cho tất cả các loại file nhị phân Nó thường được dùng để nén các loại văn bản, ảnh đen trắng, ảnh màu … và là chuẩn nén cho các dạng ảnh GIF, TIFF… Mức độ hiệu quả của LZW không phụ thuộc vào số bít màu của ảnh

Phương pháp nén LZW

liệu của file ảnh Từ điển là tập hợp những cặp Khoá và nghĩa của nó Trong đó

khoá được sắp xếp theo thứ tự nhất định, nghĩa là một chuỗi con trong dữ liệu

ảnh

chuỗi con trong từ điển khẳng định rằng chuỗi đó đã từng xuất hiện trong phần

dữ liệu đã đọc Thuật toán liên tục tra cứu và cập nhật từ điển sau mỗi lần đọc một ký tự ở dữ liệu đầu vào

Trang 2

Tìm hiểu thuật toán nén ảnh LZW

Cấu trúc từ điển có dạng như sau:

đích việc dùng mã xóa nhằm khắc phục tình trạng số mẫu lặp trong ảnh lớn hơn 4096 Khi đó một ảnh được quan niệm là nhiều mảnh ảnh, và từ điển là một bộ từ điển gồm nhiều từ điển con Cứ hết một mảnh ảnh người ta lại gửi một mã xóa để báo hiệu kết thúc mảnh ảnh cũ, bắt đầu mảnh ảnh mới đồng thời khởi tạo lại từ điển cho mảnh ảnh mới

file ảnh có thể chứa nhiều ảnh (ví dụ ảnh GIF), khi đó mỗi ảnh sẽ được mã hóa riêng và mã EOI dùng để xác định điểm kết thúc thông tin của 1 ảnh

nà được sinh ra trong quá trình mã hoá

Trang 3

Tìm hiểu thuật toán nén ảnh LZW

Ý tưởng:Nếu còn dữ liệu đầu vào thì tiếp tục đọc.Một chuỗi mới sẽ được tạo ra từ một

chuỗi cũ(chuỗi này ban đầu rỗng,chuỗi này phải là chuỗi đã tồn tại trong từ điển) và kí

tự vừa đọc vào.Sau đó kiểm tra xem chuỗi mới đã có trong từ điển hay chưa.Mục đích của công việc này là hy vọng tìm được chuỗi có số ký tự lớn nhất đã tồn tại trong từ điển.Nếu tồn tại ta lại tiếp tục đọc một ký tự tiếp theo và lặp lại công việc.Nếu chưa có trong từ điển,thì gửi chuỗi cũ ra ngoài và thêm chuỗi mới vào từ điển

Chức năng của các hàm:

-Giá trị cờ INPUT=true khi vẫn còn dữ liệu đầu vào và ngược lại

-InitDictionary():Hàm này có chức năng khởi tạo từ điển.Đặt giá trị cho 255 phần đầu tiên.Gán mã xóa(Clear Code) cho phần tử thứ 256 và mã kết thúc thông tin(End of Information) cho phần tử thứ 257.Xóa giá trị tất cả các phần tử còn lại

-Hàm Output():gửi chuỗi bit ra file.Chuỗi bit này có độ dài là 9,10,11,hoặc 12 tùy thuộc vào vị trí trong từ điển của từ mã gửi ra.Các chuỗi bít này được nối tiếp vào với nhau -Hàm GetNextChar():Trả về một ký tự đầu vào.Hàm này cập nhật giá trị của cờ INPUT xác định xem còn dữ liệu đầu vào nữa hay không?

-Hàm AddtoDictionary() sẽ được gọi khi có một mẫu mới xuất hiện.Hàm này sẽ cập nhật mẫu này vào phần tử tiếp theo trong từ điển.Nếu từ điển đã đầy nó sẽ gửi ra từ mã xóa(Clear Code) và gọi đến hàm InitDictionary() để khởi tạo lại từ điển

-Hàm Code():Tr v mã tả về mã tương ứng với chuỗi ề mã tương ứng với chuỗi ương ứng với chuỗing ng v i chu iứng với chuỗi ới chuỗi ỗiVề trang đầu

B t ắt đầu đầuu

InitDictionary() Output(Clear_Code) OldStr=NULL

Newchar=GetNextChar() NewStr=OldStr+NewChar

OldStr=NewStr

Output(Code(OldStr) Output(EOI)

K t thúcết thúc

Output(Code(OldStr) AddtoDictionary(NewStr)

InitDictionary(

NewStr)

INPUT

Trang 4

Tìm hiểu thuật toán nén ảnh LZW

2.Quá trình giải nén:Giải thuật giải nén gần như ngược với giải thuật nén.Với giải

thuật nén,một từ mã ứng với một chuỗi sẽ được ghi ra tệp khi chuỗi ghép bởi chuỗi trên với ký tự vừa đọc chưa có trong từ điển.Người ta cũng cập nhật ngay vào từ điển từ mã ứng với chuỗi tạo bởi chuỗi cũ với ký tự vừa đọc.Ký tự này đồng thời là ký tự đầu tiên trong chuỗi ứng với từ mã sẽ được ghi ra tiếp theo.Đây là điểm mấu chốt cho phép xây dựng thuật toán giải nén

Thuật toán giải nén được mô tả như sau:

While(GetNextCode()!=EOI) do

Begin

If FIRST_CODE /*Mã đầu tiên của mỗi mảnh ảnh*/

Then Begin

Outbuff(code);

OldStr:=code;

End

If code==CC /*Mã xóa*/

Then Begin

InitDictionary();

FIRST_CODE=true;

End NewStr:=DeCode(code);

Outbuff(NewStr);

OldString=OldStr+FirstChar(NewStr);

AddtoDictionary(OldStr);

OldString:=NewStr;

End

Chức năng của các hàm:

-GetNextCode():Đọc thông tin đầu vào(dữ liệu nén) trả về mã tương ứng

-Outbuff():Gửi chuỗi giá trị đã giải mã ra vùng đệm

-Decode():Tra cứu từ điển và trả về chuỗi ký tự tương ứng với từ mã

-FirstChar():Lấy ký tự đầu tiên của một chuỗi

3.Trường hợp đặc biệt

- Giải thuật LZW như trên có thể dẫn đến một tình huống là quá trình nén thì thực hiện được, còn quá trình giải nén thì “không” thực hiện được

- Tình huống đó sảy ra như sau: giả sử c là một kí tự, S là một chuỗi (có độ dài lớn hơn 0); mã k của từ điển chứa giá trị là cS Nếu chuỗi vào tiếp theo là cScSc, khi đọc đến cSc chương trình sẽ tạo mã k' chứa cSc (vì cS đã có mã là k), theo thuật

Trang 5

Tìm hiểu thuật toán nén ảnh LZW

toán nén ký tự c được giữ lại và chương trình đọc tiếp xâu S, ký tự c để hình thành

từ cSc, khi đó mã k’ sẽ được dùng thay cho cSc

Trong chương trình giải nén, k' sẽ xuất hiện trước khi nó được định nghĩa Rất may

là từ mã vừa đọc trong trường hợp này bao giờ cũng có nội dung trùng với tổ hợp của từ mã cũ với kí tự đầu tiên của nó Điều này giúp cho quá trình cài đặt chương trình khắc phục được trường hợp ngoại lệ một cách dễ dàng

4.Đánh giá thuật toán LZW

Thuật toán LZW đặc biệt có hiệu quả khi sử dụng để nén file văn bản vì độ lặp lại của

ký tự là lớn

-Tỉ lệ nén:2÷5

-Độ phức tạp:Đơn giản

-Tốc độ nén:Bình thường

-Ứng dụng:Áp dụng cho tất cả các file nhị phân.Thường dùng để nén các loại văn bản,ảnh đen trắng,ảnh màu,ảnh đa mức xám và là chuẩn nén cho các định dạng ảnh GIF và TIFF.Mức độ hiệu quả của LZW không phụ thuộc vào số bít màu của ảnh

II.Ví dụ: Cho chuỗi đầu vào là “ABCBCABCABCD” (Mã ASCII của A - 65; B - 66; C

- 67; D - 68)

a)nén: Về trang đầu

Từ điểm được khởi tạo đến khoá 257, và tiếp tục được xây dựng trong quá trình mã hoá chuỗi vào như sau:

ABC

ABCD chưa có trong TD=>Thêm vào TD mã 264 đại diện cho ABCD

Chuỗi mã hoá sẽ là: 65 - 66 - 67 - 259 - 258 - 67 - 262 - 68

b) giải nén: Về trang đầu

Quá trình giải nén được thực hiện tương tự quá trình nén, một từ mã ứng với một chuỗi

sẽ được ghi ra tệp khi chuỗi ghép bởi chuổi trên với ký tự vừa đọc chưa có trong từ điển, đồng thời cập nhật ngay vào từ điển từ mã ứng với chuỗi tạo bởi chuỗi cũ với ký

tự vừa đọc, và kí tự vừa đọc được dùng làm ký tự đầu trong chuỗi ứng với từ mã sẽ được ghi ra tiếp theo

Ví dụ, giải nén chuỗi đã mã hoá: 65 - 66 - 67 - 259 - 258 - 67 - 262 - 68

Khởi tạo từ điểm với 258 từ mã (từ khoá 0 đến 257) như phần mã hoá

Trang 6

Tìm hiểu thuật toán nén ảnh LZW

ra A, giữ lại B)

ra B, giữ lại C) BC

AB

(258) BC BCA chưa có trong TD => Thêm vào TD mã 261 đại diện cho BCA (ghi ra BC, giữa lại AB) C

(67)

(ghi ra AB, giữ lại C) ABC

D

(68)

ABC ABCD chưa có trong TD=>Thêm vào TD mã 264 đại diện cho

ABCD (ghi ra ABC, giữ lại D)

Kết quả giải nén: “ABCBCABCABCD”

c)Trường hợp “đặc biệt” Về trang đầu

Quá trình nén: Kh i t o 258 t mã cho b ng mã ASCII + CC + EOIởi tạo 258 từ mã cho bảng mã ASCII + CC + EOI ạo 258 từ mã cho bảng mã ASCII + CC + EOI ừ mã cho bảng mã ASCII + CC + EOI ả về mã tương ứng với chuỗi

Kết quả: 65 - 66- 258 - 67 - 68 - 260 - 263 - 69

Gi i nén:ả về mã tương ứng với chuỗi

Trang 7

Tìm hiểu thuật toán nén ảnh LZW

III.Cài đặt

+)Để chạy được chương trình,máy tính cần phải cài đặt NET Framework 2.0 trở lên +)Thực chất chương trình em cài đặt áp dụng để nén tất cả các file nhị phân,trong đó có file ảnh.Chương trình được viết trên ngôn ngữ C#

+)Trong chương trình em xây dựng 2 lớp hỗ trợ đó là:

a)lớp LZWDictionary để biểu diễn cấu trúc dữ liệu dạng từ điển,có các phương thức chính sau:

Init():Khởi tạo từ điển với 256 mã ASCII ban đầu

Add(int code,string word):Thêm từ vào từ điển

ContainsCode(int code):Kiểm tra xem từ điển có chứa mã không

ContainsWord(string word):Kiểm tra từ điển có chứa từ không

GetCode(string word):Trả lại mã tương ứng với từ

DeCode(int code):Trả lại từ tương ứng với mã

b)Lớp Convert hỗ trợ các phương thức tĩnh chuyển đổi qua lại giữa byte,bít

ToInt(string bits):Chuyển chuỗi bít thành giá trị kiểu int

ToBits(int n):Chuyển giá trị kiểu int sang chuỗi biểu diễn dạng nhị phân

ASCIIDecode(byte b):Chuyển mã ASCII sang ký tự biểu diễn nó

+)Lớp LZW là lớp quan trọng nhất có 2 phương thức tĩnh thực hiện nén và giải nén Compress(string srcFile,string desFile):Nén file có tên srcFile(gồm cả đường dẫn),kết qủa lưu thành file desFile(gồm cả đường dẫn)

Decompress(string srcFile,string desFile):Gỉai nén file đã nén srcFile(gồm cả đường dẫn),kết quả lưu thành file desFile(gồm cả đường dẫn)

+)Qúa trình nén:Chương trình đọc từng khối byte của file cần nén cho đến khi hết file.Đối với mỗi khối byte đọc được,đưa vào bộ đệm.Duyệt từng byte trong bộ đệm và

xử lý theo thuật toán,mỗi byte sẽ được mã hóa thành một chuỗi bít có độ dài cố định là 12.Lưu các chuỗi bit đã mã hóa thành một chuỗi,sau đó chia chuỗi này thành các chuỗi con có độ dài là 8(tương ứng với một byte),chuyển chuỗi này thành byte và ghi ra file kết quả.Nếu chia chuỗi bị lẻ thì thêm vào một số bit cho chẵn.Cuối cùng thêm vào

Trang 8

Tìm hiểu thuật toán nén ảnh LZW

chuỗi đầu ra một byte cờ để xác định chuỗi lẻ byte hay chẵn.Byte cờ này có giá trị bằng

1 nếu lẻ và có giá trị là 0 nếu chẵn

+)Qúa trình giải nén:Chương trình cũng đọc từng khối byte của file cần giải nén cho đến hết file.Đối với mỗi khối byte đọc được,đưa vào bộ đệm.Chuyển khối byte trong bộ đệm thành chuỗi bit.Chia chuỗi bít này thành các chuỗi con có độ dài cố định là 12,mỗi chuỗi con này sẽ tương ứng với một ký tự đã được mã hóa.Duyệt các chuỗi con này theo thuật toán.Mỗi chuỗi sẽ được giải nén thành các ký tự,lưu thành chuỗi ký tự.Cuối

IV.Hướng phát triển,cải tiến

-Thuật toán này sử dụng chuỗi nén có độ dài cố định là 12 bít để mã hóa cho1 byte dữ liệu có độ dài là 8 bít.Như thế dung lượng tăng lên 4 bít.Điều này không thực sự hiệu quả,một số trường hợp file nén có dung lượng lớn hơn file ban đầu.Nói chung tỉ lệ nén

sẽ thấp.Ta có thể dùng chuỗi bít có độ dài thay đổi để mã hóa cho 1 byte dữ liệu.Chuỗi bit này ban đầu có độ dài 9 bít và sẽ tăng dần lên 10,11,và 12 bít.Điều này có thể làm tăng tỉ lệ nén,nhưng sẽ có khó khăn khi giải nén vì khi đọc dữ liệu đã được nén để giải nén thì ta phải xác định tại thời điểm đó ta phải đọc 9 bít hay 10 bít,

-Đối với việc cài đặt thuật toán này,có thể cải tiến từ điển để giảm thời gian tìm kiếm trong từ điển.Trong phần cài đặt em đã sử dụng cấu trúc dữ liệu được hỗ trợ sẵn bởi ngôn ngữ lập trình,đó là lớp Dictionary<Tkey,Tvalue>.Khi xác định xem một chuỗi có trong từ điển hay chưa,chương trình cài đặt phải duyệt lần lượt tất cả các phần tử của từ điển.Điều này sẽ làm chương trình chạy rất chậm nếu từ điển có số lượng từ lớn và file đầu vào có dung lượng lớn

-Đây là một trong các thuật toán nén thế hệ thứ nhất.Ngoài ra còn có các thuật toán nén

trang đầu

V.Tài liệu tham khảo

2.http://www.codeproject.net(keyword:LZW)

3.Wikipedia(keyword: Lempel-Ziv-Welch,LZW)

4.Nhập môn Xử lý ảnh số-NXB Khoa học và Kỹ thuật(Chương 8)

Lương Mạnh Bá-Nguyễn Thanh Thủy-Trường Đại học Bách khoa Hà Nội

Về trang đầu

Trang 9

Tìm hiểu thuật toán nén ảnh LZW

Ngày đăng: 20/10/2014, 13:14

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w