Luận văn Tìm hiểu một số phương pháp nén ảnh

Đồán đã trình bày các khái niệm quan trọng cần thiết của kỹthuật nén ảnh nói chung và các nguyên tắc , cơsởlý thuyết ,thuật toán của một số phương pháp nén ảnh phổbiến như: mã loạt dài RLE, HUFFMAN, LZW, JPEG, JPEG2000.Trong đó trình bày phương pháp nén ánh JPEG2000 sử dụng biến đổi Wavelet đểnén ảnh, đây là phương pháp nén ảnh đang được quan tâm phát triển vì các tính năng nổi bật so với các phương pháp khác. Phương pháp này không chỉcho hiệu suất nén cao, chất lượng ảnh bảo đảm so với các phương pháp nén RLE, HUFFMAN,LZW, JPEG mà còn các tính năng riêng biệt do sưdụng biến đổi Wavelet đểnén ảnh như: nén ảnh theo vùng (ROI) , trong một ảnh các vùng hoặc các đối tượng có thểcó tỷlệ nén khác nhau ,nén ảnh một lần nhưng có thểgiải nén ảnh với chất lượng ảnh và kích thước ảnh khác nhau tuỳtheo yêu cầu người sửdụng .

pdf72 trang | Chia sẻ: lylyngoc | Lượt xem: 5104 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Luận văn Tìm hiểu một số phương pháp nén ảnh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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: 0 0 1 1 … … … … 255 255 256 256 (Clear Code) 257 257 (End Of Information) 258 Chuỗi 259 Chuỗi … … … … 4095 Chuỗi • 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. Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 28 • 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 Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh 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() CodeWord String 72 H 69 E 258 HE 76 L 259 EL 76 L 260 LL 79 O 261 LO 258 HE 262 OHE 260 LL 263 HEL 262 OH 264 LLO 259 EL 265 OHE 76 L 266 ELL EOI Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 30 Chuỗi thu được sau giải nén :”HELLOHELLOHELL” II.4.2. Thuật toán: • Thuật toán nén bằng LZW: InitDictionary() Output(Clear_Code) OldStr = NULL WHILE ( Input ) { NewChar = GetNextChar() NewStr = OldStr + NewChar IF ( InDictionary(NewStr) ) OldsSr = NewStr ELSE { Output(Code(OldStr)) AddToDictionary(NewStr) OldStr = NewChar } } Output(Code(OldStr)) Output(EOI) Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh 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. Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 32 • 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 (First_Code) /*Mã đầu tiên của mỗi mảnh ảnh*/ { OutBuff(DeCode(code)) OldStr = DeCode(code) } ELSE { IF (code == CC) /*Mã xoá*/ { InitDictionary() First_Code = TRUE } NewStr = DeCode(code) OutBuff(NewStr) OldStr = OldStr + FirstChar(NewStr) Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 33 AddToDictionary(OldStr) OldStr = NewStr } } • Giá trị cờ First_Code = TRUE chỉ mã vừa đọc là mã đầu tiên của mỗi mảnh ảnh. Chức năng của các hàm: • Mã CC báo hiệu hết một mảnh ảnh. Mã EOI báo hiệu hêt toàn bộ thông tin ảnh. • Hàm GetNextCode() : Hàm này đọc thông tin đầu vào (dữ liệu nén) trả về mã tương ứng. • 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 : Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 34 • Chương trình nén phương pháp LZW : BOOL CLZW::Compress(CFile &source, CFile &destination) { long prefix = 0; long result = 0; BYTE readByte = 0; unsigned long filetotal = 0; CString logString; DWORD resAdd = 256; Init(); filetotal = source.GetLength(); if (m_tudien == NULL) { CreateDictionary(); } source.Read(&prefix, 1); while (source.GetPosition() < filetotal) { source.Read(&readByte, 1); result = m_tudien->GetEntry(prefix, readByte); if (result == -1) { resAdd = m_tudien->AddEntry(prefix, readByte); CalculateBitSize(resAdd); logString.Format("Adding combination of %d and %d to dictionary to entry %d.",prefix, readByte, resAdd); Log(logString); CompressData(destination, prefix); prefix = readByte; result = -1; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 35 } else { prefix = result; readByte = 0; } } CompressData(destination, prefix); CloseCompressedFile(destination); ClearDictionary(); return TRUE; } • Chương trình giải nén phương pháp LZW : BOOL CLZW::Decompress(CFile &source, CFile &destination) { DWORD prefix = 0, data = 0; CString logString; CByteArray decodeString; BYTE writeData = 0, character = 0; int counter = 0; Init(); if (m_tudien == NULL) { CreateDictionary(); } prefix = DecompressData(source); character = (BYTE)prefix; destination.Write(&prefix, 1); Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 36 while ((data = DecompressData(source)) != m_MaxCode[m_MaxBits]) { if (!m_tudien->IsCodeExist(data)) { decodeString.Add((BYTE)character); m_tudien->GetBytesFromCode(&decodeString, prefix); } else { m_tudien->GetBytesFromCode(&decodeString, data); character = decodeString.GetAt(decodeString.GetSize() - 1); } counter = decodeString.GetSize(); while (counter > 0) { writeData = (BYTE)decodeString.GetAt(--counter); destination.Write(&writeData, 1); logString.Format("Adding character code %d with know visualisation of: %s", writeData, convertASCIIToText(writeData)); Log(logString); } decodeString.RemoveAll(); m_tudien->AddEntry(prefix, (BYTE)character); CalculateBitSize(m_tudien->GetMaxCode()+1); prefix = data; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 37 } return TRUE; } II.5.Phương pháp mã hoá JPEG: II.5.1.Nguyên tắc: JPEG là viết tắt của Joint Photographic Expert Group ( nhóm các chuyên gia đồ hoạ phát triển chuẩn này ). Chuẩn này được phát triển từ giữa thập niên 80 bởi sự hợp tác của tổ chức ISO và ITU và đến 1992 được công nhận là chuẩn ảnh quốc tế ,phục vụ các ứng dụng về ảnh cho các lĩnh vực như mạng, y học, khoa học kỹ thuật, ảnh nghệ thuật … Chuẩn JPEG được sử dụng để mã hoá ảnh đa mức xám, ảnh màu. JPEG không cho kết quả ổn định lắm với ảnh đen trắng, nó cung cấp cả 2 chế độ nén : nén mất mát thông tin và nén không tổn thất. Do độ phức tạp và hiệu suất nén của JPEG không mất mát thông tin mà nó không được sử dụng phổ biến .Dưới đây chỉ trình bày chi tiết về một trong các dạng nén Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 38 P h â n k h ố i ảnh gốc 8x8 8x8 8x8 DCT Lượng tử hoá Mã hoá ảnh nén Bảng lượng tử Bảng mã Khối 8x88 x 8 ảnh nén ảnh giải nén Tương tự hoá Giải mã DCT ngược Bảng lượng tử Bảng mã biến đổi chấp nhận mất mát thông tin dùng biến đổi Cosin tuần tự ( Sequential DTC- Based) của chuẩn JPEG. II.5.2.Thuật toán: Mã hoá JPEG bao gồm nhiều công đoạn, sơ đồ thuật toán nén và giải nén được mô tả như dưới đây Hình 2.5.1 : Quá trình nén ảnh theo chuẩn JPEG Quá trình giải nén sẽ được thực hiện ngược lại, người ta dựa vào các thông tin liên quan ghi trong phần Header của file nén để giải mã từng phần ảnh nén ứng với phương pháp nén. Kết quả thu được là hệ số đã lượng tử. Căn cứ vào bảng lượng tử sẽ khôi phục lại giá trị trước khi lượng tử hoá của các hệ số này. Cuối cùng là biến đổi Cosin ngược để thu lại được ảnh như ban đầu . Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 39 Hình 2.5.2 : Quá trình giải nén ảnh JPEG A. Chia ảnh thành khối Chuẩn nén JPEG phân ảnh ra các khối 8x8. Biến đổi nhanh Cosin 2 chiều cho các khối 8x8 sẽ đạt hiệu quả hơn, việc biến đổi Cosin cho các khối có cùng kích cỡ có thể giảm được một phần các tính toán chung như việc tính hệ số Cij . Khi n = 8 chúng ta chỉ cần tính hệ số Cij cho 3 tầng (8 = 23), số các hệ số là: 4 + 2 + 1 = 7 Nếu với một ảnh 512x512, phếp biến đổi nhanh Cosin một chiều theo hàng ngang hoặc hàng dọc ta phải cần qua 9 tầng (512 = 29). Số các hệ số Cij là: 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 +1 =509. Như vậy thời gian tính các hệ số Cij cho ảnh 512x512 lớn gấp 72 lần so với thời gian tính toán các hệ số này cho từng khối 8x8 , nếu kích thước ảnh lớn hơn thì chi phí thời gian sẽ còn tăng gấp nhiều lần đồng thời còn giúp việc tính toán trong khi biến đổi Cosin chính xác hơn. Ảnh sẽ chia làm B khối với: Các khối được xác định bởi bộ số (m,n) với m=[0..MB-1] và n=[0..NB- 1]. Trong đó : m : thứ tự của khối theo chiều rộng. n : thứ tự của khối theo chiều dài. BB NMl N k MB ×=⎟⎠ ⎞⎜⎝ ⎛×⎟⎠ ⎞⎜⎝ ⎛= '' Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 40 Phân khối thực chất là xác định tương quan giữa toạ độ riêng trong khối với tạo độ thực của điểm ảnh trong ảnh ban đầu. Nếu ảnh ban đầu ký hiệu Image[i,j] thì ma trận biểu diễn khối (m,n) là x[u,v] được tính: x[u,v] = Image[mk + u, nl + v] B. Biến đổi Đây là công đoạn quan trọng của các phương pháp nén sử dụng phép biến đổi, nhiệm vụ của công đoạn này là tập trung năng lượng vào một số ít các hệ số biến đổi. Công thức biến đổi cho mỗi khối là: Trong đó: Thuật toán biến đổi nhanh Cosin hai chiều cho mỗi khối sẽ bao gồm 16 phép biến đổi nhanh Cosin một chiều. Tiến hành biến đổi nhanh Cosin một chiều cho các dãy điểm ảnh trên 8 hàng. Tiếp đó tiến hành biến đổi nhanh Cosin một chiều trên 8 cột của ma trận vừa thu được sau 8 phép biến đổi trên.Kết quả sẽ là ma trận hệ số biến đổi của khối tương ứng. ( ) 16 )12( 16 )12(),( 4 , 22 7 01 7 02 11 21 21 21 Π+Π+= ∑∑ = = knCosknCosnnxkkX n n kk εε ⎪⎩ ⎪⎨ ⎧ = 0 2 1 1kε Khi k1 = 0 Khi (0<k1<8) ⎪⎩ ⎪⎨ ⎧ = 0 2 1 2kε Khi k2 = 0 Khi (0<k2<8) Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 41 Giải thuật biến đổi nhanh được mô tả như hình sau: Hình 2.5.3: Mô tả giải thuật biến đổi nhanh Trong sơ đồ giải nén ta phải dùng phép biến đổi Cosin ngược. Công thức biến đổi ngược cho khối 8x8: -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) X’(0) X’(1) X’(2) X’(3) X’(4) X’(5) X’(6) X’(7) Đ Ả O B Í T 0 2C C Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 42 Trong đó: Công thức tính x’(k1,n2) là phép biến đổi Cosin ngược rời rạc một chiều của X(k1,k2). Như vậy muốn khôi phục lại ảnh ban đầu từ hệ số biến đổi chúng ta sẽ biến đổi nhanh Cosin ngược rời rạc một chiều các hệ số theo hàng, sau đó đem biến đổi nhanh Cosin rời rạc một chiều theo cột các kết quả trung gian vừa tính được. Sơ đồ biến đổi Cosin ngược nhanh được biểu diễn như sau: ⎪⎩ ⎪⎨ ⎧ = 0 2 1 1kε Khi k1 = 0 Khi (0<k1<8) ⎪⎩ ⎪⎨ ⎧ = 0 2 1 2kε Khi k2 = 0 Khi (0<k2<8) ( ) 16 )12( 16 )12(),( 4 , 22 7 01 7 02 11 21 21 21 Π+Π+= ∑∑ = = knCosknCoskkXnnx k k εε Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 43 Hình 2.5.4 : Sơ đồ biến đổi Cosin ngược C. Lượng tử hoá Khối lượng tử hoá trong sơ đồ nén đóng vai trò quan trọng và quyết định tỷ lệ nén của chuẩn nén JPEG. Đầu vào của khối lượng tử hoá là các ma trận hệ số biến đổi Cosin của các khối điểm ảnh. Như ta đã biết ảnh được chia làm nhiều khối, ứng mỗi khối là các hệ số xác định. Trước khi thực hiện bước lượng tử hoá ta có thể loại bỏ vài hệ số. Ngoài hệ số (0,0) (được coi là thành phần DC) biểu diễn mức sáng trung bình của một khối ta có thể loại một số hệ số khác trong khối mang thông tin chi tiết về ảnh. Ta có thể bắt đầu loại bỏ từ hệ số có độ lệch chuẩn thấp nhất. Việc nên giữ lại bao nhiêu hệ số còn tuỳ thuộc vào việc ta muốn tỷ lệ nén cao hay thấp và những yêu cầu về chất lượng của ảnh nén . 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 -1 -1 -1 -1 -1 -1 -1 -1 0.5 -1 -1 -1 -1 X(0) X(1) X(2) X(3) X(4) X(5) X(6) X(7) X’(0) X’(1) X’(2) X’(3) X’(4) X’(5) X’(6) X’(7) Đ Ả O B Í T 0.5 0.5 0.5 0 42 1 C 0 42 1 C 0 42 1 C 0 42 1 C 0 84 1 C 1 84 1 C 0 84 1 C 1 84 1 C 016 1 C 0 16 1 C 0 16 1 C 0 16 1 C Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 44 Để giảm số bộ lượng tử,người ta tìm cách quy các hệ số ở các khối về cùng một khoảng phân bố. Chuẩn nén JPEG chỉ sử dụng một bộ lượng tử hoá. Giả sử rằng các hệ số đều có hàm tính xác suất xuất hiện như nhau. Ta sẽ căn chỉnh lại hệ số yj bằng phép gán: Với: μj là trung bình cộng của hệ số thứ j σj là độ lệch cơ bản của hệ số thứ j Như vậy chúng ta sẽ đồng nhất được mức quyết định và mức tạo lại cho tất cả các hệ số. Do đó, các hệ số sẽ được biểu diễn bằng cùng một số lượng bit. Có nhiều cách tiếp cận để tính được các mức quyết và mức tạo lại. Lloyd – Max đưa ra giải thuật sau: Bước 1: Chọn giá trị khởi tạo: d0 = yL dn = yH r0 = d0 N là số mức lượng tử Bước 2: Cho i biến thiên từ 1 đến N-1 thực hiện các công việc sau: Tính ri-1 theo công thức: Tính ri theo công thức: j jj j y y σ μ−= ∫ ∫ − −=− i i i i d d d d i dyyp dyypy r 1 1 )( )(. 1 Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 45 ri = 2di – ri-1 Tính di theo công thức: Bước 3: Tính: Bước 4: Nếu rN-1 ≠ r’ điều chỉnh lại r0 và lặp lại từ bước 2 đến bước 4 Trong quá trình cài đặt thủ tục tạo ra bộ lượng tử hoá, Lloyd và Max đã có nhiều cải tiến để tính toán dễ dàng hơn. Sau đây là các bước mô tả toàn bộ công việc của khối lượng tử hoá tác động lên các hệ số biến đổi Cosin: Bước 1: Tính trung bình cộng μ và độ lệch cơ bản σ cho từng hệ số ở mỗi vị trí trong khối: Với : yj là hệ số thứ j, n là số khối Bước 2: Lựa chọn tỷ lệ hệ số giữ lại trong mỗi khối. 2 1−+= iii rrd ∫ ∫ − −=′ N N N N d d d d dyyp dyypy r 1 1 )( )(. n y j j ∑=μ )1( )( 22 − −= ∑∑ nn yyn jj jσ Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 46 Bước 3: Giữ lại các hệ số có độ lệch cơ bản lớn hơn. Bước 4: Lập ma trận khu vực T Tn = 1 nếu hệ số (i,j) được giữ lại Tn = 0 ngược lại Bước 5: Căn chỉnh lại giá trị của các hệ số xoay chiều được giữ lại ở các khối: Bước 6: Tính phân bố của các giá trị xoay chiều đã căn chỉnh. Bước 7: Tính độ lệch cơ bản σs của các phân bố vừa tính. Bước 8: Lượng tử hoá các hệ số xoay chiều bằng cách sử dụng bộ lượng tử Lloyd – Max sau khi đã điều chỉnh mức quyết định và mức tạo lại của nó theo cách sau: di ⇐ di x σs ri ⇐ ri x σs dN = - d0 Thành phần một chiều sẽ không lượng tử hoá (phần tử (0,0) của khối 8x8 được coi là thành phần một chiều, 63 phần tử còn lại được coi là các thành phần xoay chiều). Đến đây ta chuyển sang bước nén. ij ijij ij C C σ μ−= Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 47 D. Nén Đầu vào của khối nén gồm hai thành phần: thành phần các hệ số xoay chiều và thành phần các hệ số một chiều . Thành phần các hệ số một chiều Ci(0,0) với i = 0,1,…, 63 chứa phần lớn năng lượng tín hiệu hình ảnh. Người ta không nén trực tiếp các giá trị Ci(0,0) mà xác định độ lệch của Ci(0,0): di = Ci+1(0,0) - Ci(0,0) di có giá trị nhỏ hơn hiều so với Ci nên trong biểu diễn dấu phẩy động có nhều chuỗi bít 0 cho hiệu suất nén cao hơn. Giá trị C0(0,0) và các độ lệch di được ghi ra một tệp tạm thời. Tệp này được nén bằng phương pháp nén Huffman. Thành phần các hệ số xoay chiều Ci(m,n) với 1=m<=7, 1<= n<=7 chứa các thông tin chi tiết của ảnh. Để nâng cao hiệu quả nén cho mỗi bộ hệ số trong một khối người ta xếp chúng lại theo thứ tự Zig-Zag. Việc sắp xếp này giúp tạo ra nhiều loạt hệ số giống nhau do năng lượng của khối hế số giảm dần từ góc trên bên trái xuống góc dưới bên phải.Dươi đây là một minh hoạ về khối Zig-Zag : 0 2 3 9 10 20 21 35 1 4 8 11 19 22 34 36 5 7 12 18 23 33 37 48 6 13 17 24 32 38 47 49 14 16 25 31 39 46 50 57 15 26 30 40 45 51 56 58 Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 48 27 29 41 44 52 55 59 62 28 42 43 53 54 60 61 63 Hình 2.5.5 : Minh hoạ khối Zig-Zag Mỗi khối Zig-Zag này được mã hoá theo phương pháp RLE. Cuối mỗi khối đầu ra của RLE, ta đặt dấu kết thúc khối EOB (End Of Block). Sau đó các khối được dồn lại và lại mã hoá một lần bằng phương pháp mã Huffman. Nhờ có dấu kết thúc khối nên có thể phân biệt hai khối cạnh nhau khi giải mã Huffman. Hai bảng mã Huffman cho hai thành phần hệ số tất nhiên sẽ khác nhau. Để có thể giải nén được, chúng ta phải ghi lại các thông tin như: kích thước ảnh, kích thước khối, ma trận T, độ lệch tiêu chuẩn, các mức tạo lại, hai bảng mã Huffman, kích thước khối nén một chiều, kích thước khối nén xoay chiều … và ghi nối tiếp vào hai tệp nén của hai thành phần hệ số. Cài đặt giải thuật cho nén JPEG thực sự phức tạp. chúng ta phải lắm được các kiến thức về nén RLE, Huffman, biến đổi Cosin, xây dựng bộ lượng tử hoá Lloyd – Max … Tuy nén và giải nén JPEG hơi chậm nhưng bù lại cho kích thước tệp nén nhỏ. II.5.3.Một số thủ tục chương trình : • Chương trình nén phương pháp JPEG: bool CJPEG::write_JPEG_file(const char * filename, int quality) // JPEG compression { struct jpeg_compress_struct cinfo; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 49 struct jpeg_error_mgr jerr; FILE * outfile; unsigned char ** buffer; int row_stride; outfile = fopen(filename, "wb"); if (outfile == NULL) return false; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = m_width; cinfo.image_height = m_height; cinfo.input_components = m_mode; switch (m_mode) { case MODE_RGB: cinfo.in_color_space = JCS_RGB; break; case MODE_GRAYSCALE: cinfo.in_color_space = JCS_GRAYSCALE; break; } jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = m_width * cinfo.input_components; buffer = new unsigned char * [cinfo.image_height]; buffer[0] = new unsigned char[cinfo.image_height * row_stride]; for (int k = 0; k < (int)(cinfo.image_height); k++) { buffer[k] = buffer[0] + row_stride*k; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 50 } int i, j; switch (m_mode) { case MODE_RGB: for (j = 0; j < m_height; j++) { for (i = 0; i < m_width*3; i += 3) { buffer[j][i] = image[j][i/3].red; buffer[j][i+1] = image[j][i/3].green; buffer[j][i+2] = image[j][i/3].blue; } } break; case MODE_GRAYSCALE: for (j = 0; j < m_height; j++) { for (i = 0; i < m_width; i++) { buffer[j][i] = gImage[j][i]; } } break; } while (cinfo.next_scanline < cinfo.image_height) { (void) jpeg_write_scanlines(&cinfo, &buffer[cinfo.next_scanline], 1); Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 51 } jpeg_finish_compress(&cinfo); fclose(outfile); delete [] buffer[0]; delete [] buffer; jpeg_destroy_compress(&cinfo); return true; } • Chương trình giải nén phương pháp JPEG: int CJPEG::write_BMP_file(const char * outfile) // Writes a bitmap (.bmp) file (JPEG decompression) { FILE * fp; size_t result; int rowEndBytes = (4-(m_width*3)%4)%4; BITMAPFILEHEADER bmFileHdr; bmFileHdr.bfType = 0x4d42; bmFileHdr.bfSize = 58 + (m_width*3 + rowEndBytes) * m_height; bmFileHdr.bfReserved1 = 0; bmFileHdr.bfReserved2 = 0; bmFileHdr.bfOffBits = 58; BITMAPINFOHEADER bmInfo; bmInfo.biSize = 40; bmInfo.biWidth = m_width; bmInfo.biHeight = m_height; bmInfo.biPlanes = 1; bmInfo.biBitCount = 24; bmInfo.biCompression = BI_RGB; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 52 bmInfo.biSizeImage = (m_width*3 + rowEndBytes) * m_height; bmInfo.biXPelsPerMeter = 0; bmInfo.biYPelsPerMeter = 0; bmInfo.biClrUsed = 0; bmInfo.biClrImportant = 0; fp = fopen(outfile, "wb"); if (fp == NULL) return WRITE_BMP_FILENOTFOUND_ERR; result = fwrite((char *)&bmFileHdr, sizeof(BITMAPFILEHEADER), 1, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } result = fwrite((char *)&bmInfo, sizeof(BITMAPINFO), 1, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } RGBpixel pixel; BYTE pJunk = 0; for (int j = m_height - 1; j >= 0; j--) { for (int i = 0; i < m_width; i++) { this->getPixel(j, i, pixel); result = fwrite((BYTE *)&pixel.blue, sizeof(BYTE), 1, fp); Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 53 if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } result = fwrite((BYTE *)&pixel.green, sizeof(BYTE), 1, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } result = fwrite((BYTE *)&pixel.red, sizeof(BYTE), 1, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } } if (rowEndBytes != 0) result = fwrite((BYTE *)&pJunk, sizeof(BYTE), rowEndBytes, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } } fclose(fp); return WRITE_BMP_SUCCESS; Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 54 } II.6.Phương pháp mã hoá JPEG2000: II.6.1. Lịch sử ra đời và phát triển chuẩn JPEG2000: Như chúng ta đã biết, sự ra đời của JPEG mang lại nhiều lợi ích to lớn về nhiều mặt. JPEG có thể giảm nhỏ kích thước ảnh, giảm thời gian truyền và làm giảm chi phí xử lý ảnh trong khi chất lượng ảnh là khá tốt. Tuy nhiên cho đến nay người ta mới chỉ ứng dụng dạng thức nén có tổn thất thông tin của JPEG vì mã hoá không tổn thất của JPEG là khá phức tạp. Để việc nén ảnh có hiệu quả hơn, Ủy ban JPEG đã đưa ra một chuẩn nén ảnh mới là JPEG2000. JPEG2000 sử dụng biến đổi Wavelet và các phương pháp mã hoá đặc biệt để có được ảnh nén ưu việt hơn hẳn JPEG. JPEG2000 hiện vẫn đang tiếp tục được phát triển, nhưng phần I đã được tổ chức ISO chấp nhận là chuẩn nén ảnh quốc tế áp dụng cho ảnh tĩnh. Chuẩn nén ảnh JPEG2000 Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 55 mà xương sống là biến đổi Wavelet với tính năng vượt trội so với JPEG chắc chắn sẽ được sử dụng trong các server nội dung để chuyển đổi định dạng ảnh trong mạng di động. II.6.2.Các tính năng của JPEG2000: JPEG2000 có nhiều chức năng đặc biệt hơn mọi chuẩn nén ảnh tĩnh khác như JPEG hay GIF. Dưới đây là các chức năng ưu việt của JPEG2000 so với các chuẩn nén ảnh tĩnh khác - Cho chất lượng ảnh tốt nhất khi áp dụng nén ảnh tĩnh có tổn thất. - Sử dụng được với truyền dẫn và hiển thị luỹ tiến về chất lượng, độ phân giải, các thành phần màu và có tính định vị không gian. - Sử dụng cùng một cơ chế nén ảnh cho cả hai dạng thức nén. - Truy nhập và giải nén tại mọi thời điểm trong khi nhận dữ liệu. - Giải nén từng vùng trong ảnh mà không cần giải nén toàn bộ ảnh. - Có khả năng mã hoá ảnh với tỷ lệ nén theo từng vùng khác nhau. - Nén một lần nhưng có thể giải nén với nhiều cấp chất lượng tuỳ theo yêu cầu của người sử dụng. Hiện tại, ISO và uỷ ban JPEG đã đưa ra khuyến nghị thay thế JPEG bằng JPEG2000. II.6.3.Các bước thực hiện nén ảnh theo chuẩn JPEG2000: Xử lý trước biến đổi Biến đổi thuận liên thành phần Biến đổi thuận riêng thành phần Lượng tử hoá Mã hoá Giải mã hoá Giải lượng tử hoá Biến đổi ngược riêng thành phần Biến đổi ngược liên thành phần Xử lý sau biến đổi Ảnh gốc Ảnh khôi phục Ảnh sau mã hoá Ảnh mã hoá Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 56 Hình 2.6.1:Các bước nén và giải nén JPEG2000 II.6.3.1.Xử lý trước biến đổi: Do sử dụng biến đổi Wavelet, JPEG2000 cần có dữ liệu ảnh đầu vào ở dạng đối xứng qua 0. Xử lý trước biến đổi chính là giai đoạn đảm bảo dữ liệu đưa vào nén ảnh có dạng trên. Ở phía giải mã, giai đoạn xử lý sau biến đổi sẽ trả lại giá trị gốc ban đầu cho dữ liệu ảnh. II.6.3.2. Biến đổi liên thành phần : Giai đoạn này sẽ loại bỏ tính tương quan giữa các thành phần của ảnh. JPEG2000 sử dụng hai loại biến đổi liên thành phần là biến đổi màu thuận nghịch (Reversible Color Transform - RCT) và biến đổi màu không thuận nghịch (Irreversible Color Transform - ICT) trong đó biến đổi thuận nghịch làm việc với các giá trị nguyên, còn biến đổi không thuận nghịch làm việc với các giá trị thực. ICT và RCT chuyển dữ liệu ảnh từ không gian màu RGB sang YCrCb. RCT được áp dụng trong cả hai dạng thức nén có tổn thất và không tổn thất, còn ICT chỉ áp dụng cho nén có tổn thất. Việc áp dụng các biến đổi này trước khi nén ảnh không nằm ngoài mục đích làm tăng hiệu quả nén. Các thành phần Cr, Cb có ảnh hưởng rất ít tới sự cảm nhận hình ảnh của mắt trong khi thành phần độ chói Y có ảnh hưởng rất lớn tới ảnh. Chúng ta có thể thấy rõ hơn điều này trên hình vẽ sau: Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 57 Hình 2.6.2 II.6.3.3. Biến đổi riêng thành phần (biến đổi Wavelet) : Biến đổi riêng thành phần được áp dụng trong JPEG2000 chính là biến đổi Wavelet. Để đảm bảo tính toàn vẹn thông tin cũng phải áp dụng các phép biến đổi thuận nghịch hoặc không thuận nghịch. Do phép biến đổi Wavelet không phải là một phép biến đổi trực giao như biến đổi DCT mà là một phép biến đổi băng con nên các thành phần sẽ được phân chia thành các băng tần số khác nhau và mỗi băng sẽ được mã hóa riêng rẽ. JPEG2000 áp dụng biến đổi Wavelet nguyên thuận nghịch 5/3 (IWT) và biến đổi thực không thuận nghịch Daubechies 9/7. Việc tính toán biến đổi trong JPEG2000 này sẽ được thực hiện theo phương pháp Lifting. Sơ đồ của phương pháp Lifting 1D áp dụng trong JPEG2000 trên hình 2.6.3.Việc tính toán biến đổi Wavelet 2D suy ra từ biến đổi Wavelet 1D theo các phương pháp phân giải ảnh tuỳ chọn. Trong JPEG2000 có 3 phương pháp phân giải ảnh nhưng phương pháp được sử dụng nhiều nhất chính là phương pháp kim tự tháp. Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 58 Hình 2.6.3 Do biến đổi Wavelet 5/3 là biến đổi thuận nghịch nên có thể áp dụng cho nén ảnh theo cả hai phương pháp, có tổn thất và không tổn thất trong khi biến đổi 9/7 chỉ áp dụng cho nén ảnh theo phương pháp có tổn thất thông tin. II.6.3.4. Lượng tử hoá - Giải lượng tử hoá : Các hệ số của phép biến đổi sẽ được tiến hành lượng tử hoá. Quá trình lượng tử hoá cho phép đạt tỷ lệ nén cao hơn bằng cách thể hiện các giá trị biến đổi với độ chính xác tương ứng cần thiết với mức chi tiết của ảnh cần nén. Các hệ số biến đổi sẽ được lượng tử hoá theo phép lượng tử hoá vô hướng. Các hàm lượng tử hoá khác nhau sẽ được áp dụng cho các băng con khác nhau và được thực theo biểu thức: V(x,y) = ),(sgn|),(| yxUyxU ⎥⎦ ⎤⎢⎣ ⎡ Δ với Δ là bước lượng tử, U(x,y) là giá trị băng con đầu vào; V(x,y) là giá trị sau lượng tử hoá. Trong dạng biến đổi nguyên, đặt bước lượng tử bằng 1.Với dạng biến đổi thực thì bước lượng tử sẽ được chọn tương ứng cho Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 59 từng băng con riêng rẽ. Bước lượng tử của mỗi băng do đó phải có ở trong dòng bít truyền đi để phía thu có thể giải lượng tử cho ảnh. Công thức giải lượng tử hoá là: U(x,y) = [ ]Δ+ ),(sgn),( yxVryxV r là một tham số xác định dấu và làm tròn, các giá trị ( U x,y);V(x,y) tương ứng là các giá trị khôi phục và giá trị lượng tử hoá nhận được. JPEG2000 không cho trước r tuy nhiên thường chọn r =1/ 2 . II.6.3.5. Mã hoá và kết hợp dòng dữ liệu sau mã hoá: JPEG2000 theo khuyến nghị của uỷ ban JPEG quốc tế có thể sử dụng nhiều phương pháp mã hoá khác nhau cũng như nhiều cách biến đổi Wavelet khác nhau để có thể thu được chất lượng ảnh tương ứng với ứng dụng cần xử lý. Điều này giúp cho JPEG2000 mềm dẻo hơn nhiều so với JPEG. Việc áp dụng các phương pháp mã hoá khác nhau cũng được mở rộng sang lĩnh vực nén ảnh động bằng biến đổi Wavelet. Trong thực tế các phương pháp mã hoá ảnh được áp dụng khi nén ảnh bằng biến đổi Wavelet cũng như JPEG2000 thì có hai phương pháp được coi là cơ sở và được áp dụng nhiều nhất: phương pháp SPIHT và phương pháp EZW. Hiện nay JPEG2000 vẫn được áp dụng mã hoá bằng hai phương pháp này và một phương pháp phát triển từ hai phương pháp này là phương pháp mã hoá mặt phẳng bít. Vì thế ở đây chúng ta sẽ xem xét hai phương pháp này. Việc kết hợp dòng dữ liệu sau mã hoá của JPEG2000 thực chất là để thực hiện các tính năng đặc biệt của JPEG2000 như tính năng ROI v.v... II.6.3.6. Phương pháp mã hoá SPIHT: Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 60 Có thể thấy rằng dù áp dụng biến đổi Wavelet nào hay cùng với nó là một phép phân giải ảnh nào thì trong các băng con có số thứ tự thấp cũng là những thành phần tần số cao (mang thông tin chi tiết của ảnh) trong khi những băng con có số thứ tự cao hơn thì sẽ chứa những thành phần tần số thấp (mang thông tin chính về ảnh). Điều đó nghĩa là các hệ số chi tiết sẽ giảm dần từ băng con mức thấp (HH1 chẳng hạn) (ứng với thành phần tần số cao) xuống băng con mức cao (ứng với thành phần tần số thấp) và có tính tương tự về không gian giữa các băng con, ví dụ như một đường biên của hình vẽ trong ảnh sẽ tồn tại ở cùng một vị trí trên các băng con đó (tương ứng với mức độ phân giải của băng con ấy). Điều này đã dẫn tới sự ra đời của phương pháp SPIHT (Set partitioning in hierarchical trees - phương pháp mã hoá phân cấp theo phân vùng). Phương pháp SPIHT được thiết kế tối ưu cho truyền dẫn luỹ tiến. Điều này có nghĩa là tại mọi thời điểm trong quá trình giải nén ảnh theo phương pháp mã hoá này thì chất lượng ảnh hiển thị tại thời điểm ấy là tốt nhất có thể đạt được với một số lượng bít đưa vào giải mã tính cho tới thời điểm ấy. Ngoài ra, phương pháp này sử dụng kỹ thuật embedded coding; điều đó có nghĩa là một ảnh sau nén với kích cỡ (lưu trữ) lớn (tỷ lệ nén thấp) sẽ chứa chính dữ liệu sau nén của ảnh có kích cỡ (lưu trữ) nhỏ (tỷ lệ nén cao). Bộ mã hoá chỉ cần nén một lần nhưng có thể giải nén ra nhiều mức chất lượng khác nhau. Giả sử gọi các pixel trong một ảnh p cần mã hoá là pi, j. Áp dụng một phép biến đổi Wavelet T nào đó cho các pixel trong ảnh để tạo ra các hệ số của phép biến đổi Wavelet là ci, j. Các hệ số này tạo ra một ảnh biến đổi là C. Phép biến đổi này được viết dưới dạng toán tử như sau: C=T(p). Trong phương pháp truyền dẫn luỹ tiến với ảnh thì bộ mã hoá sẽ bắt đầu quá trình khôi phục (giải nén) ảnh bằng cách đặt các giá trị của ảnh khôi phục từ các hệ số biến đổi là cˆ . Sử dụng các giá trị giải mã của các hệ số biến đổi để tạo ra một ảnh khôi phục (vẫn chưa áp dụng biến đổi ngược Wavelet) là cˆ và sau đó áp dụng biến đổi Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 61 ngược Wavelet để tạo ra ảnh cuối cùng là pˆ . Chúng ta có thể viết dưới dạng toán tử như sau: pˆ =T−1 ( cˆ ). Nguyên tắc quan trọng của phương pháp truyền dẫn ảnh theo kiểu luỹ tiến chính là phương pháp này luôn truyền đi các giá trị mang thông tin quan trọng hơn của ảnh đi trước. Sở dĩ làm như vậy là do các thông tin đó chính là các thông tin sẽ làm giảm thiểu nhiều nhất độ méo dạng của ảnh (sự sai khác giữa ảnh gốc và ảnh khôi phục). Đây chính là lý do tại sao phương pháp SPIHT luôn truyền đi các hệ số lớn trước và cũng là một nguyên tắc quan trọng của phương pháp này. Một nguyên tắc nữa là các bít có trọng số lớn bao giờ cũng mang thông tin quan trọng nhất trong dữ liệu nhị phân. Phương pháp SPIHT sử dụng cả hai nguyên tắc này; nó sắp xếp các hệ số biến đổi và truyền đi các bít có trọng số lớn nhất. Quá trình giải mã có thể dừng lại ở bất kỳ một bước nào ứng với giá trị ảnh cần mã hoá yêu cầu. Đây chính là cách mà phương pháp mã hoá SPIHT làm tổn thất thông tin. II.6.3.7. Phương pháp mã hoá EZW: Phương pháp mã hoá EZW (Embedded Zerotree Wavelet Encoder) cũng dựa trên cơ sở phép mã hoá luỹ tiến (progressive coding) giống như phương pháp mã hoá SPIHT. Phương pháp này chủ yếu dựa trên khái niệm về cây zero (zerotree). Về cơ bản, thuật toán này dựa trên hai nguyên tắc như đã trình bày ở phần phương pháp mã hoá SPIHT. Sau đây chúng ta sẽ xem xét các khái niệm cơ bản của thuật toán: Cây tứ phân: Sau khi áp dụng biến đổi Wavelet ứng với các mức phân giải khác nhau chúng ta có thể biểu diễn các hệ số biến đổi dưới dạng một cây. Ta thấy rằng với cây biểu diễn này cứ mỗi nút cha thì có 4 nút con. Sở dĩ có được điều này là do quá trình biến đổi Wavelet ở các tỷ lệ khác nhau. Ta gọi đây là các cây tứ phân (quadtree). Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 62 Hình 2.6.4: Cây tứ phân Cây zero (zerotree): Cây zero là một cây tứ phân, trong đó tất cả các nút của nó đều nhỏ hơn nút gốc. Một cây như vậy khi mã hoá sẽ được mã hoá bằng một đối tượng duy nhất và khi giải mã thì chúng ta cho tất cả các giá trị bằng không. Ngoài ra để có thể mã hoá được các hệ số Wavelet trong trường hợp này, giá trị của nút gốc phải nhỏ hơn giá trị ngưỡng đang được xem xét ứng với hệ số Wavelet đó Sau khi có đủ các khái niệm cần thiết về cây tứ phân và cây zero, chúng ta có thể trình bày nguyên lý hoạt động của thuật toán. Thuật toán sẽ mã hoá các hệ số theo thứ tự giảm dần. Chúng ta sẽ dùng một giá trị gọi là ngưỡng (threshold) và sử dụng ngưỡng này để tiến hành mã hoá các hệ số biến đổi. Các hệ số được mã hoá theo thứ tự từ vùng tần số thấp đến vùng tần số cao. Và chỉ những hệ số có giá trị tuyệt đối lớn hơn hoặc bằng ngưỡng thì mới được mã hoá. Tiếp theo giảm ngưỡng và tiếp tục làm như vậy cho tới khi ngưỡng đạt tới một giá trị nhỏ hơn giá trị của hệ số nhỏ nhất. Cách giảm giá trị ngưỡng ở đây thực hiện tương đối đặc biệt, giá trị của ngưỡng giảm xuống một nửa so với trước đó. Bộ giải mã phải biết các mức ngưỡng này thì mới có thể giải mã ảnh thành công. Nhưng khi ta đi từ nút cha đến nút con trong cây tứ phân thì nó vẫn có 3 nút con. Vậy ta phải đi theo nhánh có nút con nào trước. Hay nói một cách đầy đủ hơn ta di chuyển từ hệ số này đến hệ số khác theo thứ tự như thế nào. Có nhiều cách di chuyển khác nhau, tuy nhiên hai cách di chuyển trên hình trên được sử dụng nhiều nhất. Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 63 Hình 2.6.5 Việc sắp xếp này còn phải được quy ước thống nhất giữa quá trình mã hoá và quá trình giải mã để việc giải mã ảnh được thành công. Trên đây chỉ là nguyên lý cơ bản của phương pháp mã hoá EZW. Hiện nay phương pháp mã hoá này được áp dụng ngày càng nhiều nén ảnh động. Phương pháp này cho tỉ lệ nén và độ tin cậy giải mã cao. Ngoài ra phương pháp EZW rất dễ triển khai trên máy tính bởi phương pháp này không yêu cầu việc lập trình quá phức tạp. II.6.4.So sánh chuẩn JPEG2000 với JPEG và các chuẩn nén ảnh tĩnh khác: Một tính năng quan trọng và là ưu điểm rõ nét nhất của JPEG2000so với JPEG cũng như các chuẩn nén ảnh khác như MPEG 4 VTC hay JPEG - LS v. v.... là JPEG2000 đưa ra cả hai kỹ thuật nén có tổn thất và không tổn thất theo cùng một cơ chế mã hoá nghĩa là JPEG2000 thực hiện tất cả các dạng thức của JPEG chỉ bằng một cơ chế mã hoá duy nhất. Nếu xét về sự tồn tại của hai kỹ thuật này thì JPEG cũng có khả năng nén ảnh có tổn thất và không tổn thất thông tin. Tuy nhiên với JPEG thì cơ chế mã hoá với hai dạng này là khác nhau và rất khó để sử dụng cả hai dạng này cùng lúc cho cùng một ứng dụng. Do đó, có thể thấy rằng JPEG có tính mềm dẻo hơn bất kỳ chuẩn nén ảnh tĩnh nào trước đây. Hơn thế, chúng ta đã thấy rằng tất cả các phương pháp thiết kế cho chuẩn JPEG2000 đều ưu việt và có nhiều tính Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 64 năng hơn so với JPEG; ngoài ra những thống kê về thực tế cho thấy với cùng một tỷ lệ nén và một loại ảnh thì ảnh được nén bởi JPEG2000 hầu như luôn có chất lượng tốt hơn so với JPEG. Chúng ta xem xét hai ảnh trên hình 2.6.6 để thấy rõ điều này, ảnh bên trái được nén theo JPEG còn ảnh bên phải được nén theo JPEG2000. JPEG JPEG 2000 JPEG JPEG 2000 Hình 2.6.6 (a ,b) Tính năng ưu việt thứ hai của JPEG2000 so với JPEG chính là trong dạng thức nén có tổn thất thông tin, JPEG2000 có thể đưa ra tỷ lệ nén cao hơn nhiều so với JPEG. Các phần mềm nén ảnh JPEG hiện tại (kể cả Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 65 Photoshop) cũng chỉ thiết kế để có thể nén được tới tỷ lệ 40:1nhưng với JPEG2000 thì tỷ lệ nén có thể lên tới 200:1. Theo công thức tính PSNR trong đơn vị dB, chúng ta có: (b là số bít dùng biểu diễn một pixel trên ảnh gốc) PSNR(dB) = ⎟⎟⎠ ⎞ ⎜⎜⎝ ⎛ − − 1210 log20 b RMSE Trong đó MSE( Mean square error ) là sai số bình phương trung bình , PSNR (peak to signal to noise ratio) là tỉ số tín hiệu trên nhiễu đỉnh.MSE thường được gọi là phương sai lượng tử - 2qσ (quantization error variance) .MSE giữa ảnh gốc và ảnh khôi phục được tính như sau : [ ] [ ]( )∑ −== kj q kigkifN MSE , 22 ,,1σ Trong đó tổng lấy theo j, k tính cho tổng tất cả các điểm ảnh trong ảnh và N là số điểm ảnh trong ảnh. RMSE là căn bậc 2 của MSE . Với hai ảnh ở hình 2.6.6, sự so sánh về tham số PSNR cho trên bảng bên dưới. Để có thể so sánh dễ dàng hơn, ta xét ảnh được nén với các tỷ lệ khác nhau (đo lường bởi hệ số bít/pixel hay bpp). Tất cả các số liệu trên 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. Bit per pixel 0.125 0.50 2.00 Ảnh 1 theo JPEG 24.42 31.17 35.15 Ảnh 1 theo JPEG2000 28.12 32.95 37.35 Ảnh 2 theo JPEG 22.6 28.92 35.99 Ảnh 2 theo JPEG2000 24.85 31.13 38.80 Tính năng ưu việt thứ 3 của JPEG2000 so với JPEG là chuẩn nén ảnh này có thể hiển thị được các ảnh với độ phân giải và kích thước khác nhau từ cùng một ảnh nén. Với JPEG thì điều này là không thể thực hiện được. Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 66 Sở dĩ có điều này là do JPEG2000 sử dụng kỹ thuật phân giải ảnh và mã hoá đính kèm mà chúng ta đã nói tới ở phần mã hoá ảnh theo JPEG2000. Tính năng này là một lợi thế đặc biệt quan trọng của JPEG2000, trong khi JPEG cũng như các chuẩn nén ảnh tĩnh trước đây phải nén nhiều lần để thu được chất lượng với từng lần nén khác nhau thì với JPEG2000 ta chỉ cần nén một lần còn chất lượng ảnh thì sẽ được quyết định tuỳ theo người sử dụng trong quá trình giải nén ảnh theo JPEG2000.Một tính năng ưu việt nữa của JPEG2000 là tính năng mã hoá ảnh quan trọng theo vùng (ROI - Region of Interest) mà chúng ta đã đề cập trong phần mã hoá ảnh theo JPEG2000. Hình 2.6.7 : Minh hoạ tính năng ROI JPEG2000 còn có một khả năng đặc biệt ưu việt hơn so với JPEG, đó chính là khả năng vượt trội trong khôi phục lỗi. Đó là khi một ảnh được truyền trên mạng viễn thông thì thông tin có thể bị nhiễu; với các chuẩn nén ảnh như JPEG thì nhiễu này sẽ được thu vào và hiển thị, tuy nhiên với JPEG2000, do đặc trưng của phép mã hoá có thể chống lỗi, JPEG2000 có thể giảm thiểu các lỗi này tới mức hầu như không có. CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH VÀ THỬ NGHIỆM Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 67 • Từ những cơ sở lý thuyết trình bày ở trên em đã tiến hành cài đặt chương trình cho một số phương pháp nén ảnh : RLE, HUFFMAN, LZW, JPEG trên ngôn ngữ lập trình Visual C++ 6.0. • Chương trình chạy tương đối ổn định nhưng chỉ hỗ trợ định dạng ảnh Bitmap. Các phương pháp RLE, HUFFMAN, LZW chương trình chỉ chạy tốt trên ảnh Bitmap 256 màu còn đối với JPEG thì hiện thời mới hỗ trợ cho ảnh Bitmap 24 bit màu. • Các file ảnh được nén theo các phương pháp khác nhau sẽ được lưu với các định dạng đuỗi khác nhau HUFFMAN (*.huff) , LZW (*.lzw) , JPEG (*.jpg) riêng RLE vẫn giữ nguyên đuôi *.bmp. • Ngoài các thư viện và các hàm được hỗ trợ sẵn trong Visual C++ 6.0 chương trình còn sử dụng thêm một số thư viện riêng. • Các thuật toán đều có ưu nhược điểm khác nhau và đem lại kết quả chương trình khác nhau. Tốc độ nén và hiệu quả nén của các phương pháp rất khác nhau do độ phức tạp giải thuật và chất lượng ảnh kết quả yêu cầu là khác nhau. Phương pháp RLE, HUFFMAN cho kết quả nhanh chóng và chất lượng ảnh không thay đổi nhưng hiệu suất nén thường không cao đối với ảnh Bitmap 256 màu còn phương pháp LZW do trong thuật toán phải xây dựng từ điển nên tốc độ nén tương đối chậm nhưng kết quả nén rất cao.Cuối cùng phương pháp JPEG thì chất lượng ảnh nén và hiệu quả nén tỷ lệ nghịch với nhau, chất lượng ảnh nén tốt thì kích thước file giảm ít và ngược lại . Giao diện chính chương trình : Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 68 Các bước thực hiện chương trình : Phương pháp nén ảnh RLE Phương pháp nén ảnh HUFFMAN Phương pháp nén ảnh LZW Phương pháp nén ảnh JPEG Đường dẫn file nguồn Đường dẫn file đích Xem ảnh Kích thước file nguồn Kích thước file đích Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 69 1. Chọn mục đích thực hiện nén (Compression) hoặc giải nén (Decompression ) trong phương pháp nén muốn sử dụng. 2. Click vào nút “Duongdan” thứ nhất để mở file muốn thực thi ,nếu muốn xem ảnh chọn (nếu là ảnh Bitmap) thì click nút >> để xem ảnh còn kích thước file hiển thị bên dưới. 3. Click vào nút “Duongdan” thứ hai để chỉ đường dẫn đến file muốn lưu lại kết quả. 4. Click nút “Thuchien” xong chương trình sẽ thông báo bằng hộp hội thoại MessageBox còn riêng với JPEG ta còn phải chọn chất lượng ảnh nén thì mới thực hiện nén. Chất lượng càng cao thì ảnh sẽ ít bị thay đổi nhưng hiệu suất nén thấp và ngược lại. 5. Thông báo hoàn tất nén hoặc giải nén KẾT LUẬN Kết quả đạt được và ứng dụng của đồ án Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 70 Đồ án đã trình bày các khái niệm quan trọng cần thiết của kỹ thuật nén ảnh nói chung và các nguyên tắc , cơ sở lý thuyết ,thuật toán của một số phương pháp nén ảnh phổ biến như : mã loạt dài RLE, HUFFMAN, LZW, JPEG, JPEG2000.Trong đó trình bày phương pháp nén ánh JPEG2000 sử dụng biến đổi Wavelet để nén ảnh, đây là phương pháp nén ảnh đang được quan tâm phát triển vì các tính năng nổi bật so với các phương pháp khác. Phương pháp này không chỉ cho hiệu suất nén cao, chất lượng ảnh bảo đảm so với các phương pháp nén RLE, HUFFMAN, LZW, JPEG mà còn các tính năng riêng biệt do sư dụng biến đổi Wavelet để nén ảnh như : nén ảnh theo vùng (ROI) , trong một ảnh các vùng hoặc các đối tượng có thể có tỷ lệ nén khác nhau ,nén ảnh một lần nhưng có thể giải nén ảnh với chất lượng ảnh và kích thước ảnh khác nhau tuỳ theo yêu cầu người sử dụng ....Các phương pháp nén trình bày ở trong đồ án là những phương pháp đang được sử dụng khá rộng rãi trong nhiều lĩnh vực đặc biệt trong truyền thông cho ảnh trên mạng đảm bảo tốc độ, thời gian và chất lượng dữ liệu truyền. Hướng phát triển nghiên cứu Một số hướng nghiên cứu trong tương lai : • Đồ án mới đề cập đến các phương pháp nén ảnh tĩnh mà chưa ứng dụng chúng cho âm thanh, video, đặc biệt là biến đổi Wavelet của chuẩn JPEG2000 do đó việc đi sâu nghiên cứu tìm hiểu các họ của Wavelet là rất cần thiết. • Nghiên cứu thêm về các giải thuật SPIHT, EZW và các ứng dụng của chúng. • Các phương pháp nén được trình bày trong đồ án đã ra đời từ nhiều năm trước do đó cần nghiên cứu những cải tiến đối với mỗi phuơng pháp để nâng cao hiệu quả nén. Các tài liệu tham khảo: Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 71 1. PGS.Nguyễn Thanh Thuỷ, Ths.Lương Mạnh Bá, Nhập môn xử lý ảnh số 2. Võ Đức Khánh (2003),Giáo trình xử lý ảnh , Nxb Thống kê, Hà Nội 3. D.Huffman , A method for the contruction of minimum – redundancy codes, Proc IRE 40, 1098-1101 (1952) 4. Nguyễn Kim Sách (1997), Xử lý ảnh và video số , Nxb Khoa học và Kỹ thuật , Hà Nội . 5. Michael David Adams - Faouzi Kossentini - Touraji Ebrahimi - “JPEG2000 : The Next Generation Still Image Compression Standard” (2000) 6. Website: 7. Website:

Các file đính kèm theo tài liệu này:

  • pdftailieutonghop_com_bao_cao_tot_nghiep_tim_hieu_mot_so_phuong_phap_nen_anh_1138.pdf