Giáo trình Xử lý ảnh
Trang 1NHẬP MÔN XỬ LÝ ẢNH
CHƯƠNG 10: NÉN ẢNH
Biên soạn: TS Ngô Hữu Phúc
Trang 2Giới thiệu
• Để có ảnh chất lượng cao (độ nét cao, màu trung thực) thì dung lượng file ảnh cũng tăng (đáng kể)
– Ví dụ file ảnh kích thước (640 x 480), sử dụng 24 bit màu sẽ có kích thước: 640 x 480
x 3 = 921600 Byte = 900KB Kích thước lớn sẽ tốn không gian lưu trữ và thời gian truyền.
• Để giải quyết vấn đề này người dùng các phương pháp nén đối với file ảnh
Có hai dạng nén:
– Nén bảo toàn (không làm mất thông tin) và
– nén không bảo toàn
– Phương pháp thứ hai thường dùng trong truyền hình và một số cấu trúc ảnh.
• Trong bài này chúng ta chỉ nghiên cứu các phương pháp nén bảo toàn:
– Mã loạt – Run Length Coding (RLC),
– mã Huffman,
– mã LZW.
Trang 3Phương pháp nén RLC - Mã loạt
Giả sử chúng ta có dãy dữ liệu: aaaaaabbbbbbbbbbccccaaaaacaa
Nhận xét:
Có thể thay thế dãy trên bởi dãy: 6a10b4c5a1c2a trong đó 6 là số các ký tự
a xuất hiện liên tiếp, 10 là số ký tự b xuất hiện liên tiếp, 4 là số ký tự c xuất hiện liên tiếp
Như vậy nếu số các ký tự liên tiếp giống nhau nhiều thì phương pháp này sẽ cho phép nén với hiệu xuất cao
Đối với dữ liệu ảnh, những phần tử trong một chuỗi dữ liệu liên tiếp thường giống nhau Như vậy, thay vì phải lưu trữ lần lượt mọi điểm của chuỗi (dư thừa) ta xét từng dòng dữ liệu và gom những điểm kề cận giống nhau thành từng nhóm theo tư tưởng trên
Trang 4Phương pháp nén RLC - Mã loạt
Nén RLC là chuyển một dòng x1x2 …xn về dãy k các bộ (l1, d1), (l2,
d2), …, (lk, dk) với:
li: là chiều dài (số phần tử) của loạt thứ i
di: dữ liệu (k tự) của loạt thứ i
Trang 5đã xử lý vấn đề này như thế nào?
Trang 6Phương pháp nén RLC - Mã loạt
Lưu ý khi cài đặt (Implementation) thuật toán.
• Thường dùng m=8 bit để biểu diễn li.
• Dùng bit thấp trong li làm cờ (Flag) - xác định byte đó là dữ liệu di hay độ dài loạt li (bit cờ bằng 1→ độ dài loạt, ngược lại → dữ liệu).
Trang 7Phương pháp nén RLC - Mã loạt
Cách dùng bit cờ:
Người ta có thể dùng 1 bit đầu hoặc 2 bit đầu làm cờ
• Dùng 1 bít đầu:
– Còn lại 7 bít (0-127) thể hiện độ dài loạt → tối đa độ dài loạt có thể là 127
– Khi đó các dữ liệu ảnh di riêng lẻ phải có giá trị từ 0000 0000 (0) đến 0111 1111
(127) mới có thể lưu được trong 1 byte,
– các di có giá trị từ 1000 0000 (128) đến 1111 1111 (255) vẫn phải lưu trữ trong 2 byte dạng (li, di) và trường hợp này li =1.
• Dùng 2 bít đầu:
– Còn lại 6 bít (0- 63) thể hiện độ dài loạt → tối đa độ dài loạt có thể là 63
– Khi đó các dữ liệu ảnh di riêng lẻ phải có giá trị từ 0000 0000 (0) đến 1011 1111
(191) mới có thể lưu được trong 1 byte,
– các d i có giá trị từ 1100 0000 (192) đến 1111 1111 (255) vẫn phải lưu trữ trong 2 byte dạng (li, di) và trường hợp này li =1
Trang 8• Tiếp tục như vậy ta thấy rằng số bít dùng làm cờ càng
nhiều thì khả năng lưu trữ độ dài loạt nhỏ, tuy nhiên khi đó
dữ liệu riêng lé có thể lưu trữ độc lập tăng.
1 Thông thường người ta dùng 2 bit làm cờ.
2 Phương pháp RLC được sử dụng trong các ảnh PCX,
BMP.
Trang 9Phương pháp nén (mã) Huffman
• Xét ví dụ : Giả sử một văn bản chỉ chứa 2 ký
tự a và b, theo bảng mã ASCII, mỗi ký tự được
mã hóa bằng 1 byte do đó nếu văn bản này có
n ký tự → cần 8*n bít để lưu.
• Giải pháp: Nếu dùng 1 bít để mã hóa, ví dụ 1 -
a, 0 - b, khi đó văn bản chỉ cần n bít để lưu trữ (giảm được 7/8 dung lượng lưu trữ) Như vậy, tuỳ vào văn bản, nếu chúng ta thay đổi cách
mã có thể nén được dữ liệu.
Trang 10Phương pháp nén (mã) Huffman
• Tư tưởng của phương pháp Huffman là:
– Dùng độ dài thay đổi để mã hóa cho các ký tự,
– ký tự nào xuất hiện nhiều dùng mã ít bít (ngắn),
– ký tự nào xuất hiện ít dùng mã nhiều bít (dài)
– Thông thường độ dài trung bình giảm → nén được thông tin
• Phương pháp mã hóa Huffman:
– xây dựng một cây nhị phân (cây mã Huffman) có các nút lá là các ký tự có trong văn bản, và
– tập tin mã hóa sẽ chứa các “đường đi” đến các nút lá (ký tự) của cây nhị phân đó
• Việc giải mã được thực hiện như sau:
– Đọc tuần tự các bit có trong tập tin đã được mã hóa, mỗi bít sẽ cho ta biết hướng đi trên cây cho đến khi gặp được một nút lá thì sẽ phát sinh ký tự tương ứng,
– lặp lại quá trình trên cho đến khi hết tập tin
Trang 11Phương pháp nén (mã) Huffman
Thuật toán mã:
• Duyệt trên toàn bộ file dữ liệu cần nén để xác định các
ký tự cùng với số lần xuất hiện của ký tự đó trong file
và đưa vào danh sách L.
• Trong L chọn ra 2 “ký tự” lm1, lm2 có số lần xuất hiện nhỏ nhất để hình thành 2 nút của cây nhị phân
• Ghép 2 ký tự vừa chọn thành 1 ký tự mới với số lần
xuất hiện bằng tổng số lần xuất hiện của 2 ký tự lm1, lm2
và đưa vào L;
• đồng thời xóa 2 ký tự lm1, lm2 khỏi L
• Lặp lại cho đến khi L chỉ còn duy nhất 1 “ký tự” T.
Trang 12Phương pháp nén (mã) Huffman
Thuật toán mã (tiếp)
• Bắt đầu từ T tạo 2 nhánh tới 2 con của nó, tiếp tục thực hiện như vậy đối với các con của T và
• tiếp tục cho đến khi tất cả các nút lá của cây đều là các ký
tự đơn
• Khi đó ta sẽ được một cây nhị phân gọi là cây mã Huffman.
• Xác định đường đi đến nút lá theo qui tắc: khi rẽ trái điền giá trị 0, khi rẽ phải điền giá trị 1 (hoặc ngược lại).
• Đường dẫn đến nút là chính là mã cần dùng cho ký tự tại nút lá.
• Duyệt tuần tự các ký tự, ghi mã tương ứng của ký tự ra file đích
Trang 13Phương pháp nén (mã) Huffman
Ví dụ:
• Giả sử chuỗi cần mã hóa có nội dung như sau: ABRACADABRA
• Duyệt file, tính số lần xuất hiện các ký tự
A:5, B:2, C:1, D:1, R:2
• Xây dựng cây mã Huffman (như hình vẽ)
Trang 14Phương pháp nén (mã) Huffman
Ví dụ (tiếp):
• Xác định mã Huffman cho các ký tự:
A: 0 B: 100 C: 1010 D: 1011 R: 11 (Bảng mã kí tự)
• Nội dung xâu mã:
• 01001101010010110100110
• Chú ý: File mã hoá ngoài nội dung của file cần lưu trữ cả bảng mã (hay cây mã Huffman).
Trang 15Phương pháp nén (mã) Huffman
Thuật toán giải mã:
• Đọc và khởi tạo bảng mã cho các ký tự, khởi tạo cây mã
Huffman.
C :1 D:1
B :2 R: 2 A:5
• Đọc lần lượt từng bít trong tập tin đã được mã hóa và duyệt trên cây nhị phân cho đến khi gặp nút lá, lấy ký tự tương ứng ở nút lá đưa vào file kết quả.
• Ví dụ minh họa: Giải nén tập tin mã hóa
01001101010010110100110 với bảng mã trên.
Trang 16Phương pháp LZW
• Khái niệm nén từ điển được Jacob Lampel và Abraham Ziv đưa ra lần đầu tiên vào năm 1977 Sau đó phát triển thành một họ giải thuật nén từ điển LZ Năm 1984 Terry Welch đã cải tiến thuật giải
LZ thành một họ giải thuật mới hiệu quả hơn và đặt tên là LZW.
• Phương pháp LZW dựa trên việc xây dựng từ điển cho các “chuỗi
ký tự” đã từng xuất hiện trong văn bản, những “chuỗi ký tự” xuất hiện sau đó sẽ được thay thế bằng mã của nó trong bảng từ điển.
• Giải thuật LZW được sử dụng cho tất cả các loại file nhị phân Nó thường được dùng để nén các loại văn bản, ảnh đen trắng, ảnh
màu … và
• chuẩn nén cho các dạng ảnh GIF, TIFF… Mức độ hiệu quả của LZW không phụ thuộc vào số bít màu của ảnh.
Trang 17Phương pháp LZW
Phương pháp nén LZW
• Phương pháp LZW hoạt động theo nguyên tắc là tạo ra một từ điển động theo dữ liệu của file ảnh
• Từ điển là tập hợp những cặp Khoá và nghĩa của nó Trong đó khoá được
sắp xếp theo thứ tự nhất định, nghĩa là một chuỗi con trong dữ liệu ảnh.
• Từ điển được xây dựng đồng thời với quá trình đọc dữ liệu Sự có mặt của một chuỗi con trong từ điển khẳng định rằng chuỗi đó đã từng xuất hiện trong phần dữ liệu đã đọc
• Thuật toán liên tục tra cứu và cập nhật từ điển sau mỗi lần đọc một ký tự
ở dữ liệu đầu vào
• Do kích thước bộ nhớ không phải là vô hạn và để đảm bảo tốc độ tìm
kiếm, người ta thường dùng từ điển với kích thước 4096 (212) phần tử
Trang 18Phương pháp LZW
• Cấu trúc từ điển có dạng như sau:
Trang 19Phương pháp LZW
• 256 từ mã đầu tiên có khoá từ 0 255 chứa 256 ký tự của bảng mã ASCII)
• Từ mã thứ 256 chứa một mã đặc biệt là “m xóa” (CC - Clear Code) Mục đích việc dùng mã xóa nhằm khắc phục tình trạng số mẫu lặp trong ảnh lớn hơn 4096 Khi đó một ảnh được quan niệm là nhiều mảnh ảnh, và từ điển là một bộ từ điển gồm nhiều từ điển con Cứ hết một mảnh ảnh người ta lại gửi một mã xóa để báo hiệu kết thúc mảnh ảnh cũ, bắt đầu mảnh ảnh mới đồng thời khởi tạo lại từ điển cho mảnh ảnh mới
• Từ mã thứ 257 chứa mã kết thúc thông tin (EOI - End Of Information) Một file ảnh có thể chứa nhiều ảnh (ví dụ ảnh GIF), khi đó mỗi ảnh sẽ được mã hóa riêng và mã EOI dùng để xác định điểm kết thúc thông tin của 1 ảnh
• Các từ mã tiếp theo (từ 258 trở đi) chứa các mẫu lặp lại trong ảnh Các từ
mã này được sinh ra trong quá trình mã hoá
Trang 21Phương pháp LZW
Giải nén
• Quá trình giải nén được thực hiện tương tự quá trình nén,
• Một từ mã ứng với một chuỗi sẽ được ghi ra tệp khi chuỗi ghép bởi chuỗi trên với ký tự vừa đọc chưa có trong từ
điển, đồng thời cập nhật ngay vào từ điển từ mã ứng với chuỗi tạo bởi chuỗi cũ với ký tự vừa đọc, và ký tự vừa đọc được dùng làm ký tự đầu trong chuỗi ứng với từ mã sẽ
được ghi ra tiếp theo.
• Ví dụ, giải nén chuỗi đã mã hoá: 65 - 66 - 67 - 259 - 258 -
67 - 262 - 68.
• Khởi tạo từ điểm với 258 từ mã (từ khoá 0 đến 257) như phần mã hoá.
Trang 22Phương pháp LZW
• Quá trình giải mã được thực hiện như sau:
• Kết quả giải nén: “ABCBCABCABCD”
Trang 23Phương pháp LZW
Trường hợp “bất thường”
• Giải thuật LZW như trên có thể dẫn đến một tình huống là quá trình nén thì thực hiện được, còn quá trình giải nén thì “không” thực hiện được
• Tình huống đó sảy ra như sau: giả sử c là một kí tự, S là một chuỗi (có
độ dài lớn hơn 0); mã k của từ điển chứa giá trị là cS Nếu chuỗi vào tiếp theo là cScSc, khi đọc đến cSc chương trình sẽ tạo mã k' chứa cSc (vì cS đã có mã là k), theo thuật toán nén ký tự c được giữ lại và chương trình đọc tiếp xâu S, ký tự c để hình thành từ cSc, khi đó mã k’ sẽ được dùng thay cho cSc
• Trong chương trình giải nén, k' sẽ xuất hiện trước khi nó được định
nghĩa
• Rất may là từ mã vừa đọc trong trường hợp này bao giờ cũng có nội
dung trùng với tổ hợp của từ mã cũ với kí tự đầu tiên của nó Điều này giúp cho quá trình cài đặt chương trình khắc phục được trường hợp
ngoại lệ một cách dễ dàng
Trang 24Phương pháp LZW
• Ví dụ nén chuổi “ABABCDABCABCAE”.
• Quá trình nén: Khởi tạo 258 từ mã cho bảng mã ASCII + CC + EOI
Trang 25Phương pháp LZW
• Giải nén: