b. Biến đổi Wavelet rời rạc 2-D
3.2 CHƯƠNG TRÌNH MÔ PHỎNG SỬ DỤNG MATLAB
3.2.1 Giao diện chương trình mô phỏng
Matlab cung cấp thư viện guide để người sử dụng có thể tự tạo giao diện cho riêng mình. Trong guide, thanh công cụ hỗ trợ rất nhiều cho người sử dụng.
Các công cụ trong thanh công cụ của GUIs:
- Static Text: Ta có thể nhập các đoạn text vào đây. Các đoạn text này dùng để chú thích và không thể thay đổi.
- Edit Text: Ta có thể nhập các đoạn text vào đây. Tuy nhiên, khi chạy chương trình, các đoạn text này có thể thay đổi được. Ví dụ, ta có thể sử dụng edit text để nhập và thay đổi các tham số của chương trình.
- Push Button: Nút chạy chương trình. Khi ấn nút, chương trình mà ta đã lựa chọn sẽ chạy. Ví dụ, các nút xử lí (chạy đoạn chương trình mô phỏng), nút đóng (đóng cửa sổ chương trình hiện thời lại), nút quay lại (quay lại cửa sổ chương trình trước đó), nút thông tin (xem thêm một số thông tin về chương trình đang chạy) ...
- Axes: Các axes được sử dụng để hiển thị các ảnh hoặc đồ thị của chương trình.
- Radio Button và Check Box: Ta có thể tích vào nút này để lựa chọn hoặc không lựa chọn một trong chương trình để chạy mô phỏng.
- Pop-up Menu và Listbox: Ta có thể lựa chọn một trong các chương trình trong Pop-up Menu và Listbox, các chương trình này người sử dụng tự nhập vào và không thể thay đổi được.
- Toggle Button và Panel: Được sử dụng để gom các nút trong chương trình cho gọn, hoặc là để ngăn cách giữa các nhóm chương trình để giao diện đẹp hơn và đỡ rối.
Ngoài ra, thanh công cụ còn có Button Group, Slider nhưng trong đồ án này ta không sử dụng tới.
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
Ví dụ, giao diện chương trình mô phỏng nâng cao chất lượng và nén ảnh dưới đây đã sử dụng hai công cụ Static Text và Push Button. Người sử dụng còn có thể dễ dàng lựa chọn màu sắc, font chữ, kích thước và màu sắc chữ cho chương trình.
Hình 3.1 Giao diện chương trình nâng cao chất lượng và nén ảnh
Sau đây là các chương trình mô phỏng trong đồ án.
3.2.2 Nâng cao chất lượng ảnh
3.2.2.1 Biến đổi mức xám
Hình 3.2 minh họa giao diện chương trình mô phỏng các phương pháp biến đổi ảnh xám. Phần lí thuyết về các phương pháp biến đổi ảnh xám đã được trình bày kĩ trong chương 1.
Chương trình mô phỏng trong hình 3.2 đã sử dụng các công cụ: Edit Text, Static Text, Axes, Pop-up Menu, Push Button và Toggle Button trong thanh công cụ của GUIs.
Hình 3.2 Giao diện chương trình biến đổi ảnh xám
a. Biến đổi mức xám sử dụng hàm imadjust
Để sử dụng chương trình mô phỏng các phương pháp biến đổi ảnh xám, ta chỉ cần nhập ảnh vào bằng cách ấn nút “Mở file ảnh”, ta có thể lựa chọn bất kì file ảnh nào có sẵn trong file matlab đang chạy chương trình. Sau đó, ảnh vừa chọn sẽ được nhập vào axes, ta chọn “Biến đổi mức xám nhờ hàm imadjust” trong “Lựa chọn phương pháp biến đổi:” và nhập các giá trị tham số: dải mức xám đầu vào, đầu ra (nằm trong khoảng từ 0 đến 1) và gamma. Rồi cuối cùng ta ấn nút “Xử lí”. Với dải mức xám đầu vào từ 0 đến 0.5, đầu ra từ 0.2 đến 1 và tham số gamma = 0.3, ta có ảnh biến đổi mức xám sử dụng hàm imadjust như hình 3.2. Nếu muốn biết thêm thông tin về phương pháp biến đổi mức xám sử dụng hàm imadjust cũng như các phương pháp khác trong biến đổi ảnh xám, ta có thể lựa chọn xem trong phần “Thông tin”.
Cách sử dụng của các chương trình mô phỏng trong đồ án đều tương tự như vậy. Hàm imadjust được sử dụng trong mô phỏng này là công cụ xử lí ảnh IPT (Image Processing Toolbox) cơ bản cho các biến đổi mức xám của các ảnh xám. Nó có cú pháp:
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
g = imadjust(f, [low_in high_in], [low_out high_out], gamma)
Hàm này ánh xạ các giá trị mức xám trong ảnh f đến giá trị mới g, (các giá trị giữa low_in và high_in ánh xạ đến giá trị low_out và high_out).
Hình 3.3 Đồ thị của các giá trị trong hàm imadjust
Các giá trị dưới low_in và trên high_in đều bị cắt đi, các giá trị dưới low_in ánh xạ tới low_out và các giá trị trên high_in ánh xạ tới high_out. Ảnh vào và ảnh ra có thể là của lớp uint8, uint16 hoặc double. Tất cả ảnh vào dù là thuộc lớp nào thì khi xử lí bằng hàm imadjust đều được xác định giá trị từ 0 đến 1. Nếu f thuộc lớp uint8 thì các giá trị thực tế sử dụng là các giá trị đã cho cho nhân với 255; nếu f thuộc lớp uint16 thì các giá trị đã cho nhân với 65535. Nếu [low_in high_in] hoặc [low_out high_out] là ma trận rỗng ([ ]), ta có các giá trị mặc định [0 1]. Nếu high_out nhỏ hơn low_out thì mức xám đầu ra đảo ngược lại.
Tham số gamma xác định dạng đường cong để ánh xạ các giá trị mức xám của f để tạo g. Nói dễ hiểu hơn, gamma xác định độ tương phản của ảnh ra. Nếu gamma nhỏ hơn 1 thì ánh xạ có trọng số hướng về các giá trị ra cao hơn (ảnh ra có độ tương phản thấp hơn). Nếu gamma lớn hơn 1 thì ánh xạ có trọng số hướng về các giá trị ra thấp hơn (ảnh ra có độ tương phản cao hơn). Nếu hàm là g = imadjust(f, [low_in high_in], [low_out high_out]) thì gamma mặc định là 1.
b. Biến đổi âm bản
Ảnh âm bản có thể thu được nhờ hàm imadjust: g = imadjust(f, [0 1], [1 0]);
Hình 3.4 (a) Ảnh gốc – (b) Ảnh âm bản
c. Biến đổi log
Các biến đổi log được thực hiện bằng cách sử dụng công thức: g = c*log(1 + double(f)) (3.1) Hình 3.5 là kết quả mô phỏng biến đổi hàm log với c = 5:
Hình 3.5 (a) Ảnh gốc – (b) Ảnh biến đổi hàm log
d. Biến đổi hàm mũ
Các biến đổi hàm mũ được thực hiện bằng cách sử dụng công thức: g = c*(f.^gamma) (3.2) Mô phỏng Matlab với c = 5 và gamma = 2:
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
Hình 3.6 (a) Ảnh gốc – (b) Ảnh biến đổi hàm mũ
e. Biến đổi giãn độ tương phản
Ta có thể dùng hàm imadjust cho giãn độ tương phản:
g = 1./(1 + (m./(double(f) + eps)).^E) (3.3) trong đó E là độ dốc của hàm, eps là hằng số, m = mean2(f).
Kết quả biến đổi giãn độ tương phản là tăng độ tương phản giữa các vùng tối và vùng sáng. Hình 3.7 dưới đây minh họa mô phỏng Matlab cho giãn độ tương phản với độ dốc E = 4.
f. Kĩ thuật cắt theo mức
Hình 3.8 minh họa mô phỏng Matlab cho kĩ thuật cắt theo mức. Trong trường hợp có nền, tham số L = 0.8, a = 0.4, b = 0.6. Trong trường hợp không nền, tham số L1 = 0.8, L2 = 0.2.
Hình 3.8 (a) Ảnh gốc – (b) Ảnh cắt theo mức không nền – (c) Ảnh cắt theo mức có nền 3.2.2.2 Cân bằng mức xám
Để mô phỏng phương pháp cân bằng biểu đồ, ta sử dụng 2 hàm sau đây. Hàm thứ nhất dùng để cân bằng mức xám của ảnh vào f:
g = histeq(f, nlev);
trong đó nlev là số mức xám xác định cho ảnh ra (thường là 256). Nếu hàm là g = histeq(f) thì nlev mặc định bằng 64.
Hàm thứ 2 là hàm imhist() để vẽ biểu đồ của ảnh. Ngoài ra, ta có thể vẽ biểu đồ bằng hàm bar(), plot() hoặc stem() nhưng hàm imhist() là tối ưu nhất để ta có thể so sánh đồ thị ảnh gốc và ảnh cân bằng.
Hình 3.9 là kết quả của chương trình mô phỏng cân bằng biểu đồ ảnh xám với nlev = 256. Đối với phương pháp cân bằng biểu đồ, ta nên chọn ảnh vào thật sáng hoặc thật tối thì sự cân bằng sẽ rõ hơn.
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
Hình 3.9 (a) Ảnh gốc – (b) Biểu đồ ảnh gốc – (c) Ảnh cân bằng – (d) Biểu đồ của ảnh cân bằng
3.2.2.3 So sánh mức xám
Ảnh f1 và f2 càng giống nhau thì ảnh thu được càng tối. Do đó, sau khi so sánh ta có thể tiếp tục sử dụng phương pháp cân bằng mức xám với ảnh xám gđể dễ dàng quan sát hơn. Sau đây là kết quả thu được trong cả trường hợp không cân bằng và có cân bằng:
Hình 3.11 Ảnh xám thu được trước và sau khi cân bằng (từ trái qua phải) 3.2.2.4 Chèn nhiễu
Trong phần này, ta thực hiện mô phỏng việc thêm nhiễu vào một bức ảnh. Nhiễu mà ta sử dụng để mô phỏng là nhiễu salt and pepper. Đoạn mã sau sẽ thực hiện chức năng này:
g = imnoise(f, ‘loại nhiễu’, mật độ nhiễu);
Và đây là kết quả chèn nhiễu salf & pepper với mật độ nhiễu 0.2:
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
Ngoài nhiễu salf & pepper, ta có thể chèn thêm vào ảnh nhiễu Gaussian, localvar, poisson, speckle.
Các loại nhiễu
- 'gaussian': Nhiễu Gauss trắng.
- 'localvar': Nhiễu Gauss trắng trung bình 0 (Zero-mean Gaussian white noise with an intensity-dependent variance).
- 'poisson': Nhiễu Poisson.
- 'salt & pepper': Mở hoặc tắt các pixel. Salt là mở pixel (trắng), pepper là tắt pixel (đen).
- 'speckle': Nhiễu nhân.
3.2.2.5 Lọc ảnh
Ta có thể kết hợp các phương pháp chèn nhiễu và lọc nhiễu trong một giao diện như sau:
a. Lọc làm mịn ảnh
Ý tưởng của phương pháp lọc làm mịn là thay giá trị của một pixel bằng giá trị mức xám trung bình của các pixel trong mặt nạ. Phương pháp này sẽ giúp loại bỏ các chi tiết không liên quan trước khi thực hiện tách các đối tượng trong ảnh. Chi tiết ở đây là nhóm các pixel có kích thước rất nhỏ so với mặt nạ. Tuy nhiên phương pháp này tạo ra tác dụng không mong muốn là làm giảm độ nét của ảnh.
Lọc không gian tuyến tính
Lọc không gian tuyến tính sử dụng hàm lọc:
g = imfilter(f, bộ lọc, ‘đường biên’); trong đó ta xác định các loại đường biên:
- P: Các đường biên của ảnh vào được mở rộng nhờ chèn thêm vào một giá trị P. Mặc định là 0.
- ‘replicate’: Kích thước của ảnh được mở rộng nhờ tạo ra các giá trị trên đường biên bên ngoài của nó.
- ‘symmetric’: Kích thước của ảnh được mở rộng nhờ việc phản xạ ảnh qua biên. - ‘circular’: Kích thước của ảnh được mở rộng nhờ xử lí ảnh theo chu kì của hàm tuần hoàn.
Toolbox trong Matlab hỗ trợ nhiếu bộ lọc không gian tuyến tính 2-D nhờ sử dụng hàm fspecial, hàm này tạo ra mặt nạ w của bộ lọc nhờ sử dụng cấu trúc lệnh:
w = fspecial(‘type’, parameters)
Trong đó ‘type’ là loại bộ lọc, và parameters xác định thêm các bộ lọc đặc biệt. Các bộ lọc đặc biệt này được thống kê trong bảng 3.1.
Bảng 3.1 Các bộ lọc đặc biệt
Loại Cấu trúc và tham số
‘average’ fspecial(‘average’, [r c]). Một bộ lọc trung bình chữ nhật kích thước r x c, mặc định là 3x3. Có thể thay [r c] bằng một giá trị đơn, khi đó bộ lọc là vuông.
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
‘disk’ fspecial (‘disk’, r). Bộ lọc trung bình tròn (nằm trong hình vuông có kích thước 2r+1) với đường kính r. Đường kính mặc định là 5.
‘gaussian’ fspecial (‘gaussian’, [r c], sig). Bộ lọc thông thấp Gauss kích thước r x c và độ lệch chuẩn sig (sig mang giá trị dương). Kích thước và độ lệch chuẩn mặc định là 3x3 và 0.5. Có thể thay [r c] bằng một giá trị đơn, khi đó bộ lọc là vuông.
‘laplacian’ fspecial (‘laplacian’, alpha). Bộ lọc Laplace kích thước 3x3 có hình dạng xác định bởi alpha (nằm trong khoảng [0, 1]). Giá trị mặc định của alpha là 0.5.
‘log’ fspecial (‘log’, [r c], sig). Bộ lọc LoG (Laplacian of Gaussian) kích thước r x c và độ lệch chuẩn sig (sig mang giá trị dương). Giá trị mặc định của kích thước bộ lọc và độ lệch chuẩn là 5x5 và 0.5. Có thể thay [r c] bằng một giá trị đơn, khi đó bộ lọc là vuông.
‘motion’ fspecial (‘motion’, len, theta). Cho bộ lọc mà khi nhân với 1 ảnh thì tính toán xấp xỉ chuyển động tuyến tính (của một camera đối với ảnh) của len pixel. Góc chuyển động là theta, được tính bằng độ, ngược chiều kim đồng hồ so với trục ngang. Giá trị mặc định của len và theta là 9 và 0.
‘prewitt’ fspecial (‘prewitt’). Cho mặt nạ Prewitt wv tính toán gradient theo chiều dọc. Mặt nạ cho gradient theo chiều ngang thu được nhờ phép biến đổi: wh = wv’.
‘sobel’ fspecial (‘sobel’). Cho mặt nạ Sobel sv tính toán gradient theo chiều dọc. Mặt nạ cho gradient theo chiều ngang thu được nhờ phép biến đổi: sh = sv’.
‘unsharp’ fspecial (‘unsharp’, alpha). Cho bộ lọc unsharp kích thước 3x3. Tham số alpha điều chỉnh độ sắc nét, nằm trong khoảng (0 1], giá trị mặc định là 0.2.
Ngoài các bộ lọc đặc biệt ở trên ta cũng có thể tự nhập các mặt nạ lọc (ma trận) bất kì. Trong đó ta thấy ảnh lọc sử dụng ma trận H có độ lọc mịn khá cao:
H = [1/9 1/9 1/9; 1/9 1/9 1/9; 1/9 1/9 1/9]; Kết quả mô phỏng biểu diễn trong hình 3.14.
Hình 3.14 (a) Ảnh gốc – (b) Ảnh chèn nhiễu salt & pepper – (c) Ảnh lọc sử dụng ma trận H – (d) Ảnh lọc sử dụng bộ lọc trung bình
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
Thực ra, với các bộ lọc như trên, các ảnh lọc thu được có khi rất mịn nhưng lại không rõ nét. Để khắc phục tình trạng này, ta có thể sử dụng linh hoạt bộ lọc. Ví dụ, ta sử dụng đoạn mã sau đây:
f = imread (‘moon.tif’);
w4 = fspecial (‘laplacian’, 0) % hoặc w4 = [0 1 0; 1 -4 1; 0 1 0]]; w8 = [1 1 1; 1 -8 1; 1 1 1]; f = im2double (f); g4 = f – imfilter (f, w4, ‘replicate’); g8 = f – imfilter (f, w8, ‘replicate’); >> imshow (f); >> figure, imshow (g4); >> figure, imshow (g8);
Hình 3.15 (a) Ảnh gốc – (b) Ảnh thu được nhờ bộ lọc Laplace có giá trị -4 ở chính giữa – (c) Ảnh thu được nhờ bộ lọc Laplace có giá trị -8 ở chính giữa
Ảnh thu được ở hình cuối cùng mịn hơn rất nhiều so với ảnh gốc, hơn nữa, nó còn khá nét.
Lọc không gian phi tuyến
Một công cụ thông dụng để tạo ra các bộ lọc không gian phi tuyến trong IPT (hộp công cụ xử lí ảnh) là hàm ordfilt2, tạo ra các bộ lọc thứ tự cố định (cũng được gọi là các bộ lọc thứ tự). Những bộ lọc không gian phi tuyến này dựa vào thứ tự các pixel
chứa trong vùng lân cận và thay thế giá trị pixel trung tâm của vùng lân cận bởi giá trị xác định bằng kết quả xếp thứ tự. Cấu trúc của lệnh ordfilt2 như sau:
g = ordfilt2 (f, order, domain)
Hàm này tạo ra ảnh đầu ra g bằng cách thay thế mỗi phần tử trong f bằng phần tử thứ order trong tập hợp các vùng lân cận được mô tả bởi các thành phần khác 0 trong
domain. Ở đây, domain là ma trận m x n chỉ gồm hai số 0 và 1, mô tả các vị trí pixel trong vùng lân cận sẽ được sử dụng trong việc tính toán. Có thể hiểu domain có chức năng như một mặt nạ. Các pixel trong vùng lân cận tương ứng với 0 trong ma trận
domain không được sử dụng trong việc tính toán.
Hình 3.16 (a) Ảnh gốc – (b) Ảnh chèn nhiễu salt & pepper – (c) Ảnh lọc không gian phi tuyến
Bộ lọc cho trạng thái tốt nhất trong xử lí ảnh là bộ lọc trung vị. Ta có thể sử dụng chức năng median trong hàm ordfilt2 để tạo bộ lọc trung vị:
g = ordfilt2 (f, median (1: m*n), ones (m, n));
Trong đó median (1: m*n) tính toán trung vị của chuỗi 1, 2, …, mn. Nhận thấy tầm quan trọng của nó, toolbox cung cấp hàm lọc trung vị 2-D:
g = medfilt2 (f, [m, n], padopt);
trong đó [m n] xác định vùng lân cận kích thước m x n mà trong đó phép tính trung vị được thực hiện, và padopt xác định một trong ba lựa chọn có thể: ‘zeros’ (mặc định), ‘symmetric’ trong đó f được mở rộng một cách đối xứng bằng cách phản xạ nó qua biên, và ‘indexed’ trong đó f được bù bởi 1 nếu nó có dạng double và 0 nếu ngược lại. Dạng mặc định của hàm:
Đồ án tốt nghiệp đại học Chương 3: Chương trình mô phỏng
sử dụng ma trận 3x3 để tính toán trung vị, và bù 0 vào biên của ảnh đầu vào.
Kỹ thuật này đòi hỏi giá trị các điểm ảnh trong cửa sổ phải xếp theo thứ tự tăng hay giảm dần so với giá trị trung vị. Kích thước cửa số thường được chọn sao cho số điểm ảnh trong cửa số là lẻ. Các cửa sổ hay dùng là cửa sổ có kích thước 3x3, hay 5x5