Tìm hiểu một số thuật toán mã hóa và nén dữ liệu xây dựng ứng dụng để nén dữ liệu ảnh

77 17 0
Tìm hiểu một số thuật toán mã hóa và nén dữ liệu xây dựng ứng dụng để nén dữ liệu ảnh

Đ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

1 ĐẠI HỌC THÁI NGUYÊN TRƢỜNG ĐẠI HỌC CÔNG NGHỆ THƠNG TIN VÀ TRUYỀN THƠNG NGUYỄN THÀNH DƢƠNG TÌM HIỂU MỘT SỐ THUẬT TỐN MÃ HĨA VÀ NÉN DỮ LIỆU, XÂY DỰNG ỨNG DỤNG ĐỂ NÉN DỮ LIỆU ẢNH LUẬN VN THC S KHOA HC Thái Nguyên - 2012 MỤC LỤC Trang TRANG PHỤ BÌA LỜI CAM ĐOAN MỤC LỤC LỜI CÁM ƠN DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT DANH MỤC CÁC BẢNG BIỂU DANH MỤC CÁC HÌNH VẼ MỞ ĐẦU Chƣơng 1: CƠ SỞ LÝ THUYẾT 1.1 Mã hóa thơng tin 1.2 Nén liệu 1.3 Entropy 1.4 Các kết nén liệu 1.4.1 Phân loại nén liệu 1.4.2 Các định lý nén liệu 1.5 Lý thuyết hình ảnh 1.5.1 Giới thiệu ảnh số xử lý ảnh số 1.5.2 Mục đích cần thiết nén ảnh 1.5.3 Phân loại phƣơng pháp nén ảnh Chƣơng 2: MỘT SỐ THUẬT TỐN MÃ HĨA VÀ NÉN DỮ LIỆU 2.1 Thuật toán HUFFMAN 2.1.1 Ý tƣởng thuật toán 2.1.2 Thuật toán 2.2 Thuật toán tách đoạn (RLE – Runlength Coding) 2.2.1 Ý tƣởng thuật toán 2.2.2 Thuật toán 2.4 Thuật toán nén ảnh JPEG 2.3.1 Ý tƣởng thuật toán 2.3.2 Thuật toán nén ảnh JPEG 2.4 Thuật toán nén ảnh nâng cao AIC 2.4.1 Chuẩn H.264/AVC 2.4.2 Thuật toán AIC 2.4.3 Các kết AIC Chƣơng 3: XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM 3.1 Xây dựng chƣơng trình 3.2 Một số thủ tục chƣơng trình chạy thử nghiệm 3.2.1 Thủ tục chƣơng trình nén ảnh giải nén thuật toán i iii iv v vi 4 5 8 14 14 15 16 19 19 19 19 22 22 24 25 25 26 32 34 40 55 56 56 56 56 HUFFMAN 3.2.2 Thủ tục chƣơng trình nén ảnh giải nén thuật toán RLE 3.2.3 Thủ tục chƣơng trình nén ảnh thuật toán JPEG 3.3 Giao diện chƣơng trình 3.4 Các bƣớc thực chƣơng trình 3.5 So sánh kết thử nghiệm KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN TÀI LIỆU THAM KHẢO 61 62 64 66 68 72 74 PHẦN MỞ ĐẦU Nén liệu đƣợc sử dụng hầu nhƣ nơi Tất hình ảnh mà xem chép đƣợc từ trang web tệp hình ảnh đƣợc nén, thơng thƣờng định dạng JPEG GIF; đa số modem sử dụng tính nén liệu; truyền hình độ phân giải cao (HDTV) sử dụng phƣơng pháp nén theo chuẩn MPEG-2 Một số hệ thống quản lý tệp tin tự động nén tệp tin lƣu trữ thƣờng sử dụng chƣơng trình nén khác để nén tệp liệu Q trình làm giảm kích thƣớc tệp liệu đƣợc gọi cách phổ biến nén liệu (data compresion), tên gọi lý thuyết thơng tin mã hóa nguồn (source coding) Trong khoa học máy tính lý thuyết thơng tin, nén liệu (hoặc mã hóa nguồn) việc mã hóa thơng tin số bit so với biểu diễn ban đầu Có thể chia phƣơng pháp nén hai lớp: nén không thông tin nén có thơng tin Nén khơng thơng tin làm giảm bit số bít biểu diễn cách xác định loại bỏ độ dƣ thừa thống kê cách biểu diễn ban đầu Nhƣ tên gọi, thơng tin khơng bị q trình nén khơng thơng tin Nén có thơng tin cố gắng giảm số bit cách xác định thông tin không quan trọng loại bỏ chúng Nếu nói ngắn gọn chất nén, tập hợp thuật toán, bao gồm từ phân loại, hàm băm, biến đổi Fourier nhanh (FFT), Ngoài thuật tốn dựa tảng lý thuyết vững đóng vai trò quan trọng ứng dụng thực tế Nén liệu hữu ích giúp giảm tài nguyên sử dụng nhƣ không gian lƣu trữ liệu dung lƣợng truyền Vì liệu nén phải đƣợc giải nén trƣớc sử dụng, điều đòi hỏi thêm chi phí tính tốn để giải nén Ví dụ, chƣơng trình nén cho video u cầu phần cứng đắt tiền cho video đƣợc giải nén đủ nhanh để đƣợc xem nhƣ đƣợc giải nén, tùy chọn để giải nén video đầy đủ trƣớc xem bất tiện yêu cầu lƣu trữ bổ sung Việc thiết kế chƣơng trình nén liệu liên quan đến việc dung hòa yếu tố khác nhau, bao gồm mức độ nén, lƣợng thông tin bị sử dụng phƣơng pháp nén liệu có thơng tin nguồn lực tính tốn cần thiết để nén giải nén liệu Thuật ngữ tƣơng đƣơng thông điệp, tin hay dãy tin đƣợc sử dụng chung cho đối tƣợng cần nén Nhiệm vụ nén liệu bao gồm hai thành phần: thuật toán mã hóa nhận tin ban đầu (mà ta gọi tin gốc) biểu diễn dƣới dạng "nén" (hy vọng với bit hơn), thuật tốn giải mã đƣợc dùng để tái tạo lại tin ban đầu xấp xỉ tin ban đầu từ tin đƣợc nén Hai thành phần thƣờng đƣợc xây dựng gắn kết với Nén không thơng tin nén có thơng tin: Nén không thông tin thƣờng đƣợc sử dụng cho văn nén có thơng tin thƣờng đƣợc sử dụng để nén tệp âm hình ảnh việc số bit thông tin độ phân giải thƣờng phát đƣợc chấp nhận đƣợc Tuy nhiên nén có thơng tin khơng có nghĩa bị pixel cách ngẫu nhiên, thay vào có nghĩa mát đại lƣợng nhƣ thành phần tần số, nhiễu Chẳng hạn, ngƣời ta nghĩ nén văn có thơng tin khơng thể chấp nhận đƣợc họ nghĩ tới việc chuyển đổi ký tự Thay ta nghĩ tới hệ thống câu chuẩn, từ thay từ đồng nghĩa, nhờ nén tập tin tốt Về mặt kỹ thuật nén liệu gây thay đổi văn bản, nhƣng ý nghĩa tính rõ ràng văn đƣợc giữ ngun chí cải thiện Khi xét thuật toán nén, điều quan trọng cần phân biệt hai thành phần: mơ hình mã hóa Mơ hình cho biết phân phối xác suất dãy tin cách nhận biết phát cấu trúc đầu vào Bộ mã hóa tạo dãy mã dựa xác suất tạo mơ hình Để có hiệu nén, mã hóa thƣờng tạo dãy mã dài cho dãy tin có xác suất thấp gán dãy mã ngắn cho dãy tin có xác suất cao Ví dụ, bảng chữ ngơn ngữ tự nhiên thƣờng có vài chữ xuất văn viết với xác suất cao chữ khác, điều rõ ràng với cặp chữ Khi mã hóa gán từ mã có độ dài ngắn cho chữ xuất với xác suất cao ngƣợc lại Thơng thƣờng tách biệt mơ hình thành phần mã hóa khơng phải ln ln đƣợc xác định cách rõ ràng Lý thuyết thông tin lĩnh vực gắn mơ hình với thành phần mã hóa Nó cho lý thuyết tốt liên quan xác suất độ dài từ mã Lý thuyết phù hợp với thực tế gần nhƣ hoàn hảo, đạt đƣợc độ dài mã gần nhƣ giống hệt với lý thuyết dự đốn Trong trƣờng hợp mã hóa có thơng tin, ta lấy tiêu chuẩn đánh giá thời gian nén, thời gian để tái tạo lại dãy tin ban đầu (giải mã) kích thƣớc tệp nén Trong trƣờng hợp nén có thơng tin, tiêu chuẩn thƣờng phức tạp hơn, chẳng hạn xấp xỉ dãy tin ban đầu nhƣ đƣợc gọi chấp nhận đƣợc Thơng thƣờng cần dung hịa kích thƣớc nén, thời gian chạy, chất lƣợng dãy tin đƣợc giải mã Nội dung luận văn bao gồm chƣơng: Chƣơng 1: CƠ SỞ LÝ THUYẾT Trình bày khái niệm bản, lý thuyết chung mã hóa, nén liệu, định lý nén liệu, lý thuyết xử lý ảnh số Chƣơng 2: MỘT SỐ THUẬT TỐN MÃ HĨA VÀ NÉN DỮ LIỆU Chƣơng trình bày ý tƣởng thuật tốn mã hóa nén liệu nhƣ: RLE, HUFFMAN, JPEG, H.264/ACV, AIC Chƣơng 3: XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM Chƣơng trình bày kết cài đặt chạy thử nghiệm thuật tốn mã hóa nén liệu nhƣ: RLE, HUFFMAN, JPEG Các kết so sánh với phần mềm có Chƣơng CƠ SỞ LÝ THUYẾT 1.1 Mã hóa thơng tin Để tìm hiểu mã hóa thơng tin, ta khái niệm sau: Bảng chữ cái: Bảng chữ tập hữu hạn phần tử, khác rỗng Mỗi phần tử bảng chữ gọi kí tự Bản tin: Cho chữ A = {a1,a2, an}, dãy X gồm kí tự A gọi tin Bản tin theo nghĩa rộng ảnh, băng ghi âm v.v…, nhiên thực số hóa để lƣu trữ hay truyền phải sử dụng bảng chữ Mã hố: Giả sử có bảng chữ A = {a1,a2, ,an}, X tin bảng chữ A Ta gọi tin Y bảng chữ B = {b1,b2,…,bm} mã tin X tồn ánh xạ f cho Y = f(X) Khi f đƣợc gọi phép mã hóa Cách ghi mã: Có nhiều cách ghi mã, giả sử mã văn ngƣời ta hay sử dụng nhóm ký hiệu đƣợc phân cách dấu Space, cách mã nhƣ gọi mã phƣơng pháp từ Mã sử dụng hai ký tự "0" "1" để biểu diễn gọi mã nhị phân Loại mã dùng ký hiệu nhóm ký tự có độ dài định cho từ mã mã có độ dài cố định Loại mã ta giải mã đƣợc Nhƣng lƣu trữ nhƣ tốn kém, nên ngƣời ta thƣờng dựa vào tần suất xuất chữ để mã, với tần suất nhiều mã ngắn Mã nhƣ gọi mã có độ dài thay đổi Tuy nhiên độ dài từ mã thay đổi khơng phải với ánh xạ mã giải mã đƣợc Xét ví dụ ánh xạ mã: a  100; b  1000; c0 Mã "ac" "b" dãy bit "1000" Nhƣ nhận đƣợc chuỗi bit 1000 biết đƣợc văn ban đầu "b" "ac" Cho nên mã hố sử dụng mã có độ dài thay đổi cần có tính chất giải mã đƣợc, tính phân tách Tính phân tách đƣợc đƣa dƣới đảm bảo cho tính giải đƣợc mã Xét A B hai đoạn mã tạo từ bít 0/1 Ta nói A đầu B nhƣ có đoạn C cho B = A + C Một tập hợp M tạo đƣợc gọi phân tách khơng có đoạn đầu đoạn khác Nhƣ vậy, mã có độ dài từ mã cố định mã phân tách 1.2 Nén liệu Dữ liệu: Giả sử có bảng chữ A = {x1,x2, xn}, X tin bảng chữ A Ta gọi tin Y bảng chữ nhị phân B = {0,1} mã tin X, tồn ánh xạ f cho Y = f(X) Khi Y đƣợc gọi liệu tin X Nén liệu: Ta kí hiệu L(Y) số bít tin Y Giả sử Lf (Y) dung tích liệu tin X với phép mã hóa f, việc tìm phép mã hóa g cho Lg(Y)  Lf(Y) gọi nén liệu Từ khái niệm, định nghĩa nêu dễ dàng nhận chất việc nén liệu tìm phép mã hóa tin cho dung tích liệu nhỏ tốt Một file liệu nén đến tuỳ ý cần đảm bảo tồn liệu Một file liệu nén đến giới hạn định, giới hạn gọi Entropy Entropy phụ thuộc vào liệu, khơng phụ thuộc vào thuật tốn 1.3 Entropy * Độ đo Logarit thơng tin: Giả sử có hai biến ngẫu nhiên X Y; X nhận giá trị tập {x1,x2, ,xn} Y nhận giá trị tập {y1,y2,…,ym} Chúng ta cần xác định mặt định lƣợng thông tin kiện X = xi biết Y = yj Rõ ràng X Y hai biến độc lập việc biết trƣớc Y = yj khơng cho lƣợng thông tin việc xảy X = xi Mặt khác X Y phụ thuộc đầy đủ Y = yj xác định đƣợc X = xi nội dung thơng tin (Information Content) đơn giản đƣợc cho X = xi Khi thơng tin có đƣợc việc xảy kiện X = xi nhờ xảy kiện Y = yj đƣợc tính bằng: I ( xi , y j )  log p ( xi / y j ) p ( xi ) 1.1 kí hiệu: p(xi|yj) = p(X=xi|Y=yj) p(X=xi) = p(xi) Trong đó: I(xi,yj) số đo thơng tin liên quan xi yj Đơn vị I(xi,yj) đƣợc xác định số Logarit ngƣời ta thƣờng lấy e, số ta gọi đơn vị I bit, e ta gọi đơn vị tự nhiên Công thức chuyển đổi đơn vị : lna = ln2log2a = 0,69315log2a 1.2 Trƣờng hợp X Y hai biến độc lập p(xi|yj) = p(xi) từ cơng thức 1.1 suy I(xi,yj) = Khi kiện Y = yj xảy ra, mà chắn chắn kiện X = xi xảy thì: p(xi|yj) = Khi cơng thức 1.1 có dạng: I(xi,yj) = log 1/p(xi) hay I(xi,yj) = - log p(xi) 1.3 Cơng thức 1.3 thơng tin kiện X = xi, viết công thức 1.3 dạng: I(xi) = - log p(xi) 1.4 Cần ý từ 1.4 suy kiện có xác suất cao lƣợng thơng tin mang lại kiện có xác suất thấp Rõ ràng với kiện x mà p(x) = I(x) = 0, nghĩa việc xảy kiện x không mang lại lƣợng thơng tin Xét ví dụ sau: Giả sử có nguồn rời rạc phát bit 0, với xác suất 1/2 t giây thông tin đƣa từ nguồn là: I(xi) = - log2 1/2 = bit, xi = xi = Hoặc ví dụ khác: Giả sử xét mơ hình thống kê độc lập Xét dãy k bít nguồn phát đi, rõ ràng có tất M = 2k dãy k bit khác dãy có xác suất xuất 1/2k Khi đó: I(xi) = - log2 1/2k = k bit khoảng thời gian k.t Nhƣ thấy độ đo Logarit thơng tin có tính chất cộng ta coi đầu nguồn dãy 10 Bây ý tới đẳng thức sau: p(xi|yj)/p(xi) = p(xi|yj)p(yj)/p(xi)p(yj) = p(xi,yj)/p(xi)p(yj) = p(yj |xi)/p(yj) Từ suy ra: I(xi,yj) = I(yj ,xi) 1.5 Nhƣ thông tin kiện X = xi xảy kiện Y = yj xảy thông tin kiện Y = yj kiện X = xi xảy Ngồi từ định nghĩa thơng tin phụ thuộc lẫn (Mutual Information) thông tin độc lập (Self Information) đƣợc dùng để xác định thơng tin có điều kiện (Condition self - Information) I(xi|yj) = log [1/ p(xi|yj)] = -log p(xi|yj) 1.6 Kết hợp đẳng thức 1.1 1.4 ta có: I(xi,yj) = I(xi)- I(xi|yj) 1.7 Từ 1.7 suy thơng tin phụ thuộc lẫn cặp kiện dƣơng, âm Trung bình thơng tin phụ thuộc: Từ định nghĩa thông tin phụ thuộc lẫn cặp kiện (xi, yj) hai biến ngẫu nhiên X Y, ta nhận đƣợc giá trị trung bình thơng tin phụ thuộc hai biến ngẫu nhiên X, Y có dạng: I ( X ,Y )  Hay : n m   P( x , y i 1 j 1 n m i 1 j 1 i j ) I ( xi , y j ) I ( X , Y )    P ( xi , y j ) P ( xi , y j ) p ( xi ) p ( y j ) 1.8 1.9 Ta thấy I(X,Y) = X Y độc lập, đặc trƣng quan trọng I(X,Y) I(X,Y)  Tƣơng tự nhƣ định nghĩa thơng tin trung bình: n n i 1 i 1 H ( X )   P( xi ) I ( xi )   P( xi ) log P( xi ) 1.10 Khi X bảng chữ bao gồm kí tự sinh nguồn, H(X) trung bình thơng tin kí tự 63 } catch (Exception) { //if header wasn't found throw new Exception("Error, the given stream isn't Huffman archived or corrupted."); } finally { Data.Seek(0, SeekOrigin.Begin); } return Result; - } #endregion // Thủ tục xây dựng bảng tần xuất xuất hiện: #region Private Functions private FrequencyTable BuildFrequencyTable(Stream DataSource) { long OriginalPosition = DataSource.Position; FrequencyTable FT = new FrequencyTable(); IsByteExist = new bool[256]; //false by default Byte bTemp; for (long i = 0; i < DataSource.Length; ++i) { bTemp = (Byte)DataSource.ReadByte(); if (IsByteExist[bTemp]) //If the byte was found before increase the repeatition AmountList[ByteLocation[bTemp]] = (uint)AmountList[ByteLocation[bTemp]] + 1; else/*If new byte*/ { IsByteExist[bTemp] = true; //Mark as found ByteLocation[bTemp] = (Byte)BytesList.Count; //Save the new location of the byte in the bouth ArrayLists AmountList.Add(1u); //Marking that one was found BytesList.Add(bTemp); } } int ArraySize = BytesList.Count; FT.FoundBytes = new byte[ArraySize]; FT.Frequency = new uint[ArraySize]; short ArraysSize = (short)ArraySize; for (short i = 0; i < ArraysSize; ++i) { FT.FoundBytes[i] = (Byte)BytesList[i]; FT.Frequency[i] = (uint)AmountList[i]; 64 } SortArrays(FT.Frequency, FT.FoundBytes, ArraysSize); //Cleaning resources IsByteExist = null; BytesList.Clear(); AmountList.Clear(); DataSource.Seek(OriginalPosition, SeekOrigin.Begin); return FT; - } Thủ tục xếp mảng 3.2.2 Thủ tục chương trình nén ảnh giải nén thuật tốn RLE  Chƣơng trình nén thuật toán RLE: public static byte[] Encode(byte[] source) { List dest = new List(); byte runLength; for (int i = 0; i < source.Length; i++) { runLength = 1; while (runLength < byte.MaxValue && i + < source.Length && source[i] == source[i + 1]) { runLength++; i++; } // if(runLength>1) dest.Add(runLength); dest.Add(source[i]); } return dest.ToArray(); }  Chƣơng trình giải nén thuật tốn RLE: public static byte[] Decode(byte[] source) { List dest = new List(); byte runLength; for (int i = 1; i < source.Length; i += 2) { runLength = source[i - 1]; while (runLength > 0) { dest.Add(source[i]); 65 runLength ; } } return dest.ToArray(); } 3.2.3 Thủ tục chương trình nén ảnh thuật tốn JPEG • Chƣơng trình nén thuật toán JPEG: private void WriteJpgButton_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.RestoreDirectory = true; sfd.Filter = "Jpeg (*.jpg)|*.jpg|All files (*.*)|*.*"; if (DialogResult.OK == sfd.ShowDialog()) { OutputFileName = sfd.FileName; FileStream fs = new FileStream(OutputFileName, FileMode.Create, FileAccess.Write, FileShare.None); BinaryWriter bw = new BinaryWriter(fs); JpegEncoder.BaseJPEGEncoder encoder = new BaseJPEGEncoder(); encoder.EncodeImageBufferToJpg(image_array, originalDimension, actualDimension, bw, float.Parse(quantizerQualityComboBox.Text)); fs.Flush(); outputFileLength = fs.Length; fs.Close(); MessageBox.Show("Quá trình chuyển đổi định dạng ảnh xong", "Nén liệu", MessageBoxButtons.OK, MessageBoxIcon.Information); } } public void EncodeImageBufferToJpg(Byte[, ,] ImageBuffer, Point originalDimension, Point actualDimension, BinaryWriter OutputStream, float Quantizer_Quality)//, Utils.IProgress progress, Utils.ICurrentOperation currentOperation) { Width = actualDimension.X; Height = actualDimension.Y; Bitmap_RGB_Buffer = ImageBuffer; UInt16 xpos, ypos; Tables.InitializeAllTables(Quantizer_Quality,_luminance_table,_chro miance_table); JpegHeader.WriteJpegHeader(OutputStream, new Point(originalDimension.X, originalDimension.Y)); Int16 prev_DC_Y = 0; Int16 prev_DC_Cb = 0; Int16 prev_DC_Cr = 0; 66 for (ypos = 0; ypos < Height; ypos += 8) { for (xpos = 0; xpos < Width; xpos += 8) { Update_Global_Pixel_8_8_Data(xpos, ypos); // Process Y Channel Int16[] DCT_Quant_Y = Do_FDCT_Quantization_And_ZigZag(Y_Data, Tables.FDCT_Y_Quantization_Table); DoHuffmanEncoding(DCT_Quant_Y, ref prev_DC_Y, Tables.Y_DC_Huffman_Table, Tables.Y_AC_Huffman_Table, OutputStream); // Process Cb Channel Int16[] DCT_Quant_Cb = Do_FDCT_Quantization_And_ZigZag(Cb_Data, Tables.FDCT_CbCr_Quantization_Table); DoHuffmanEncoding(DCT_Quant_Cb, ref prev_DC_Cb, Tables.Cb_DC_Huffman_Table, Tables.Cb_AC_Huffman_Table, OutputStream); // Process Cr Channel Int16[] DCT_Quant_Cr = Do_FDCT_Quantization_And_ZigZag(Cr_Data, Tables.FDCT_CbCr_Quantization_Table); DoHuffmanEncoding(DCT_Quant_Cr, ref prev_DC_Cr, Tables.Cb_DC_Huffman_Table, Tables.Cb_AC_Huffman_Table, OutputStream); } } Utils.WriteHex(OutputStream, 0xFFD9); //Write End of Image Marker } void DoHuffmanEncoding(Int16[] DU, ref Int16 DC, Tables.BitString[] HTDC, Tables.BitString[] HTAC, BinaryWriter bw) { Tables.BitString EOB = HTAC[0x00]; Tables.BitString M16zeroes = HTAC[0xF0]; Byte i; Byte startpos; Byte end0pos; Byte nrzeroes; Byte nrmarker; Int16 Diff; Diff = (Int16)(DU[0] - DC); DC = DU[0]; if (Diff == 0) WriteBits(HTDC[0],bw); else { 67 WriteBits(HTDC[Tables.Category[32767 + Diff]], bw); WriteBits(Tables.BitCode[32767 + Diff], bw); } for (end0pos = 63; (end0pos > 0) && (DU[end0pos] == 0); end0pos ) ; i = 1; while (i

Ngày đăng: 26/03/2021, 07:07

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan