Kỹ thuật nén Lampel Z

Một phần của tài liệu Giáo trình Phân tích thiết kế thuật toán (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề (Trang 47 - 51)

II. Một số phương pháp nén dữ liệu

Như vậy bộ mã tối ưu tương ứng là

7.8 Kỹ thuật nén Lampel Z

Thực ra thì khơng phải cứ dữ liệu multimedia là người ta dùng phương pháp nén có hao hụt, ví dụ như định dạng ảnh GIF lại dùng giải thuật nén LZW để nén nhưng như đã nói ở trên LZW là nén bảo toàn nên cũng dùng “từ điển” để nén (thực tế người ta gọi là bảng màu và tối đa của ảnh GIF bạn có thể lập bảng chưa 256 màu). Giải thuật Lempel-Ziv-Welch (LZW) và kỹ thuật mã hóa kiểu Huffman phân tích và quan sát các đoạn lặp lại. Nếu LZW hoặc Huffman thấy có đoạn 010101, chúng đủ thông minh đánh dấu các đoạn như vậy và thay bằng một ký tự, bằng cách đó dữ liệu được nén lại. Do những giới hạn đó, người ta đã đưa ra định dạng mới trong nén ảnh đó là JPEG (viết tắt của Joint Photographic Expert Group - tổ chức sáng lập ra chuẩn này). Trên thực tế JPEG có cả hai định dạng là lossless compression và lossy compression nhưng hầu như không ai chấp nhận định dạng lossless compression cả do chất lượng ảnh thì quả là giữ ngun được thật nhưng dung lượng thì khơng hề giảm. Trong khi đó dạng lossy compression của JPEG lại cho ta được kết quả tuyệt vời, tỉ số nén dao động từ 1:1 (lossless compression) cho tới 100:1 (tối đa), tất nhiên để có được tỉ số nén càng cao chúng ta càng phải hy sinh chất lượng của ảnh. Thường thì theo những người có kinh nghiệm, tỉ sô nén 10:1 là đem lại kết quả hoàn mỹ nhất.

Nén theo chuẩn JPEG là một tiến trình nhiều bước. Trước hết là bước qui tắc hóa (regularizing stage) để làm cho ảnh có nhiều đoạn giống nhau hơn thực tế. Ảnh màu được chuyển sang dạng YUV hoặc CIELAB, trong đó thơng tin về độ sáng (luminance) được tách rời với thông tin về độ màu (chrominance). Một yếu tố được tính tới là mắt người ta nhạy cảm với những thay đổi nhỏ về độ sáng hơn là những thay đổi về màu sắc, đặc biệt ở đầu xanh của phổ màu. Ngồi ra cách làm này cịn khai thác thực tế là ảnh thường có nhiều vùng lớn tại đó các điểm kế nhau rất giống nhau về kênh màu.

Bước tiếp theo là lấy mẫu cho các kênh màu. Ðây là 1 trong 2 công đoạn làm mất thông tin và chỉ thực hiện khi bạn chọn xác lập high compression/low quality (tỉ lệ nén cao/chất lượng thấp) của JPEG.

Lấy mẫu (subsampling) nghĩa là loại bỏ có hệ thống các thông tin màu sắc đối với các hàng hoặc cột điểm ở tỉ lệ cho trước. Nếu bạn thực hiện cứ hai hàng loại bỏ một hàng và hai cột loại bỏ một cột, bạn giảm được dữ liệu màu đi 75%. Khi giải nén ảnh, giá trị của các điểm loại bỏ trước đó được ngoại suy từ những gì cịn lại.

Bước tiếp là sắp xếp lại dữ liệu bằng hàm toán học gọi là DCT (Discrete Cosine Transform). Làm việc với các khối điểm 8x8 pixel, hàm DCT phân tích các tần số vùng theo cả chiều ngang lẫn chiều dọc. Công đoạn này được gọi là lượng tử hóa (quantization) - cách gọi kỹ thuật của bước làm giảm số bit cần thiết để biểu diễn mổi giá trị tần suất. Các giá trị này được nén trung thực trước hết bằng RLE sau đó mã hóa theo kỹ thuật Huffman. Ðây là công đoạn của JPEG cho phép đạt tỉ số nén rất cao.

Quá trình giải nén (decompression) là quá trình ngược lại. Dữ liệu được giải mã bằng thuật toán Huffman, các giá trị kết quả được nhân lên, hàm DCT ngược được áp dụng, các vùng luminance và chrominance được chuyển trở lại RGB để trơ lại ảnh bitmap (Ảnh được lưu theo dạng ánh xạ bit).

Cũng tương tự như JPEG, giải thật nén tương tự được áp dụng cho định dạng MPEG (Layer 1,2,3 và 4) giúp giảm kích thước các laọi phim ảnh (MPEG Layer 1,2 và 4) và âm thanh (MPEG Layer 3).

Sau đây là ví dụ về mã giải của quá trình nén theo gải thuật Huffman:

WHILE (there are more characters) {

code=HuffCode[character].code ; get huffman code size=HuffCode[character].size ; get code size i=size

WHILE(i)

{sendbit(code) ; send MSB of code I<<1 ; select next bit i-- ; increment # bits sent } ENDWHILE

} ENDWHILE

Còn đây là mã giả cho quá trình giải nén của thuật Huffman :

TreeNode=RootNode Repeat Until at a leaf {

TreeNode=Tree.right ; assume right child branch if (inputbit==0) TreeNode=Tree.left ; if 0, traverse left child branch }

Output(TreeNode);

Resource :

Sample Chapte : Data compression : www.dspguide.com/datacomp.htm Data compression :

http://www.ganssle.com/articles/acompres.htm Theory of Data Compression :

http://www.data-compression.com/theory.shtml Lossless Data Compression :

http://www.data-compression.com/lossless.shtml Define : Compression :

Phân tích thiết kế thuật tốn

Một phần của tài liệu Giáo trình Phân tích thiết kế thuật toán (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề (Trang 47 - 51)

Tải bản đầy đủ (PDF)

(77 trang)