Mục lục 1. Sơ đồ khối thuật toán nén ảnh JPEG. 1 2. Phân khối 2 3. Biến đổi DCT 3 3.1 Biến đổi DCT một chiều 3 3.2 Biến đổi DCT hai chiều 4 4 Lượng tử hóa 5 5 Mã hóa 7 5.1 Các phương pháp mã hóa 7 5.2 Mã hóa các hệ số DCT Fq(u,v) 10
Trang 1Mục lục
1. Sơ đồ khối thuật toán nén ảnh JPEG.
Trang 22. Phân khối
Biến đổi Cosin đối với các khối có kích thước nhỏ sẽ làm tăng độ chính xác khi tính toán với số dấu phẩy tĩnh, giảm thiểu sai số do làm tròn sinh ra Do điểm ảnh hàng xóm có độ tương quan cao hơn, do đó phép biến đổi Cosin cho từng khối nhỏ
sẽ tập trung năng lượng hơn và một số ít các hệ số biến đổi Việc loại bớt một số
hệ số năng lượng thấp trong các khối chỉ tạo ra mất mát thông tin cục bộ giúp nâng cao chất lượng ảnh
Chuyển ảnh thành các khối (block) có cùng kích thước và mỗi block là một ma trận điểm ảnh 8×8 pixel được lấy từ một ảnh màn hình theo chiều từ trái sang phải,
từ trên xuống dưới
Lí do kích thước mỗi block là 8×8:
• Qua việc nghiên cứu cho thấy hàm tương quan suy giảm rất nhanh khi khoảng cách giữa các pixel vượt quá 8
• Độ phức tạp về tính toán sẽ tăng nếu kích thước block tăng Tiện lợi cho việc tính toán và thiết kế phần cứng
Trang 3Giả sử ảnh gốc:
3. Biến đổi DCT
Vì ảnh gốc có kích thước rất lớn cho nên trước khi đưa vào biến đổi DCT, ảnh được phân chia thành các khối vuông, mỗi khối này thường có kích thước 8 x 8 pixel và biểu diễn các mức xám của 64 điểm ảnh, các mức xám này là các số
nguyên dương có giá trị từ 0 đến 255 Việc phân khối này sẽ làm giảm được một phần thời gian tính toán các hệ số chung, mặt khác biến đổi cosin đối với các khối nhỏ sẽ làm tăng độ chính xác khi tính toán với dấu phẩy tĩnh, giảm thiểu sai số do làm tròn sinh ra
Giá trị x(n1, n2) biểu diễn các mức xám của ảnh trong miền không gian, X(k1, k2) là các hệ số sau biến đổi DCT trong miền tần số
3.1 Biến đổi DCT một chiều
Biến đổi DCT một chiều được định nghĩa như sau:
Với
Khi dãy đầu vào x(n) là thực thì dãy các hệ số X(k) cũng là số thực Biến đổi
DCT một chiều giúp ta hiểu rõ hơn về biến đổi DCT 2 chiều dưới đây
Trang 43.2 Biến đổi DCT hai chiều
Biến đổi DCT được thực hiện trên một khối gồm 8 pixel và 8 dòng của ảnh thật đã lấy mẫu để cho ra một ma trận 8 x 8 với các điểm là các hệ
sốDCT.Các hệ số DCT nói lên sự biến đổi tần số giữa các mẫu theo chiều ngang và chiều dọc Phép toàn DCT được mô tả như sau:
Trong đó:
x,y : là tọa độ pixel của ảnh gốc
u,v : là độ độ hệ số DCT
N: là kích thước ma trận thực hiện phép biến đổi
• Thuật toán biến đổi DCT hai chiều cho mỗi khối trong trường hợp này sẽ bao gồm 16 phép biến đổi DCT một chiều
• Đầu tiên, người ta biến đổi nhanh Cosin một chiều cho các dãy điểm ảnh trên mỗi hàng Lần lượt thực hiện cho 8 hàng
• Sau đó biến đổi DCT một chiều theo từng cột của ma trận vừa thu được sau
8 phép biến đổi trên Cũng lần lượt thực hiện cho 8 cột
Ma trận cuối cùng sẽ là ma trận hệ số biến đổi của khối tương ứng
Thành phần chói Y sau khi số hóa sẽ có biên độ các mẫu nằm trong khoảng 0-255, các mẫu của thành phần màu CR, CB có biên độ cực đại là ±128 Để có thể sử dụng một bộ mã hóa DCT cho cả tín hiệu chói và màu, tín hiệu Y được dịch mức xuống dưới bằng cách trừ 128 từ mỗi giá trị pixel trong block 8x8
Từ ma trận ảnh gốc ở trên ta dịch mức xám -128, ta được ma trận:
Trang 5Biến đổi DCT ta được ma trận:
4 Lượng tử hóa
Bước tiếp theo của quá trình nén ảnh là lượng tử hóa các hệ số DCT F(u,v) với mục đích làm giảm số lượng bit cần thiết dùng để mô tả những hệ số đó
Đầu vào của khối nén ảnh gồm 2 thành phần: một chiều và xoay chiều
Các hệ số tương ứng với tần số thấp thường có giá trị lớn, những hệ số này
chứa phần lớn năng lượng của tín hiệu, do đó chúng phải được lượng tử hóa với độ chính xác cao Riêng hệ số DC cần mã hóa với độ chính xác cao nhất, vì hệ số này
là giá trị độ chói trung bình của từng block ảnh Sự thay đổi độ chói trung bình của các block sẽ ảnh hưởng rất nhiều tới chất lượng của ảnh nén
Trang 6Để thực hiện quá trình nén dữ liệu, ma trận các hệ số khai triển sau DCT phải được chia cho bảng trọng số Q(u,v) để loại bỏ một phần các hệ số DCT có biên độ nhỏ (thường là các thành phần cao tần)
JPEG sử dụng phương pháp lượng tử không đồng đều, các hệ số có tần số thấp được chia cho các giá trị nhỏ, các hệ số ứng với tần số cao được chia cho cácgiá trị lớn hơn, kết quả sẽ được làm tròn (bỏ đi các phần thập phân):
Fq(u,v) = round Với ma trận lượng tử hóa:
Fq(0,0) = round = -26
Fq(0,1) = round = -3
Fq(0,2) = round = -6
.
.
Fq(8,8) = round = 0
Ta được ma trận lượng ảnh sau khi lượng tử hóa:
Trang 75 Mã hóa
5.1 Các phương pháp mã hóa
Phương pháp mã hóa loạt dài (Run Level Coding)
Phương pháp mã hóa loạt dài lúc đầu được phát triển dành cho ảnh số 2 mức: mức đen (1), và mức trắng (0) như các văn bản trên nền trắng, trang in, các bản vẽ kỹ thuật
Nguyên tắc của phương pháp là phát hiện một loạt các bít lặp lại, thí dụ như một loạt các bít 0 nằm giữa hai bít 1, hay ngược lại, một loạt bít 1 nằm giữa hai bít 0 Phương pháp này chỉ có hiệu quả khi chiều dài dãy lặp lớn hơn một ngưỡng nào đó Dãy các bít lặp gọi là loạt hay mạch (run) Tiếp theo, thay thế chuỗi đó bởi một chuỗi mới gồm 2 thông tin: chiều dài chuỗi và bít lặp (ký tự lặp) Như vậy, chuỗi thay thế sẽ có chiều dài ngắn hơn chuỗi cần thay
Phương pháp mã hóa Huffman
Phương pháp mã hóa Huffman là phương pháp dựa vào mô hình thông kê Dựa vào dữ liệu gốc, người ta tính tần suất xuất hiện của các ký tự Việc tính tần suất được thực hiện bởi cách duyệt tuần tự tệp gốc từ đầu đến cuối Việc xử lý ở đây tính theo bit Trong phương pháp này người ta gán cho các ký tự có tần suất cao một từ mã ngắn, các ký tự có tần suất thấp từ mã dài
Nói một cách khác, các ký tự có tần suất càng cao được gán mã càng ngắn và ngược lại Rõ ràng với cách thức này, ta đã làm giảm chiều dài trung bình của từ
mã hóa bằng cách dùng chiều dàibiến đổi Tuy nhiên, trong một số tình huống khi tần suất là rất thấp, ta có thể không được lợi một chút nào, thậm chí còn bị thiệt một ít bit
Trang 8Thuật toán
Thuật toán bao gồm 2 bước chính:
- Giai đoạn thứ nhất: tính tần suất của các ký tự trong dữ liệu gốc: duyệt tệp gốc một cách tuần tự từ đầu đến cuối để xây dựng bảng mã Tiếp sau đó là sắp xếp lại bảng mã theo thứ tự tần suất giảm dần
- Giai đoạn thứ hai: 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 Phần tử này có tần suất bằng tổng 2 tần suất thành phần Tiến hành cập nhật lại bảng và đương nhiên loại
bỏ 2 phần tử đã xét Quá trình được lặp lại cho đến khi bảng chỉ có một phần tử Quá trình này gọi là quá trình tạo cây mã Huffman vì việc tập hợp được tiến hành nhờ một cây nhị phân 2 nhánh Phần tử có tần suất thấp ở bên phải, phần tử kia ở bên trái Với cách tạo cây này, tất cả các bit dữ liệu/ký tự là nút lá; các nút trong là các nút tổng hợp
Mã hóa: mỗi lần xuống bên phải ta thêm 1 bit “1” vào từ mã; mỗi lần xuống bên trái ta thêm một bit “0”
Ví dụ:
Trang 9Bảng tần suất Bảng tần suất theo thứ tự giảm dần
Lưu ý rằng, trong phương pháp Huffman, mã của ký tự là duy nhất và không mã nào là phần bắt đầu của mã khác Vì vậy, khi đọc tệp nén từng bit từ đầu đến cuối
ta có thể duyệt cây mã cho đến một lá, tức là ký tự đã được giải nén
Trang 10Bảng từ mã gán cho các kí tự bởi mã Huffman
5.2 Mã hóa các hệ số DCT Fq(u,v)
• Để mã hóa entropy các hệ số Fq(u,v), ta cần biến đổi hệ số Fq(u,v) thành các chuỗi số một chiều
• Hệ số Fq(0,0) (thành phần 1 chiều) là thành phần trung bình của mỗi block được đưa vào bộ mã hóa vi sai (DPCM- Differential pulse code modulation)
• Các hệ số khác (thành phần xoay chiều) trong từng block được đọc theo kiểu zig-zag và đưa tới bộ mã hóa loạt dài (RLC)
• Cuối cùng dữ liệu từ 2 bộ mã hóa DPCM và RLC được mã hóa một lần nữa bằng mã Entropy
• Dữ liệu nén, các bảng mã, bảng lượng tử được kết hợp lại thành một file theo chuẩn JPEG
Mã hóa thành phần một chiều.
- Các hệ số DC là giá trị trung bình của các khối ảnh 8x8 Độ chói trung bình của các block ảnh gần nhau thường ít biến đổi, do đó trong chuẩn nén JPEG, các hệ số DC được mã hóa theo phương
pháp DPCM
- Để tăng hiệu suất nén, kết quả nhận được sau đó được mã hóa tiếp bằng mã Huffman
- Trên lý thuyết, dải động của các giá trị nhận được sau khi mã hóa DPCM lớn gấp đôi dải động của các hệ số DCT, có nghĩa là thành phần này sẽ có giá trị nằm trong khoảng -211 đến 211-1 Số bit cần
để mã hóa thành phần 1 chiều có thế là 11
• Sơ đồ khối mã hóa thành phần 1 chiều DC
Trang 11Hệ số DC Từ mã DC
Hệ số DC của các khối DCT được lần lượt đưa tới bộ DPCM Thành phần sai số giữa hai hệ số DC liên tiếp sẽ được mã hóa trong bộ mã Huffman
Trang 12 Quá trình mã hóa Huffman được thực hiện cho thành phần DC như sau:
• Dò tìm trong bảng phân loại để phân loại giá trị ∆DC (phân loại chiều dài từ mã dùng để mã hóa thành phần ∆DC)
• Dùng bảng mã Huffman cho thành phần DC để tìm ra từ mã cho loại
∆DC tìm được ở bước 1
• Mã hóa nhị phân giá trị ∆DC
• Ghép các từ mã Huffman và giá trị nhị phân của ∆DC để có được từ
mã cho thành phần DC
Trên bảng 1 và 2 là các bảng tra cần thiết để thực hiện mã hóa thành phần
DC
-1 1 -3, -2 2, 3 -7,-6,-5,-4 4,5,6,7 -15,…,-8 8,…,15 -31,…,-16 16,…,31 -63,…,-32 32,…,63 -127,…,-64 64,…,127 -255,…-128 128,…,255 -511,…,-256 256,…,511 -1023,…,-512 512,…,1023 -2047,…,-1024 1024,…,2047
1 2 3 4 5 6 7 8 9 10 11
Bảng 1: phân loại hệ số DC và AC
-255,…-128 128,…,255 8 1111 110 -127,…,-64 64,…,127 7 1111 10 -63,…,-32 32,…,63 6 1111 0 -31,…,-16 16,…,31 5 1110 -15,…,-8 8,…,15 4 110 -7,-6,-5,-4 4,5,6,7 3 101
Trang 13-3, -2 2, 3 2 01
Bảng 2: bảng mã Huffman cho thành phần DC
Ví dụ:
Ta có ma trận hệ số DCT:
Thành phần DC trong khối ma trận là DCn=15
Giả sử DCn-1=12
Kết quả mã hóa DPCM là =DCn-DCn-1 = 3
Trên bảng phân loại hệ số =3 thuộc loại 2
Dựa vào bảng mã Huffman ta có từ mã tương ứng với loại 2 là 01 (2 chính là
độ dài từ mã)
Giá trị =3 mã hóa nhị phân là 11
Từ mã DC n là 0111
Mã hóa thành phần xoay chiều.
Quét zig-zag:
Kĩ thuật nén JPEG sử dụng phương pháp quét zig-zag Tác dụng của sắp xếp lại theo thứ tự ZigZag là tạo ra nhiều loại hệ số giống nhau, khi dùng mã RLC hiệu quả sẽ nén sẽ tăng lên
Trang 14Chúng ta biết rằng 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 nên việc sắp xếp lại các hệ số theo thứ tự ZigZag sẽ tạo điều kiện cho các hệ số xấp xỉ nhau (cùng mức lượng tử) nằm trên một dòng
Sơ đồ khối bộ mã hóa thành phần AC:
Trang 16Các hệ số AC Từ mã AC
Trang 17Chuỗi hệ số AC được lần lượt đưa vào bộ mã hóa RLC Ở đầu ra ta nhận được các
từ mã bao gồm hai thành phần:
• Giá trị chạy là số lượng bit "0" đứng trước hệ số khác "0" đang được mã hóa
• Biên độ của hệ số khác "0" nói trên Từ mã Huffman ứng với cặp giá trị trên được tìm ra trong bảng phân loại (bảng 1 ở trên) và bảng mã Huffman cho thành phần AC
Từ mã AC sẽ bao gồm từ mã Huffmanvà giá trị biên độ của hệ số AC
Ví dụ từ ma trận DCT ở trên, Sau quá trình quét zig-zag, ta nhận được chuỗi hệ số
AC sau:
0, -2, -1, -1, -1, 0 , 0,-1, 0, 0……
Chuỗi bit nhận được sau khi mã hóa RLC:
(1,-2) (0, -1) (0, -1) (0, -1) (2,-1) (EOB)
Từ mã cuối cùng để báo hiệu kết thúc khôi: EOB (end of block)
Sử dụng bảng phân loại ta tìm được loại của biên độ các hế số
(1,2)(-2), (0,1)(-1), (0,1)(-1), (0,1)(-1), (2,1)(-1), (0,0)
Ý nghĩa mỗi giá trị (a,b) c:
a là giá trị chạy
b là loại
c là biên độ
Bảng mã Huffman cho thành phần AC
Trang 184 1 6 111011
(1,2)(-2) được mã hóa là 11100101
Kết quả mã hóa cả thành phần AC và DC ta được chuỗi bit: