Thuật toán phân vùng cơ bản

Một phần của tài liệu Đồ án tốt nghiệp: Xử lý ảnh phát hiện khuôn mặt người (Trang 45)

CHƯƠNG 2: PHÁT HIỆN MẶT NGƯỜI DỰA TRÊN MÀU DA

2.2.3.1. Thuật toán phân vùng cơ bản

Như đã nói ở trên, ta sử dụng thuật toán gán nhãn cho các điểm trắng để phân vùng. Nhãn của mỗi điểm chính là chỉ số của vùng trắng mà nó thuộc vào. Ta có 1 ảnh nhị phân (đen và trắng). Trong ảnh có 1 tập các vùng trắng tách rời. Mỗi vùng trắng sẽ được đánh một con số nguyên, quá trình đánh số là liên tiếp (1,2,3...). Và mọi điểm trong vùng sẽ được gán nhãn bằng chỉ số nguyên của vùng đó.

Chi tiết thực hiện thuật toán như sau: * Đầu vào:

• Ảnh nhị phân. * Đầu ra:

• Danh sách các vùng trắng tìm được trong ảnh nhị phân vào. * Xử lý:

Về cấu trúc dữ liệu:

• Ta có một ảnh nhị phân vào, ta sẽ biểu diễn nó như một mảng 2 chiều nguyên, với giá trị 0 là điểm đen và khác 0 là điểm trắng. Ta đặt tên là Anh.

• Ta cần định nghĩa 1 cấu trúc lưu các tham số vùng trắng. Ta đặt tên là: VungTrang. Nó có các trường sau:

o Tọa độ của vùng trắng. Mỗi vùng trắng sẽ được bao bọc bằng 1 hình chữ nhật. Tọa độ của vùng trắng chính là tọa độ của hình chữ nhật bao nó. Tọa độ này bao gồm: tọa độ góc trái trên (x,y), chiều rộng, chiều cao của hình chữ nhật.

o Số điểm trắng trong vùng.

• Ta cần có 1 danh sách để chứa các vùng trắng tìm được. Ta đặt tên là DSVT. Bên cạnh danh sách có 1 biến đếm số lượng vùng trắng tìm được hiện tại. Biến đếm này cũng được sử dụng để đánh chỉ số cho vùng luôn. Các vùng sẽ được đánh chỉ số theo trình tự tìm được. Ta gọi biến này là: SLVT.

• Ta cũng cần có 1 hàng đợi để thực hiện duyệt, đặt tên là: HangDoi.

• Và cũng có 1 mảng 2 chiều chứa nhãn của các điểm trong ảnh. Ta gọi là Nhan.

Khởi tạo:

• Khởi tạo mảng Nhan để đảm bảo các điểm đều chưa được gán nhãn.

• DSVT rỗng.

• SLVT = 0.

• HangDoi rỗng. Thực hiện:

• Duyệt qua các điểm trong ảnh nhị phân vào từ trái sang phải và từ trên xuống dưới. Với mỗi điểm ta kiểm tra xem điểm đó có phải là điểm trắng và chưa được gán nhãn không?

o Nếu không thỏa mãn thì bỏ qua, xét điểm tiếp theo.

o Nếu thỏa mãn, có nghĩa là ta đã tìm ra 1 vùng trắng mới. Điểm đang xét chính là điểm đầu tiên của vùng trắng này. Ta thực hiện xác định vùng trắng đó như sau:

 Tạo một biến cấu trúc VungTrang để chứa vùng trắng này, gọi là vt.

 Tăng biến đếm số lượng SLVT lên 1.

 Cập nhật biến cấu trúc vt khi biết thêm 1 điểm trắng thuộc vùng.

 Gán nhãn cho điểm đó bằng SLVT (giá trị hiện tại của SLVT là chỉ số của vùng trắng vừa tìm được).

 Đưa điểm đang xét vào HangDoi.

 Thực hiện vòng lặp. Chừng nào mà HangDoi còn chưa rỗng:

• Lấy 1 điểm ra khỏi HangDoi.

• Duyệt qua 4 điểm xung quanh nó: trái, phải, trên, dưới. Tại mỗi điểm, xét xem nó có phải là điểm trắng và chưa được gán nhãn không?

o Nếu không thỏa mãn thì bỏ qua, xét điểm tiếp theo.

o Nếu thỏa mãn thì:

 Gán nhãn cho nó bằng SLVT.

 Cập nhật biến cấu trúc vt khi biết thêm 1 điểm trắng thuộc vùng.

 Đưa vào HangDoi.

 Thêm vùng trắng vừa tìm được vào DSVT.

