Blob là các đối tượng phân biệt của một ảnh, các đối tượng này không liên kết vói nhau theo bất kì dạng liên kết. Mục đích của viêc trích xuất blob là để tách biệt những blob (đối tượng) trong ảnh trắng đen. Một blob là một tập hợp gồm những pixel liên kết với nhau. Hai pixel có liên kết với nhau được xác định bằng khái niệm độ liên kết (connectivity). Độ liên kết có 3 loại: 4-connectivity và 8-connectivity và m-connectivity. Tác giả chọn liên kết 8 để nâng cao tính chính xác của thuật toán.
Các bước thực hiện: Thuật toán gồm các bước sau
Bước 1: Tạo lớp đệm zero (zero padding)
Vì thuật toán xét tất cả 8 điểm lân cận của mỗi pixel, lớp đệm này giúp cho các điểm ở biên có đủ 8 lân cận, chương trình không bị lỗi. Gọi ảnh này là Padding, hàng, cột đầu tiên và hàng cột cuối cùng của Padding sẽ là những số 0, bao lấy ảnh BW. Nếu kích thước của ảnh BW là MxN thì kích thước của Padding là (M+2)x(N+2)
Hình 3.37 Ảnh đầu vào BW và ảnh Padding của thuật toán
Bước 2: Đánh nhãn các blob liên kết với nhau
Đây là bước quan trọng nhất của thuật toán. Thuật toán sẽ tìm và đánh nhãn các nhóm liên kết 8 với nhau, ta gọi các nhóm này là các blob. Nhãn sẽ được đánh số theo thứ tự từ 1, 2, 3, … Vì ảnh BW chứa các giá trị 0 và 1, khi đánh nhãn số 1 sẽ bị trùng nên có hai cách xử lý: hoặc là số thự tự của nhãn bắt đầu bằng số 2, hoặc là các giá trị 1 này của ảnh BW sẽ được thay bằng giá trị 255. Ở đây, ta chọn cách thứ hai
30
và giới hạn số blob nhỏ hơn 50. Thực tế thì khi nhận diện biển báo giao thông, nếu như tiền xử lý tốt thì tới bước này số blob (có thể liên quan đến biển báo) không vượt quá 10. Ngoài đánh nhãn để phân biệt, chương trình còn trả về tọa độ các đỉnh của hình chữ nhật bao quanh blob đó, ta sẽ phân tích ở bước 4.
Hình 3.38 Áp dụng mặt nạ 3x3 cho từng bức ảnh
Thứ tự xét các pixel thực hiện tuần tự từ trái sang phải, từ trên xuống dưới. Giả sử pixel A có giá trị 255, vị trí của nó sẽ được lưu vào STACK, STACK theo kiểu LIFO (Last In, First Out) một nhãn sẽ được đánh lên vị trí đó. A là nhân, chương trình sẽ xét tiếp 8 điểm lân cận của A. Thứ tự xét các điểm lân cận không quan trọng, nhưng nên chọn một thứ tự cố định để đồng bộ cho tất cả. Trong phạm vi bài viết này, tác giả chọn thứ tự 1, 2,..,8 như sau:
Hình 3.39 Thứ tự xét các pixel lân cận
Thuật toán xem các điểm lân cận này có phải 255 không, nếu đúng các điểm này cũng sẽ được đánh cùng nhãn với pixel lân cận. Lúc này, STACK sẽ xóa vị trí của A đi (lý do: đã xem xét rồi), và lần lượt lưu vào vị trí của các điểm lân cận vừa mới được đánh nhãn. Tiếp theo, vị trí cuối cùng trong STACK sẽ được chọn làm nhân
31
mới, cứ tiếp tục quy trình trên cho đến khi STACK không còn chứa vị trí pixel nào nữa. Khi đó việc đánh 1 nhãn kết thúc.
Hình 3.40 Đánh nhãn cho blob đầu tiên
Thuật toán sẽ tiếp tục với pixel có giá trị 255 kế tiếp theo thứ tự từ trái sang phải, từ trên xuống dưới tính từ A. Số thứ tự nhãn tăng lên 1 và lặp lại quy trình như trên.
Thuật toán hoàn tất bước 2 khi tất cả các pixel có giá trị 255 đã được đánh nhãn hoặc số nhãn đã đạt tối đa là 50.
32
Bước 3: Xóa lớp đệm zero
Xóa hàng đầu tiên, hàng cuối cùng, cột đầu tiên, cột cuối cùng trong ảnh Padding, trả về đúng kích thước MxN
Hình 3.42 Ma trận ra của thuật toán
Bước 4: Tính các thông số cơ bản để xác định blob
Ở bước này, chương trình dựa vào mỗi blob để lấy ra các thông tin về hàng đầu tiên, hàng cuối cùng, cột đầu tiên, cột cuối cùng. Sau đó tính toán các thông số của hình chữ nhật bao quanh lấy blob bao gồm:
Hoành độ điểm góc trên bên trái = thứ tự cột đầu tiên của blob
Tung độ điểm góc trên bên trái = thứ tự hàng đầu tiên của blob
Chiều ngang (tính theo trục x) = cột cuối cùng – cột đầu tiên + 1
Chiều dọc (tinh theo trục y) = hàng cuối cùng – hàng đầu tiên + 1
Từ đây, từng blob đã được xác định. Chương trình kết thúc.
33
Start
Tạo zero padding: BW to PAD
Số thứ tự dòng i = 0 Số thứ tự cột j = 0 Nhãn currentLabel = 1
PAD(i,j) = 255?
Đổi giá trị 1 những pixel trong BW thành 255
Lưu địa chỉ (i,j) vào STACK Đánh nhãn lên pixel đó PAD = currentLabel Y i < height? j < width? i = i + 1 j = 0 j = j + 1 N
Xóa địa chỉ (i,j) khỏi STACK Kiểm tra 8 lân cận của (i,j)
Lân cận (i,j) = 255? STACK còn chứa địa chỉ không? N
Lưu địa chỉ lân cận đó vào STACK
Y
Lấy 1 địa chỉ trong STACK ra để kiểm
tra tiếp theo kiểu LIFO Y
Xóa lớp zero Padding
Tính 4 thông số của blob và lưu
N
End
Y Y
Tăng nhãn currentLabel lên 1
34