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

Báo cáo tìm hiểu một số phương pháp nén ảnh

71 1,4K 4
Tài liệu đã được kiểm tra trùng lặp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tìm Hiểu Một Số Phương Pháp Nén Ảnh
Tác giả Tạ Minh Thắng
Người hướng dẫn PGS. TS. Ngô Quốc Tạo
Trường học Đại học
Chuyên ngành Công nghệ thông tin
Thể loại đồ án tốt nghiệp
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 71
Dung lượng 818,22 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Báo cáo tìm hiểu một số phương pháp nén ảnh

Trang 1

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

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 nhưng 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 lưu 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

Trang 2

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

của chương trì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

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

Trang 3

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

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

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 lưu trữ

Các giai đoạn chính trong xử lý ảnh có thể được mô tả trong hình sau:

Độ sáng trung bình trong mỗi hình chữ nhật = giá trị một điểm ảnh

Số tích ảnhPhân

Hệ quyết định

Nhận dạng

Lưu trữ

Lưu

Trang 4

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

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 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 800 x 600, 8 bit/điểm ảnh, cần 3.840.000 bit lưu 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 để lưu 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 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

Trang 5

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

đồ 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

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

Trang 6

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

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

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 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)

Trang 7

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

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:

Trang 8

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

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á:

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

Trang 9

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

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 2.1 : Quá trình nén và giải nén

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 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ụ:

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

Quá trình nén Quá trình giải nén

Dữ liệu

Dữ liệu

Trang 10

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

Đố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:

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

Trang 11

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

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

Trang 12

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

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 :

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)) {

Trang 13

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

13

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++];

goto state_compress;

} else 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) ) {

Trang 14

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

} pRLEBits[dst_index++] = counter;

} if(EndOfLine(src_index+counter+1) ||

pSrcBits[src_index+counter] != pSrcBits[src_index+counter+1] ) continue;

if(EndOfLine(src_index+counter+2) ||

SrcBits[src_index+counter+1] != pSrcBits[src_index+counter+2] )

Trang 15

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

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;

Chương trình giải nén phương pháp RLE :

BOOL CRLE::DecRLE8(ifstream &fil, BYTE *pDest)

{

DWORD x, y, paddedwidth;

Trang 16

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

paddedwidth =BMPWIDTHBYTES(pInfo->biWidth*pInfo-> biBitCount); BYTE FirstByte, SecondByte;

Trang 17

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

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

Trang 18

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

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ã

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

0 1532

Trang 19

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

0.3905 0.1535 0.1051 0.0982 0.0824 0.0674 0.0577 0.0457

0.3906

0.1051 0.1034 0.0982 0.0824 0.0674

0.3905 0.1535 0.1498 0.1051 0.1034 0.0982

0.3905 0.2016 0.1535 0.1498 0.1051

0.3905 0.2549 0.2016 0.1535

0.3905 0.3551 0.2549

Trang 20

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

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:

1 Tất cả những ký tự ban đầu được xem như là những ký tự giao điểm

Trang 21

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

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

Trang 22

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

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

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

Trang 23

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

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 nhưng 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

qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);

int nNodeCount = GetHuffmanTree(nodes);

int nNodeSize = sizeof(DWORD)+sizeof(BYTE);

nDesLen = nSrcLen+nNodeCount*nNodeSize;

Trang 24

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

Trang 25

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

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++)

Trang 26

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

và được đặt tên là LZW ( Lempe – Ziv - Welch) Phương pháp này xây dựng từ điển lưu các chuỗi ký tự có tần suất lặp lại cao và thay thế bằng từ

mã tương ứng mỗi khi gặp lại chúng, nó hay hơn các phương pháp trước đó

ở kỹ thuật tổ chức từ điển cho phép nâng cao tỷ lệ nén

Giải thuật LZW được dùng cho tất cả các loại file nhị phân, thường được dùng để nén các loại dữ liệu như : văn bản, ảnh đen trắng, ảnh màu, ảnh đa cấp sám… và là chuẩn nén cho các dạng ảnh GIF và TIFF Số bit / pixel không ảnh hưởng đến hiệu quả của LZW

II.4.1.Nguyên tắc:

Giải thuật nén LZW xây dựng một từ điển lưu các mẫu có tần suất

xuất hiện cao trong ảnh Từ điển là tập hợp những cặp (từ vựng và nghĩa của

từ vựng) Trong đó từ vựng sẽ là các từ mã đượ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

song song với quá trình đọc dữ liệu Sự xuất hiện của 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 đã đựoc đọc qua Thuật toán liên tục tra cứu và sau mỗi lần đọc một ký tự ở dữ liệu đầu vào thì tiến hành cập nhật lại từ điển