• Trả về DSVT Lưu đồ thuật toán:

Hình 2.11: Thuật toán phân vùng cơ bản

Begin

End

Điểm đang xét là điểm trắng và chưa gán nhãn?

DSVT = Ø, SLVT  0, HangDoi = Ø Khởi tạo cho mảng nhãn

Đưa con trỏ về điểm đầu tiên trong ảnh

Chuyển sang điểm tiếp theo

Tạo một vùng trắng mới SLVT  SLVT + 1 Nhãn điểm đó = SLVT

Đưa điểm vào vùng trắng, vào hàng đợi HangDoi khác rỗng? Lấy điểm ra khỏi hàng đợi Hàng xóm có phải là điểm trắng và chưa gán nhãn? Gán nhãn SLVT cho điểm đó Đưa vào vùng trắng, vào hàng đợi

Thêm vùng trắng vào DSVT Hết ảnh? Lặp cho 4 hàng xóm (trái, phải, trên, dưới) Đ S S Đ Đ S Đ

Trong các bước thực hiện trên, ta cần làm rõ thêm một số bước, đó là: cập nhật biến cấu trúc vt khi biết thêm 1 điểm trắng thuộc vùng. Thao tác này gồm 2 hành động:

• Tăng số lượng điểm trắng trong vùng lên 1.

• Cập nhật lại tọa độ của vùng.

Để cập nhật lại tọa độ vùng trắng, ta phải xét xem điểm mới vào có vị trí như thế nào với hình chữ nhật bao vùng trắng hiện tại. Ta có 9 vị trí tương đối của điểm đang xét với hình chữ nhật bao vùng như sau:

Hình 2.12: Vị trí tương đối của 1 điểm trắng so với vùng trắng hiện tại

Nếu nó nằm trong hình chữ nhật thì không cần cập nhật. Nhưng nếu nằm ngoài (8 vị trí còn lại) thì tùy từng vị trí mà cập nhật lại tọa độ (x,y) hoặc chiều rộng, chiều cao.

Hàng đợi được tổ chức xoay vòng để tiết kiệm bộ nhớ.

Và còn 1 điểm nữa trong thuật toán là tại sao ta chỉ xét 4 điểm hàng xóm (trên, dưới, trái, phải) mà không xét cả 8 điểm. Bởi vì với việc xét 4 điểm ta vẫn duyệt qua được tất cả các điểm trắng trong vùng, bảo đảm không bỏ xót. Đồng thời nó còn giúp ta giảm bớt sự xét trùng lặp. Ví dụ như hình vẽ sau:

Hình 2.13: Duyệt qua các điểm hàng xóm

Nếu xét 8 điểm thì 2 điểm (1) và (2) sẽ xét trùng lặp các điểm (3), (4), (5), (6). Còn nếu xét 4 điểm thì nếu điểm (2) được duyệt trước thì khi duyệt tới điểm (1) thì điểm (1) chỉ duyệt lại duy nhất điểm (2). Nó sẽ tiết kiệm hơn về thực hiện và về cả số dòng lệnh.

Hình 2.14: Kết quả minh họa thuật toán phân vùng cơ bản

Thuật toán này có ưu điểm là đơn giản, nhưng có một số tình huống nó không đạt được như mong muốn, đó là không loại bỏ được sự liên kết yếu. Liên kết yếu tức là 2 vùng trắng dính nhau theo 1 giao diện nhỏ. Ví dụ:

Hình 2.15: Minh họa các liên kết yếu giữa các vùng trắng

Khi phát hiện màu da đưa về ảnh nhị phân, sự dính nhau giữa các khuôn mặt hay xảy ra. Đây là 1 ví dụ:

Hình 2.16: Ví dụ về liên kết yếu gặp phải trong phát hiện mặt

Trong hình trên ta để ý thấy, có 1 đường nhỏ nối từ tai của người này sang mặt của người kia làm 2 vùng khuôn mặt bị gộp làm 1.

Sự dính nhau này làm ta không phát hiện được. Sự dính nhau có thể là mạnh, cũng có thể là yếu. Ta cố gắng loại bỏ các liên kết yếu để phát hiện được nhiều nhất số khuôn mặt có thể. Do đó ta sẽ cải tiến thuật toán cơ bản này thành thuật toán phân vùng nâng cao với mục đích cắt đứt các liên kết yếu giữa các vùng.

Một phần của tài liệu Đồ án tốt nghiệp: Xử lý ảnh phát hiện khuôn mặt người (Trang 45)