Hay gặp nhất trong công nghệ thông tin là nén hình ảnh và âm thanh. Có nhiều giải thuật được đặt ra để đáp ứng yêu cầu giảm thiểu kích thước của file ảnh sao cho vẫn duy trì được chất lượng ở mức độ chấp nhận được. Những giải thuật này đều dựa trên nền tảng là loại bớt những màu mà mắt người không hoặc khó cảm nhận được, chỉ giữ lại những màu chủ yếu thực sự ảnh hưởng tích cực lên khả năng cảm nhận màu của mắt. Nếu đã từng biên tập hình ảnh bằng Photoshop, bạn sẽ dễ dàng nhận thấy sự khác biệt khá lớn giữa bảng màu chuẩn và bảng màu dùng cho hình ảnh tải lên web, tức là hình nén đấy. Trong bảng màu web, các màu trung gian, chuyển tiếp đã bị lược bỏ mất, thay vào đó là các màu tương đương cận kề. Tuy hai bảng màu này dễ phân biệt như vậy nhưng khi xem một hình ảnh bạn không dễ dàng nhận biết được đó là file.bmp (chưa nén), .gif hay .jpg (ảnh nén). Còn một cách nữa cũng sử dụng kiểu mất dữ liệu để nén hình là giảm độ phân giải, tức là bớt số điểm ảnh trên một inch (dots per inch - dpi). Cách này khi được sử dụng, tùy trường hợp mà phải gia giảm cho phù hợp. Độ phân giải cao quá thì phí chỗ, nhưng giảm đi nhiều quá thì bị “bể hình”.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Hình 2.4. Ví dụ minh họa nén tổn thất (nén DTC) 2.2.1. Nén JPEG
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, …
2.2.1.1. Ý tưởng của thuật toán
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 biến đổi chấp nhận mất mát thông tin dùng biến đổi Cosin rời rạc (DTC - Discrete Cosin Transform) của chuẩn JPEG.
2.2.1.2. Thuật toán nén ảnh JPEG
Nén ảnh 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: 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
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ B B N M l N k M B * ' '
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.
Hình 2.6. Quá trình giải nén ảnh theo chuẩn JPEG.
* 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 Cosin nhanh 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.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
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].
* 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. Trước khi vào phần chính của phương pháp biến đổi em xin trình bày phần biến đổi Cosin rời rạc (DCT) như sau:
Biến đổi Cosin rời rạc (DCT) thuận và ngược một chiều gồm N mẫu được định nghĩa như sau:
Cả DCT và IDCT đều là biến đổi trực giao, tách biệt và thực. Tính chất phân tách
(separable) ở đây nghĩa là biến đổi nhiều chiều của nó có thể phân tách thành các biến
đổi một chiều. Tính chất trực giao ở đây nghĩa là nếu các ma trận của DCT và IDCT là không bất thường (non-singular) và thực thì biến đổi ngược của chúng có thể đạt được bằng cách áp dụng toán tử hoán vị. Cũng như biến đổi FT, DCT cũng coi dữ liệu đầu vào là tín hiệu ổn định (bất biến).
Trong các chuẩn nén ảnh tĩnh vào video, người ta thường sử dụng DCT và IDCT có kích thước 8 mẫu. Bức ảnh hoặc khung ảnh video kích thước NxN được chia thành các khối không chồng chéo nhau hai chiều gọi là các ảnh con kích thước 8x8 rồi áp dụng biến đổi DCT hai chiều ở bộ mã hoá và áp dụng biến đổi IDCT ở bộ giải mã.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Thuật toán để tính 2-D DCT và IDCT là: thực hiện phép biến đổi 1-D lần lượt cho hàng rồi đến cột của ma trận.
Như vậy ở mỗi khối ảnh hai chiều kích thước 8x8, áp dụng biến đổi DCT để tạo ra mảng hai chiều các hệ số biến đổi. Hệ số có tương ứng với tần số không gian thấp nhất nhưng lại có giá trị lớn nhất được gọi là hệ số DC (một chiều), nó tỉ lệ với độ chói trung bình của cả khối ảnh 8x8. Các hệ số còn lại gọi là các hệ số AC (xoay chiều). Theo lý thuyết, biến đổi DCT không đem lại sự mất mát thông tin ảnh, mà đơn giản nó chỉ chuyển thông tin ảnh sang miền không gian mới thuật lợi hơn cho mã hoá ở bước tiếp theo.
* Lượng tử hóa
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.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ n yj j ) 1 ( ) ( 2 2 n n y y n j j j
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:
i i i i d d d d i dy y p dy y p y r 1 1 ) ( ) ( .
Bước 3: Nếu rN-1 ≠ r‟ điều chỉnh lại r0 và lặp lại từ bước 2 đến bước 3
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:
Bước 2: Lựa chọn tỷ lệ hệ số giữ lại trong mỗi khối.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ ij ij ij ij C C 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.
* 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ó nhiề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.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
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:
Hình 2.7: Hình minh họa về 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 nắ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ỏ.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
2.2.2.1. Giới thiệu
Nén ảnh nâng cao AIC là sự kết hợp giữa nén hình ảnh từ các tiêu chuẩn H.264/AVC (Advanced Video Coding) và chuẩn nén ảnh JPEG để tạo ra một phương pháp nén ảnh tĩnh mới có chất lượng nén tốt với độ phức tạp không cao. Cụ thể hơn, nó kết hợp khối dự đoán trong ảnh (Intra frame block prediction) của chuẩn H.264/AVC với phép biến đổi Cosin rời rạc (DCT) phương pháp JPEG, sau đó sẽ sử dụng mã số học nhị phân thích nghi ngữ cảnh CABAC (Context adaptive binary arithmetic coding) giống như thuật toán được sử dụng trong chuẩn H.264.
Chương trình mã hóa (nén ảnh) AIC cho kết quả tốt hơn so với JPEG và gần tương đồng với nén ảnh JPEG-2000. Để so sánh một cách nhanh hơn, ta có thể nhìn vào
hình 2.8, nén ở khoảng 0,95 bit cho mỗi điểm ảnh (tỉ lệ nén 25:1) bằng cách sử dụng các
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Hình 2.8. So sánh ảnh gốc và ảnh nén
Ta có thể nhìn thấy hình ảnh của JPEG-2000 có chất lượng tốt hơn, mặc dù nó có xu hướng mịn và làm mờ hình ảnh đi một chút, dẫn đến mất chi tiết. Hình ảnh JPEG là rõ ràng cho thấy là kém nhất và với chương trình AIC cho chất lượng nằm ở khoảng giữa JPEG và JPEG-2000. Mục tiêu của nén ảnh AIC là chất lượng ảnh tốt, thể hiện là tỷ số tín hiệu đỉnh trên nhiễu PSNR (Peak Signal to Noise Ratio), thậm chí còn cao hơn của chuẩn nén ảnh JPEG-2000. Điều này là do AIC bảo tồn các chi tiết tốt hơn, như ta có thể thấy rõ từng chi tiết nhỏ trong ảnh AIC.
2.2.2.2. Nén và chất lượng ảnh AIC khi so sánh với JPEG và JPEG-2000
Đối với hình ảnh chụp (photographic images), AIC thực hiện tốt hơn so với JPEG và gần bằng JPEG-2000. Đối với tốc độ bít điển hình (typical bit
rates), AIC thậm chí còn làm tốt hơn so với JPEG-2000.
Đối với các hình ảnh đồ họa (Graphic images) thì khoảng cách giữa JPEG- 2000 và AIC tăng lên, theo chiều hướng tốt hơn thuộc về JPEG-2000.
Đối với các ảnh nhỏ thì khoảng cách giữa AIC và JPEG-2000 cũng tăng lên, tuy nhiên chiều hướng tốt hơn thuộc về AIC. Với các kích thước hình ảnh lên đến 100x100 (hoặc 10.000 điểm ảnh) thì AIC thực hiện tốt hơn cho tốc độ nhanh và hình ảnh ổn định. Điều này sẽ làm cho phương pháp AIC lý tưởng cho các ảnh trên trang web.
Thời gian thực hiện của thuật toán AIC có phần chậm hơn so với JPEG, nhưng nhanh hơn so với JPEG-2000, thậm chí ngay cả khi không cần tối ưu hóa trong chương trình.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Hình 2.9. Sơ đồ khối nén AIC và giải nén AIC.
* AIC - Bộ chuyển đổi màu (Color conversion)
Đối với ảnh màu, bộ mã hóa hình ảnh nâng cao biển đổi ảnh gốc từ không gian màu RGB sang không gian màu YCbCr. Màu sắc này phân biệt độ chói và độ sắc nét trong hình ảnh. Độ sáng của hình ảnh sẽ được lưu trữ trong các kênh Y các kênh Cb và Cr giữ giá trị độ nét tương ứng với màu xanh và đỏ.