Trang 27

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

Do giới hạn của bộ nhớ và để đảm bảo tốc độ tìm kiếm nhanh, từ điển chỉ giới hạn 4096 phần tử dùng để lưu trữ giá trị của các từ mã Như vậy độ dài lớn nhất của từ mã là 12 bit (4096=212) Cấu trúc từ điển như sau:

256 từ mã đầu tiên theo thứ tự từ 0 … 255 chứa các số nguyên từ 0 …

255 Đây là mã của 256 kí tự cơ bản trong bảng mã ASCII

Từ mã thứ 256 chứa một mã đặc biệt là mã xoá (CC - Clear Code)

Khi số mẫu lặp lớn hơn 4096 thì người ta sẽ coi ảnh gồm nhiều mảnh ảnh và

từ điển sẽ gồm nhiều từ điển con Khi hết một mảnh ảnh sẽ gửi 1 mã xoá (

CC ) để báo hiệu kết thúc mảnh ảnh cũ và bắt đầu mảnh ảnh mới đồng thời

sẽ khởi tạo lại từ điển

Trang 28

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

Từ mã thứ 257 chứa mã kết thúc thông tin (EOI - End Of

Information) Thông thường một file ảnh GIF có thể chứa nhiều mảnh ảnh,

mỗi mảnh ảnh này sẽ được mã hoá riêng Chương trình giải mã sẽ lặp đi lặp lại thao tác giải mã từng ảnh cho đến khi gặp mã kết thúc thông tin thì dừng lại

Các từ mã còn lại (từ 258 đến 4095) chứa các mẫu thường lặp lại trong ảnh 512 phần tử đầu tiên của từ điển biểu diễn bằng 9 bit Các từ mã từ 512 đến 1023 biểu diễn bởi 10 bit, từ 1024 đến 2047 biểu diễn bởi 11 bit, và từ

2048 đến 4095 biểu diễn bởi 12 bit

Ví dụ : Cho chuỗi đầu vào “HELLOHELLOHELL”

Từ điền ban đầu đã gồm 256 kí tự cơ bản

Kích thước đầu vào : 14 x 8 = 112 bit

Đầu vào Đầu ra Thực hiện

H(72) H đã có trong từ điển Æ đọc tiếp

E(69) 72 Thêm vào từ điển mã 258 đại diện cho chuỗi HE L(76) 69 Thêm vào từ điển mã 259 đại diện cho chuỗi EL

L 76 Thêm vào từ điển mã 260 đại diện cho chuỗi LL O(79) 76 Thêm vào từ điển mã 261 đại diện cho chuỗi LO

H 79 Thêm vào từ điển mã 262 đại diện cho chuỗi OH

E HE đã có trong từ điển Æ đọc tiếp

L 258 Thêm vào từ điển mã 263 đại diện cho chuỗi HEL

L LL đã có trong từ điển Æ đọc tiếp

O 260 Thêm vào từ điển mã 264 đại diện cho chuỗi LLO

H OH đã có trong từ điển Æ đọc tiếp

E 262 Thêm vào từ điển mã 265 đại diện cho chuỗi OHE

Trang 29

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

L EL đã có trong từ điển Æ đọc tiếp

L 259 Thêm vào từ điển mã 266 đại diện cho chuỗi ELL

76 Input = FALSE EOI

Chuỗi đầu ra là : 72 69 76 76 79 258 260 262 259 76

Kích thước đầu ra : 6 x 8 + 4 x 9 = 84 bit

Tỷ số nén : 112 / 84 = 1.3

Quá trình giải nén thực hiện như sau:

Code OutBuff() AddToDictionary()

Trang 30

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

Chuỗi thu được sau giải nén :”HELLOHELLOHELL”

II.4.2 Thuật toán:

NewStr = OldStr + NewChar

IF ( InDictionary(NewStr) ) OldsSr = NewStr ELSE

Trang 31

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

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

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

Hàm InitDictionary() : Khởi tạo từ điển Đặt giá trị cho 256 phần

tử đầu tiên Gán mã xoá CC cho phần tử thứ 256 và mã kết thúc thông tin EOI cho phần tử thứ 257 Xoá giá trị tất cả các phần tử còn lại

Hàm InDictionary (NewStr) : Kiểm tra chuỗi NewStr đã có trong

từ điển chưa

Hàm OutPut() : Gửi chuỗi bit ra file.Tuỳ thuộc vào vị trí của từ

