2.2.1.1. Nén trong ảnh
Nén trong ảnh dựa trên hai cơ sở:
• Một là dựa trên tính chất ảnh có độ dư thừa về mặt không gian. Điều này được hiểu như sau. Mỗi một ảnh như chúng ta đã biết có thể coi như một tập hợp các điểm ảnh. Các điểm ảnh này không độc lập riêng rẽ mà có quan hệ với nhau. Mỗi một điểm ảnh cùng với 8 điểm ảnh xung quanh sẽ có quan hệ mật thiết nhất. Quan hệ này sẽ giảm dần đối với các điểm ảnh càng cách xa nhau. Trong video, để thuận tiện cho việc nén, người ta dùng khái niệm Block và Macroblock để giới hạn các điểm ảnh có liên quan đến nhau. Mỗi block là một ma trận gồm 8x8 điểm ảnh, còn một Macroblock lại gồm 4 block. Các điểm ảnh trong block không có sự sai khác nhau nhiều lắm, đặc biệt là các điểm ảnh kế cận nhau, chúng có thể mang những thông tin giống nhau. Vì vậy một điểm ảnh có thể được suy từ một vài điểm ảnh khác hay khái quát hơn từ một số điểm ảnh có thể suy ra toàn bộ ảnh, như vậy ảnh có độ dư thừa thông tin về mặt không gian, việc truyền đi tất cả các điểm ảnh với những thông tin giống nhau là không cần thiết. Nén ảnh thực hiện đối với từng macroblock, nhằm loại bỏ những thông tin dư thừa không cần thiết, rồi tiến hành mã tiết kiệm (chỉ mã sự sai khác nhau giữa các điểm ảnh), nhờ vậy mà số bit cần dùng sẽ giảm xuống rất nhiều.
• Cơ sở thứ hai là dựa trên đặc tính cảm nhận của mắt. Mắt người rất nhạy cảm với các thành phần tần số thấp, kém nhạy cảm với các chi tiết nhỏ ứng với các thành phần tần số cao. Việc chia ảnh thành các block là rất hợp lý cho việc nén tín hiệu dựa trên cả hai đặc tính trên. Bởi vì trong một ảnh sẽ có những vùng có độ dư thừa thông tin cao hơn hoặc có những vùng chứa nhiều thành phần tần số cao mà mắt người kém
nhạy cảm nên việc mã hóa không cần chính xác với toàn bộ các mẫu của ảnh. Với những mẫu cầu độ chính xác không cao lắm có thể mã bằng ít bit hơn các mẫu khác, do vậy số bít cần dùng cũng giảm xuống đáng kể.
Quá trình nén trong ảnh bao gồm 3 bước chính: biến đổi DCT, lượng tử hóa, mã hóa được biểu diễn trên hình sau:
Hình 2.1. Nén trong ảnh
Trước khi nén, ảnh được chia thành các block gồm 8x8 mẫu tín hiệu chói và các khối tương ứng của tín hiệu màu. Từng block sẽ được biến đổi cosin rời rạc DCT. DCT là phép biến đổi tín hiệu không tổn hao, có tính thuận nghịch, tín hiệu sau phép biến đổi này hoàn toàn có thể khôi phục nguyên vẹn như ban đầu. Mục đích của phép biến đổi DCT là xác định thông tin dư thừa trong miền không gian của một macroblock. Phép biến đổi DCT biến dữ liệu dưới dạng biên độ thành dữ liêu dưới dạng tần số. Có thể hiểu phép biến đổi này một cách đơn giản như sau. Mỗi một mẫu có vị trí (x,y) trong block có một giá trị độ chói (đây chính là dữ liệu dưới dạng biên độ). Nếu xét về mặt tần số thì mỗi mẫu đó ứng với một thành phần tần số cụ thể (gọi là tần số xy), trong block trước khi biến đổi DCT, các mẫu này được sắp xếp một cách ngẫu nhiên về mặt tần số. Phép biến đổi DCT dùng một hàm F(u,v) có đối số là vị
Điều khiển tốc độ bít Bảng lượng tử DCT Lượng tử hóa Mã hóa Entropy (VLC,RLC) Mạch trộn Bộ đệm
trí của mẫu (x,y) và giá trị độ chói của mẫu. Kết quả phép biến đổi là mẫu (x,y) sẽ chuyển sang vị trí mới (u,v) trong bảng hệ số DCT 8x8, vị trí (u,v) ứng với tần số xy của mẫu và giá trị của mẫu mới (hệ số DCT) sẽ biểu thị lượng thông tin mẫu (x,y) mang, với những mẫu chứa lượng thông tin lớn giá trị f(u,v) là lớn và ngược lại. Như vậy, sau phép biến đổi DCT, các mẫu trong block được sắp xếp lại theo tần số và giá trị mẫu mới C(u,v) biểu thị lượng thông tin mẫu chứa (dữ liệu được chuyển sang dạng tần số).
Mỗi block 8x8 mẫu sẽ cho ra một bảng hệ số DCT (gồm 8x8 số). Hệ số nằm góc trái trên cùng (hệ số 0,0) ứng với thành phần tần số thấp nhất (thành phần tần số một chiều). Các hệ số phía dưới giá trị thành phần một chiều, biểu thị các thành phần tần số cao hơn theo chiều dọc. Các hệ số ở phía bên phải của thành phần một chiều, biểu thị các tần số cao hơn theo chiều ngang. Còn các hệ số khác ứng với những phối hợp khác nhau của tần số theo chiều dọc và chiều ngang. Do tính chất của tín hiệu video, hệ số góc trái trên cùng của bảng sẽ có giá trị lớn nhất, các hệ số ứng với thành phần tần số cao, nằm ở góc phải trên cùng hay góc trái dưới cùng sẽ có giá trị nhỏ nhất.
Biến đổi DCT về lý thuyết không giảm bớt dung lượng dữ liệu bởi vì mỗi mẫu cho ta một hệ số DCT. Tuy nhiên, nhờ vào phép biến đổi DCT mà ta phân định được vùng dữ liệu thừa hay những vùng mắt kém nhạy cảm. Quá trình nén được thực hiện ở khâu lượng tử và mã hóa, với các vùng dữ liệu mắt kém nhạy cảm có thể biểu thị bằng một số lượng bit rất nhỏ hoặc loại bỏ mà không nhận biết được sự suy giảm chất lượng.
Lượng tử hóa có thể theo nhiều cách khác nhau. Một là tiến hành lượng tử hóa và mã hóa trực tiếp với các hệ số DCT. Có thể nén tín hiệu bằng cách sử dụng số bit mã phù hợp với các hệ số DCT. Số bit dùng để mã thay đổi theo mức độ quan trọng của hệ số DCT, dựa trên cảm nhận của mắt. Hệ số một chiều (0,0) đòi hỏi độ chính xác cao nhất vì nó biểu thị độ chói trung bình của từng khối phần tử ảnh (từng block). Bất kỳ một sự sai sót nào trong quá
trình lượng tử hóa hệ số một chiều đều có khả năng được nhận biết dễ dàng bởi nó làm thay đổi mức chói trung bình của khối. Trong quá trình lượng tử hóa, ta có thể dùng tới 11 bit cho hệ số một chiều và rất ít bit cho các hệ số có số thứ tự cao hơn ứng với thành phần tần số cao mắt kém nhậy cảm.
Lượng tử hóa còn được thực hiện bằng cách thứ hai gọi là lượng tử hóa có trọng số với cách làm như sau: chia các hệ số DCT (C(u,v)) cho các hệ số ở vị trí tương ứng với nó trong bảng lượng tử, hệ số ứng với tần số thấp được chia cho các giá trị nhỏ (10,11,12,...). Hệ số ứng với tần số cao được chia cho các giá trị lớn (100,120,121,...) và bỏ đi phần thập phân. Bằng cách đó, các thành phần tần số thấp sẽ được lượng tử hóa chính xác hơn các thành phần tần số cao. Bảng lượng tử có thể coi như một ma trận trọng số của bảng hệ số DCT, giá trị trong bảng lượng tử càng nhỏ thì mức độ quan trọng của hệ số DCT càng lớn và ngược lại. Vì vậy phương pháp này được gọi là lượng tử hóa có trọng số. Cần chú ý, lượng tử hóa có trọng số sẽ gây tổn hao, mức độ tổn hao phụ thuộc vào giá trị các hệ số trên bảng lượng tử. Nếu các giá trị lựa chọn thích hợp, tổn hao sẽ rất nhỏ và trên thực tế sẽ không nhận thấy.
Sau quá trình lượng tử hóa gián tiếp các hệ số DCT, ta thu được một bảng các hệ số C'(u,v), trong đó các hệ số tương ứng với thành phần tần số cao (được chia cho các hệ số lớn) phần lớn sẽ bằng 0. Các hệ số C'(u,v) sẽ được mã hóa Entropy. Mã hóa Entropy là tên gọi chung của các cách mã hóa không tổn hao, tuân theo lý thuyết về Entropy. Lý thuyết này chỉ ra số bit trung bình ít nhất dùng để mã sao cho quá trình mã hóa không gây tổn hao, tức là tín hiệu sau khi mã có thể khôi phục y nguyên như lúc ban đầu. Có thể mã hóa Entropy bằng 2 cách: mã hóa với độ dài thay đổi (VLC) hoặc mã hóa theo chiều dài (RLC). VLC là cách mã hóa dựa trên kết quả của phép thống kê, các mẫu có xác suất xuất hiện lớn, sẽ mã bằng các từ mã ngắn, các mẫu có xác xuất xuất hiện thấp, sẽ được mã bằng các từ mã dài hơn. RLC là phương
pháp mã dựa trên sự lặp lại của cùng giá trị mẫu để tạo ra các mã đặc biệt để biểu diễn sự bắt đầu và kết thúc của giá trị được lặp lại. Chẳng hạn như, quá trình lượng tử hóa có trọng số tạo ra nhiều giá trị '0', ta sẽ dùng một từ mã để biểu diễn độ dài của chuỗi '0' và giá trị '0' của chuỗi. Để tăng hiệu quả nén, cách quét (truyền các mẫu) không cần quét lần lượt từng dòng mà theo các đường zíc - zắc để chuỗi giá trị giống nhau là dài nhất. Cả hai cách mã VLC và RLC đều mang lại hiệu quả nén rất tôt.
Sau khi mã hóa Entropy, ta nhận được chuỗi bit có tốc độ thay đổi. Nếu phải truyền qua kênh có tốc độ cố định thì cần có bộ nhớ đệm. Bộ mã hóa sẽ kiểm tra trạng thái đầy của bộ đệm, khi số liệu trong bộ nhớ đệm gần bằng dung lượng cực đại, mạch trộn sẽ điều chỉnh lại các giá trị trong bảng lượng tử (tăng lên) để các hệ số DCT được lượng tử ít chính xác hơn. Ngược lại, khi bộ nhớ đệm chứa số liệu quá ít, thì các hệ số trong bảng lượng tử nhỏ đi, các hệ số DCT sẽ được lượng tử hóa chính xác hơn. Như vậy tốc độ bit đầu ra sẽ ổn định và không xẩy ra hiện tượng tràn bộ nhớ đệm.
Trên đây là toàn bộ quá trình nén trong ảnh. Ảnh tạo ra gọi là ảnh I, qua trình này không sử dụng thông tin của các ảnh trước và sau của ảnh đang xét.
2.2.1.2. Nén liên ảnh
Cơ sở của nén liên ảnh là tín hiệu video có chứa thông tin dư thừa trong miền thời gian. Điều này có nghĩa là với một chuỗi liên tục các ảnh, lượng thông tin chứa đựng giữa các ảnh liên tiếp thay đổi rất ít. Bởi vậy, tương tự như nén trong ảnh là không truyền đi toàn bộ các điểm ảnh, nén liên ảnh cũng không cần thiết phải truyền toàn bộ chuỗi ảnh mà chỉ cần truyền một số ảnh gốc và các thông tin để khôi phục các ảnh còn lại (thông tin này gọi là số liệu về véc-tơ chuyển động). Nhờ việc giảm bớt số ảnh cần truyền mà lượng thông tin truyền đi sẽ giảm xuống rất nhiều. Mặt khác ta có thể nâng cao hiệu quả nén bằng cách mã vi sai, tức là mã sự sai khác giữa ảnh dự đoán và ảnh thực
tế của ảnh dự đoán (ảnh sau quá trình nén vi sai được gọi là ảnh khác biệt), trong cách mã này phía phát cần có các bước để tạo ảnh dự đoán. Khi phát thay vì truyền đi các ảnh gốc ta chỉ truyền ảnh khác biệt cùng với các thông tin để khôi phục ảnh (là các véc-tơ chuyển động). Véc-tơ chuyển động vừa được sử dụng để tạo ảnh dự đoán ở phía phát và vừa được truyền đi để khôi phục ảnh đã nén thành dạng ban đầu trong phần giải nén. Ảnh dự đoán càng chính xác thì thông tin cần truyền sẽ càng ít, hiệu quả nén càng cao.
Có hai phương pháp nén liên ảnh: mã hóa ảnh dự đoán trước tạo ra ảnh loại P và mã hóa ảnh dự đoán hai chiều tạo ra ảnh loại B. Dưới đây là sơ đồ tổng quát của 2 phương pháp nén.
Hình 2.2. Nén liên ảnh
Hai phương pháp trên đều dựa theo nguyên tắc mã vi sai giữa ảnh dự đoán và ảnh thực tế như đã nói. Điểm phân biệt giữa hai phương pháp là ở cách xác định véc-tơ chuyển động (hay cách tạo ra ảnh dự đoán).
Véctơ chuyển động Ảnh dự đoán + + _ + Ảnh thực tế của ảnh dự đoán Ảnh so sánh Ảnh dự đoán Xác định véc-tơ chuyển động Σ Σ Ảnh khác biệt
tạo lại ảnh dùng cho dự đoán ảnh tiếp theo
Trong sơ đồ trên, "ảnh thực tế của ảnh dự đoán "chính là ảnh gốc chưa bị nén. Ảnh này có hai nhiệm vụ, một là dùng để xác định véc-tơ chuyển động, nhiệm vụ thứ hai là để so sánh với ảnh dự đoán để tạo ra ảnh khác biệt.
Đối với ảnh loại P, thông tin dùng để tạo ảnh dự đoán được lấy từ các ảnh trước đó. Cách xác định véc-tơ chuyển động đối với ảnh P như sau. Ảnh thực tế của ảnh dự đoán và ảnh đem so sánh (ảnh trước đó) đều được chia thành các maroblock. So sánh giữa hai ảnh ta sẽ xác định phần chuyển động và phần tĩnh của ảnh. Phần tĩnh sẽ giữ nguyên vị trí còn phần động sẽ chuyển sang maroblock khác trong "ảnh thực tế của ảnh dự đoán". Xác định maroblock chứa phần động trong ảnh gốc và ảnh thực tế thì đoạn nối giữa 2 maroblock tạo ra véc-tơ chuyển động. Ảnh dự đoán nhận được bằng cách dịch chuyển phần động sang vị trí mới theo véc-tơ chuyển động, còn phần tĩnh giữ nguyên như trong ảnh so sánh.
Đối với ảnh lại B, thông tin dùng để tạo ra ảnh dự đoán được lấy từ ảnh phía trước và phía sau "ảnh thực tế của ảnh dự đoán". Ảnh thực tế đem so sánh với ảnh trước và ảnh sau sẽ tạo ra hai véc-tơ chuyển động. Các ảnh phía trước và ảnh sau của "ảnh thực tế của ảnh dự đoán " sẽ là các ảnh so sánh. Như vậy, khác với ảnh P, ảnh so sánh của ảnh P là các ảnh phía trước nó, ảnh so sánh của ảnh B bao gồm ít nhất hai ảnh lấy từ 2 phía (trước và sau của ảnh B), bởi vậy ảnh dự đoán loại B sẽ chính xác hơn, mức độ nén số liệu sẽ cao hơn so với trường hợp nén ảnh P.
2.2.1.3. Nén video theo tiêu chuẩn MPEG
Hình 2.3. Nguyên lý nén MPEG
MPEG là sự kết hợp giữa nén trong ảnh và nén liên ảnh. Quá trình nén liên ảnh được thực hiện trước tạo ra ảnh khác biệt ở đầu ra bộ cộng. Ảnh này sau đó lại được nén trong ảnh qua các bước: biến đổi DCT, lượng tử hóa, mã hóa. Cuối cùng ảnh này được trộn với véc-tơ chuyển động đưa đến bộ khuyếch đại đệm rồi truyền đi.
Ví dụ đầu vào của bộ nén là một chuỗi các ảnh liên tiếp nhau, ảnh thứ nhất mã hóa như loại ảnh I. Trong trường hợp này, sau khi lấy mẫu lần đầu tiên, tín hiệu video được truyền đến khối biến đổi DCT cho các macroblock riêng, sau đó được đưa đến bộ lượng tử hóa và mã hóa entropy. Tín hiệu ra từ bộ lượng tử hóa được đưa đến bộ lượng tử hóa ngược, biến đổi DCT ngược sau đó được lưu vào bộ nhớ ảnh. Bộ nhớ ảnh bao gồm ảnh xuất hiện trong bộ giải mã sau khi giải mã ảnh truyền loại I.
Trong trường hợp mã hóa ảnh loại P, trên cơ sở so sánh giữa ảnh đang xét và ảnh trong bộ nhớ, ta sẽ xác định được các véc-tơ chuyển động, sau đó dự báo ảnh. Sự chênh lệch giữa ảnh đang xét và dự báo ảnh của nó lại được bién đổi DCT, lượng tử hóa và mã hóa entropy. Cũng như trong trường hợp các loại ảnh I, tín hiệu ra từ bộ lượng tử hóa được giải lượng tử hóa và biến đổi ngược DCT rồi cộng với ảnh dự báo đang xét và lưu vào bộ nhớ dùng trong dự báo ảnh tiếp theo.
Một vấn đề đặt ra đối với nén ảnh MPEG là, trong chuỗi ảnh gồm nhiều ảnh liên tiếp như vậy, ảnh nào sẽ được mã hóa như loại ảnh I, ảnh P, hay ảnh B. Việc quyết định nén ảnh theo loại nào (I, P, B) cho từng ảnh sẽ có một bộ phận đảm nhiệm, từ đó sinh ra khái niệm nhóm ảnh GOP và điều khiển nhóm ảnh. Nhờ việc điều khiển nhóm ảnh mà chuỗi ảnh liên tiếp sẽ ngắt thành nhiều đoạn liên tiếp, mỗi đoạn sẽ chứa một số GOP, các ảnh trong GOP sẽ được nén loại I, P, hay B theo sự điều khiển của nhóm ảnh. Có hai cấu trúc của GOP: cấu trúc GOP mở quy định ảnh bắt đầu và kết thúc của GOP đều là