Các nguyên tắc nén : - Source encoder and destination decoders. - Nén mất mát thông tin và không mất mát thông tin. - Mã hóa entropy - Mã hóa dữ liệu nguồn. 1. Source encoder và destination decoders. - Source endcoder : là nơi thông tin đầu vào được nén. - Destination decoders : là nơi thông tin sau khi nén được giải nén
Chương 3 : Nén văn bản và hình ảnh 1.Các nguyên tắc nén. Các nguyên tắc nén : - Source encoder and destination decoders. - Nén mất mát thông tin và không mất mát thông tin. - Mã hóa entropy - Mã hóa dữ liệu nguồn. 1. Source encoder và destination decoders. - Source endcoder : là nơi thông tin đầu vào được nén. - Destination decoders : là nơi thông tin sau khi nén được giải nén 2. Nén mất mát thông tin và nén không mất mát thông tin. Thuật toán nén có thể được chia thành 2 loại : - Nén mất mát thông tin :dữ liệu trước khi nén và sau khi giải nén không giống nhau hoàn toàn nhưng vẫn đảm bảo thông tin không bị ảnh hưởng đến chất lượng thông tin . Ứng dụng trong nén âm thanh , hình ảnh. - Nén không mất mát thông tin : dữ liệu trước khi nén và sau khi giải nén giống nhau hoàn toàn.Ứng dụng trong nén văn bản. 3. Mã hóa entropy. - Là loại nén không mất mát thông tin. - Nguyên tắc nén : Trong văn bản gốc, tìm những đoạn kí tự giống nhau và thay thế chúng bằng các codeword mới có độ dài ngắn hơn. - 2 thuật toán điển hình là : Run-length-encoding(RLE) và statistical encoding. a. Run-length-encoding. - Nguyên tắc nén : Đầu tiên tìm trong thông tin nguồn một loạt các kí tự/bit nhị phân giống nhau. Sau đó thay thế chuỗi các kí tự/bít đó bởi 1 codeword mới bao gồm 2 thông tin :chiều dài của chuỗi con và kí tự/bít lặp. - Đặc điểm : độ dài của codeword cố định. - Một ứng dụng điển hình sử dụng kĩ thuật này là việc truyền các chuỗi nhị phân sinh ra từ bộ quyét của máy fax. b. Statistical encoding. - Statiscal encoding sử dụng 1 tập từ mã có độ dài thay đổi với từ mã ngắn được sử dụng để biểu diễn cho ký tự có tần suất xuất hiện lớn. - Đặc điểm : độ dài của codeword thay đổi nên độ dài của các codeword ngắn hơn không bao giờ là dạng bắt đầu của các codeword dài hơn. - Để tính số bít tối thiểu của 1 codeword ta sử dụng(H) công thức shanon : H= - ∑ i=1 n P i log 2 P i Trong đó : n là tổng số kí tự khác nhau trong chuỗi nguồn. Pi là tần suất xuất hiện của kí tự tứ i. - Số bít trung bình của một codeword = ∑ i=1 n N i P i Trong đó : Ni là số bít của codeword thứ i Pi là tần suất xuất hiện của kí tự thứ i. Hiệu suất (tính hoàn hảo) của một bộ codeword cụ thể thường được tính là tỷ lệ của Entropy của nguồn với số lượng trung bình của các bit cho mỗi codeword. Nếu hiệu suất =1 thì bộ codeword trên là hoàn hảo. 4. Mã hóa dữ liệu nguồn. a. Mã hóa vi sai. - Mã hóa vi sai được sử dụng rộng rãi trong các ứng dụng khi biên độ của 1 giá trị/tín hiệu nằm trong một phạm vi rộng nhưng sự sai khác trong biên độ giữa các giá trị/tín hiệu kế tiếp là tương đối nhỏ.Vì vậy lượng thông tin để mã hóa tương đối đơn giản. - Trong thực tế mã hóa vi sai có thể là không mất mát thông tinh hoặc mất mát thông tin và phụ thuộc vào số bit được sử dụng để mã hóa giá trị sai khác . Nếu số bit đã sử dụng đủ để phục vụ cho giá trị sai khác lớn nhất thì đó là không mất dữ liệu. Ngược lại, nếu giá trị khác biệt vượt quá số bit tối đa được sử dụng thì kết quả là mất mát thông tin. b. Mã hóa biến đổi. - Nguyên tắc : biến đổi dữ liệu trước khi nén sang 1 dạng khác dễ nén hơn. Nó sử dụng một phép biến đổi để chuyển từ miền không gian sang miền tần số. Nhìn chung , là loại nén mất mát thông tin và được sử dụng trong một số ứng dụng liên quan đến cả ảnh và video. - Tần số không gian (spatial frequency) : - DTC (discrete cosine transform) : là kĩ thuật dùng để chuyển đổi một ma trận 2 chiều của các giá trị điểm ảnh thành một ma trận tương đương của các thành phần tần số không gian. Hành động chuyển đổi này là không mất dữ liệu. 2. Nén văn bản. - Các thuật toán nén liên quan tới văn bản đề là nén không mất mát thông tin. - Về cơ bản, có 2 phương pháp mã hoá thống kê được sử dụng với dạng văn bản : Nén từng kí tự trong văn bản. Ví dụ : 2 thuật toán là nén huffman và nén số học(arithmetic coding). Nén từng từ trong văn bản. Ví dụ : thuật toán nén LZ và LZW. - Có 2 loại mã hóa được sử dụng cho văn bản : Static coding : Dành cho các ứng dụng trong các văn bản biết được các đặc điểm của kí tự và tần suất xuất hiện của chúng. Thay vì sử dụng các từ mã có chiều dài cố định, ta sử dụng bộ từ mã tối ưu có chiều dài thay đổi. Từ mã ngắn nhất sử dụng để biểu diễn cho các kí tự xuất hiện thường xuyên nhất. Dynamic hoặc adaptive coding : dành cho các ứng dụng tổng quát hơn trong các văn bản có thể bị chuyển từ dạng này sang dạng khác và bộ từ mã tối ưu cũng thay đổi từ dạng này sang dạng khác.Với phương pháp này thì người nhận có thể tự động tính toán trên cùng một bộ codeword đang được sử dụng tại mỗi điểm chuyển giao. a. Static Huffman coding - Là phương pháp dựa vào mô hình thống kê. - Để thực hiện mã hóa, người ta tạo ra một cây Huffman. Nó là một cây nhị phân với các nhánh được phân các giá trị là 0 hoặc 1 và có: Root node :là cơ sở của cây nhị phân. Branch node :là các điểm ở trên nhánh. Leaf node :là điểm kết thúc của mỗi nhánh biểu diễn cho các kí tự. - Các bước thực hiện nén : Bước 1 : Phân tích văn bản đầu vào, phân loại các kí tự và tính tần suất xuất hiện của các kí tự đó. Bước 2 : Sắp xếp lại bảng mã theo thứ tự tần suất xuất hiện giảm dần. Bước 3 : Duyệt bảng tần suất từ cuối lên đầu để thực hiện ghép 2 phần tử có tần suất xuất hiện thấp nhất thành một phần tử duy nhất. Tiến hành cập nhật lại bảng và loại bỏ 2 phần tử vừa xét. Quá trình lặp đi lặp lại cho đến khi bẳng chỉ còn lại một phần tử. Bước 4 : Tiến hành gán mã cho các nút lá với nhánh bên phải là 1 và nhánh bên trái là 0. Từ mã được sử dụng cho mỗi kí tự được xác định bằng cách tìm đường đi từ gốc cho đến nút lá. - Cây tối ưu nếu trọng số của các nút lá và nút nhánh trên cây (liệt kê từ trái qua phải, từ dưới lên trên) sắp xếp theo chiều tăng dần. - Prefix property :Mã của kí tự ngắn hơn không bao giờ là tiền tố của các mã dài hơn nó. - Sơ đồ giải mã : - Cây mã Huffman thay đổi cho các tập các kí tự được truyền vì vậy để bên nhận thực hiện hành động giải mã thì nó phải biết được bảng các codeword liên quan tới dữ liệu được truyền.Nhược điểm của phương pháp này là chi phí phải gửi các tập từ mã mới (và kí tự tương ứng) bất cứ khi nào 1 loại dữ liệu mới được gửi và tốn băng thông để truyền. b. Dynamic Huffman coding(mã hóa huffman động) - Với phương pháp này thì cả người gửi(nén) và người nhận(giải nén) cùng xây dựng cây Huffman động cho các kí tự được truyền. - Các bước thực hiện hành động nén : Bước 1 : Cả người gửi và người nhận bắt đầu xây dựng một cây bao gồm 1 nút và 1 nút lá rỗng(empty leaf node-e0-tần suất xuất hiện là 0 và nhánh được chỉ định là 0). Bước 2 : Cập nhật từng kí tự vào trong cây theo quy tắc : o Nếu kí tự đang xét chưa xuất hiện trong cây thì thêm mới một nút lávà nút lá e0 ở trên cây bị chuyển xuống một nhánh mới, nút lá rỗng được chỉ định là nhánh 0 và và kí tự là nhánh 1. o Nếu kí tự đang xét đã có trong cây thì tăng trọng số(tần suất xuất hiện) của kí tự đó lên một. o Cập nhật trọng số của các nút liên quan trong cây sao cho trọng số của các nút nhánh bằng tổng các trọng số của các nút con của nó. - Để đảm bảo cả bộ nén và bộ giải nén làm điều này một cách nhất quán, chúng liệt kê các trọng số của nút lá và nút nhánh để cập nhật cây từ trái qua phải và từ dưới lên trên bắt đầu ở nút lá rỗng. Nếu tất cả các trọng số sắp xếp theo thứ tự thì tất cả là tốt và câú trúc của cây là không thay đổi. Nếu có một nút không theo thứ tự thì cấu trúc của cây được sửa đổi bằng cách thay đổi vị trí của nút này với một nút khác ở trên cây- cùng với các nút nhánh và nút lá của nó- để tạo ra một thứ tự trọng số tăng dần. - Ưu điểm của phương pháp là : tiết kiệm chi phí và băng thông truyền. c. Mã hóa số học(Arithmetic coding) - Là thuật toán số học : là phương pháp nén dữ liệu tạo ra các từ mã có chiều dài thay đổi và ngày càng được sử dụng phổ biến. - Phương pháp số học dùng một số thực để biểu diễn chuỗi cụ thể là sử dụng các khoảng con nằm trong đoạn [0,1] để biểu diễn những kí hiệu của mã. - Các bước tiến hành : Bước 1 :Chia thông điệp ban đầu thành các chuỗi con. Phân tích chuỗi và tính tần suất suất hiện của các kí tự trong chuỗi. Bước 2 : Thực hiện quá trình mã hóa. Kí tự thứ 1 trong chuỗi được mã hóa bằng cách chọn một khoảng tương ứng. chiều dài của khoảng con được xác định bằng xác suất xuất hiện của kí tự đó.Những kí hiệu tiếp theo được mã hóa bằng cách mở rộng khoảng con được chon thành một khoảng đơn vị và chọn một khoảng con tương ứng. Ở cuối chuỗi, phần tử duy nhất của khoảng con đã chọn được gửi như một từ mã, cùng với kí thiệu chấm dứt của thông điệp. - Bên nhận sẽ gửi một số bất kì nằm trong khoảng con cuối cùng và thứ tự sắp xếp tần suất xuất hiện của từng kí tự trong chuỗi. Bến nhận sẽ dựa vào 2 thông tin trên để tìm ra văn bản nguồn. - Đánh giá : Đây là thuật toán chỉ sử dụng một từ mã để mã hóa cho cả chuỗi các kí tự.Nó gần như đạt được giá trị shanon bởi vì nó không bị bó buộc vào việc gán những bit số nguyên cho mỗi kí hiệu. d. Mã Lempel-Ziv coding - Thuật toán LZ (Lempel-Zip) là thuật toán nén dữ liệu theo từ điển cơ sở (Dictionarybased compression) .Nó sử dụng một bảng chứa tất cả các chuỗi ký tự có thể xuất hiện trong văn bản và được chứa trên cả bộ mã hóa và giải mã gọi là từ điển. - Thuật toán LZ sử dụng 1 từ điển chung cho cả mã hóa và giải mã bao gồm các kí tự cơ bản và các từ hay được sử dụng.Bộ mã hóa thay vì gửi các từ riêng lẻ, nó chỉ gửi chỉ số của từ được lưu trong bảng. Bộ giải mã sẽ truy cập vào bảng xử lý để tái tạo lại văn bản đó. - Đánh giá : Là một thuật toán nén văn bản khá tốt vì khi gửi dữ liệu không cần gửi bảng mã kèm theo do đó tiết kiệm băng thông. Tuy nhiên việc nén dữ liệu phụ thuộc vào bảng từ điển của cả bên nhận và bên gửi. Vì vậy nếu số lượng các từ có trong từ điển ít thì không đủ để mã hóa hết văn bản, ngược lại nếu số lượng từ có trong từ điển lớn thì sẽ tốn bộ nhớ để lưu trữ. Không hiệu quả đối với những văn bản có số từ xuất hiện ít trong từ điển. e. Thuật toán nén LZW(Lempel – Ziv –Welsh coding). - Nguyên tắc :sử dụng một bộ từ điển động được xây dựng trên cả bộ mã hóa và giải mã. - Đầu tiên, từ điển của cả bộ mã hóa và giải mã là tập bao gồm các từ cơ bản .Ví dụ như bảng mã ASCII. Sau đó, bộ mã hóa và giải mã sẽ xây dựng động các mục còn lại trong từ điển bao gồm các từ có trong văn bản. - Cách xây dựng từ điển : Giả thiết ban đầu, cả bộ mã hóa và bộ giải mã lưu trữ một bộ từ điển cơ bản Ví dụ :128 kí tự trong bảng mã ASCII. Sau đó bộ mã hóa sẽ đọc các kí tự tiếp theo trong văn bản cho đến khi gặp một chuỗi trắng và nhận định đó là 1 từ.Nó sẽ duyệt trong từ điển, nếu từ đã xuất hiện trong từ điển thì nó sẽ gửi chỉ số của từ đó sang bên nhận. Tương tự bộ giải mã sẽ sử dụng chỉ số để truy cập vào chuỗi kí tự đó . Ngược lại nếu từ đó chưa xuất hiện trong từ điển, nó tiến hành lưu trữ các kí tự này vào một mục mới đồng thời sẽ truyền các chỉ số tương ứng với từng kí tự trong từ đang xét. - Đánh giá : Có thể khẳng định kích thước của từ điển trong thuật toán nén Huffman động tối ưu hơn so với từ điển trong thuật toán nén Huffman tĩnh do đó tiết kiệm được bộ nhớ và có tỉ lệ nén cao.Mặt khác, khi gửi dữ liệu thì không cần gửi bảng từ mã kèm theo do đó tiết kiệm băng thông. 3. Nén ảnh- Thuật toán nén JPEG - Thuật toán nén ảnh JPEG là loại nén mất mát thông tin được xác định trong chuẩn quốc tế ISO 10918. - Quá trình nén trải qua 5 giai đoạn chính : image/block preparation, forward DCT, quantization, entropy encoding và frame building. a. Image/block preqaration • Bước 1 : Chuẩn bị ảnh. - Ảnh được tạo nên từ một hoặc nhiều ma trận 2 chiều. Ảnh đơn sắc chỉ sử dụng 1 ma trận 2 chiều để thiết lập 8 bit giá trị mức xám Ảnh màuchúng ta có 2 loại biểu diễn : + R,G,B cần 8 bit để biểu diễn nên ta cần 3 ma trận, mỗi ma trận có kích thước là 16x16 biểu diễn cho 1 màu. + Y,Cb,Cr :Cần 3 ma trận1 ma trận có kích thước 16x16 biểu diễn cho Y, 2 ma trận kích thước 8x8 biểu diễn cho Cb và Cr. • Bước 2: Block preparation : Chia ma trận thành các khối có kích thước nhỏ hơn 8x8 b. Forward DCT - Chức năng của DCT :Chuyển đổi ma trận hai chiều của giá trị pixel vào một ma trận tương đương của các thành phần tần số. Thay vì biểu diễn ảnh thành ma trận điểm ảnh, biểu diễn thành ma trận tần số thay đổi của các điểm ảnh sẽ giảm việc biểu diễn, lưu trữ ảnh. - Mỗi pixel được lượng tử hóa sử dụng 8 bit để tạo ra một giá trị trong phạm vi từ 0- 255 cho giá trị cường độ/độ sáng R,G,B hoặc Y và -128-+127 cho giá trị đơn sắc Cb và Cr. - Để tính DCT, lấy tất cả các giá trị cường độ/độ sáng trừ đi 128. Sau đó một ma trận đầu vào 2 chiều được biểu diễn là P[x,y] và được chuyển thành ma trận F[i,j]. DCT của các giá trị của mỗi khối 8x8 theo công thức : và x,y,i và j thay đổi từ 0->7 F[0,0] là hệ số DC còn lại là hệ số AC c. Quantization(Lượng tử hóa). - Chức năng :cắt toàn bộ các tần số cao, giữ lại các tần số thấp.Vì mắt người phản ứng chủ yếu với các hệ số DC trong không gian hệ số tần số thấp. Do đó, nếu độ lớn của các hệ số tần số cao dưới 1 ngưỡng nhất định, mắt sẽ không thể phát hiện.Vì vậy,tính chất này được khai thác trong pha lượng tử hóa bằng cách xóa (chuyển thành 0) các hệ số tần số không gian trong ma trận chuyển có biên độ nhỏ hơn 1 giá trị ngưỡng xác định. - Lượng tử hóa nhằm mục đích giảm thiểu kích cỡ của các hệ số DC và AC dẫn đến giảm băng thông khi truyền. - Giá trị ngưỡng sử dụng thay đổi cho mỗi hệ số của 64 hệ số DC được lưu trữ trong một ma trận 2 chiều hay là bảng lượng tử hóa(quantization table). - Việc chọn giá trị ngưỡng là quan trọng và là thỏa hiệp giữa mức độ được yêu cầu và kết quả lượng thông tin bị mất có thể chấp nhận được. - JPEG chuẩn bao gồm 2 bảng giá trị lượng tử hóa mặc định- 1 sử dụng cho các hệ số độ sáng và 1 bảng khác sử dụng cho 2 bộ hệ số chrominance(độ đậm nhạt của màu sắc). d. Entropy encoding : bao gồm 4 bước : vectoring, mã hóa vi sai, mã hóa RLE và mã hóa Huffman. • Vectoring : Biến đổi ma trận 2 chiều thành các ma trận 1 chiều bằng cách duyệt ma trận theo kiểu zigzag để các giá trị 0 trong ma trận nằm ở cùng một phía và các giá trị khác 0 nằm về 1 phía. Thao tác này sẽ làm giảm khối lượng nén xuống thay vì sử dụng phương pháp line by line. • Mã hóa vi sai : sử dụng để mã hóa các hệ số DC. - Các thành phần đầu tiên trong mỗi khối đã chuyển là hệ số DC.Do các hệ số DC này ít biến đổi nên ít có sự sai khác giữa các DC do đó sử dụng thuật toán nén vi sai để mã hóa. - Các giá trị khác biệt này được mã hóa dưới dạng (SSS, value) trong đó SSS là số bit cần thiết để mã hóa value và value là số bit hiện tại biểu diễn cho giá trị. - Các quy tắc được sử dụng để mã hóa mỗi giá trị được tóm tắt: • Mã hóa RLE : Sử dụng để mã hóa các hệ số AC. - 63 giá trị còn lại trong vector là các hệ số AC.Các hệ số AC được mã hóa dưới dạng (skip,value). Trong đó : skip là số các giá trị 0 trong khi duyệt khối và value là các hệ số khác 0 tiếp theo.Khi gặp (0,0) tức là đã duyệt hết khối và tất cả các hệ số còn lại trong khối là 0 và trường value được mã hóa từ trong dạng SSS/value. • Mã hóa Huffman - Phương pháp này được sử dụng để mã hóa đầu ra của cả mã hóa vi sai và mã hóa RLC. [...]... dựng nén Frame - Vai trò của frame builder là để đóng gói tất cả các thông tin liên quan tới ảnh/ bức tranh được mã hóa trong dạng này.Cấu trúc của 1 frame là phân cấp với : Frame Header : + Chiều rộng và chiều cao của hình ảnhbằng pixel + Số lượng và loại của các thành phần được sử dụng biểu diễn cho hình ảnh (CLUT, RGB, YCbCr) + Định dạng số hóa được sử dụng: ( 4:2 :2 ,4; 2, 0, vv) Scan Header : +... mỗi thành phần + Giá trị của bảng lượng tử được sử dụng để mã hóa mỗithành phần GIẢI NÉN JPEG - Bộ giải nén hoạt động ngược lại so với bộ nén Frame decoder : trên dòng bit nhận được frame decoder đầu tiên xác định thông tin điều khiển và bảng chứa các thành phần header khác nhau Sau đó tải nội dung của mỗi bảng vào trong bảng liên quan và qua thông tin điểu khiển để xây dựng ảnh( image bulder)