mã trong từ điển mà chuỗi bit có độ dài là 9,10,11 hoặc 12

Hàm GetNextChar() : Trả về một ký tự từ chuỗi ký tự đầu vào

Hàm này cập nhật giá trị cờ Input xác định xem còn dữ liệu đầu vào nữa hay không

Hàm AddToDictionary() : Hàm làm chức năng cập nhật mẫu mới

vào phần tử tiếp theo trong từ điển Nếu từ điển đã đầy nó sẽ gửi ra mã

xoá CC và gọi đến hàm InitDictionary() để khởi tạo lại từ điển

Hàm Code() : Trả về từ mã ứng với 1 chuỗi

Tư tưởng của đoạn mã trên có thể hiểu như sau: 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ừ 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à hi vọng tìm được chuỗi có só ký tự lớn nhất trong

từ điển Nếu tồn tại thì 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

Trang 32

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

Giải nén dữ liệu bằng LZW:

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ó mặt 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

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

WHILE (GetNextCode() != EOI)

{

IF (code == CC) /*Mã xoá*/

{ InitDictionary()

Trang 33

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

Hàm OutBuff() : Hàm này gửi chuỗi đã giải mã ra vùng nhớ đệm

Hàm InitDictionary(): Khởi tạo từ điển Đặt giá trị cho 256 phần tử

đầu tiên Gán mã xoá CC cho phần tử thứ 256 và mã kết thúc thông tin EOI cho phần tử thứ 257 Xoá giá trị tất cả các phần tử còn lại

Hàm DeCode() : Hàm này tra cứu từ điển và trả về chuỗi ký tự tương

ứng với mã

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

xác định nối tiếp vào chuỗi ký tự cũ (đã giải mã ở bước trước) ta được chuỗi ký tự có mặt trong từ điển khi nén Chuỗi này sẽ được thêm vào

từ điển giải nén

Hàm AddToDictionary() : Hàm làm chức năng cập nhật mẫu mới vào

phần tử tiếp theo trong từ điển Nếu từ điển đã đầy nó sẽ gửi ra mã xoá

CC và gọi đến hàm InitDictionary() để khởi tạo lại từ điển

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

Trang 34

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

CalculateBitSize(resAdd);

dictionary to entry %d.",prefix, readByte, resAdd);

Log(logString);

Trang 35

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

Chương trình giải nén phương pháp LZW :

BOOL CLZW::Decompress(CFile &source, CFile &destination)

Ngày đăng: 01/03/2013, 17:00

HÌNH ẢNH LIÊN QUAN

Hình 2.1 : Quá trình nén và giải nén - Báo cáo tìm hiểu một số phương pháp nén ảnh
Hình 2.1 Quá trình nén và giải nén (Trang 9)
Bảng tần suất sắp xếp giảm dần - Báo cáo tìm hiểu một số phương pháp nén ảnh
Bảng t ần suất sắp xếp giảm dần (Trang 19)
Bảng  lượng - Báo cáo tìm hiểu một số phương pháp nén ảnh
ng lượng (Trang 38)
Bảng  mã Khối - Báo cáo tìm hiểu một số phương pháp nén ảnh
ng mã Khối (Trang 38)
Hình 2.5.3: Mô tả giải thuật biến đổi nhanh - Báo cáo tìm hiểu một số phương pháp nén ảnh
Hình 2.5.3 Mô tả giải thuật biến đổi nhanh (Trang 41)
Hình 2.5.4 : Sơ đồ biến đổi Cosin ngược      C. Lượng tử hoá - Báo cáo tìm hiểu một số phương pháp nén ảnh
Hình 2.5.4 Sơ đồ biến đổi Cosin ngược C. Lượng tử hoá (Trang 43)
Hình 2.6.4: Cây tứ phân - Báo cáo tìm hiểu một số phương pháp nén ảnh
Hình 2.6.4 Cây tứ phân (Trang 62)
Bảng đều cho thấy JPEG2000 nén ảnh tốt hơn là JPEG; hơn thế hệ số PSNR  mà chúng ta xét trong bảng được đo trong hệ đơn vị logarit - Báo cáo tìm hiểu một số phương pháp nén ảnh
ng đều cho thấy JPEG2000 nén ảnh tốt hơn là JPEG; hơn thế hệ số PSNR mà chúng ta xét trong bảng được đo trong hệ đơn vị logarit (Trang 65)
Hình 2.6.7 : Minh hoạ tính năng ROI - Báo cáo tìm hiểu một số phương pháp nén ảnh
Hình 2.6.7 Minh hoạ tính năng ROI (Trang 66)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w