Các định nghĩa:
9 Một vùng tô bao gồm đường biên và vùng bên trong. Đường biên là một đường khép kín, ví dụ như đa giác.
9 Tô màu là thao tác tìm các điểm sáng “nằm bên trong” một vùng tô.
9 Tô dựa theo dòng quét (scan line) là tô màu theo dòng điểm sáng trên màn hình.
Cách thực hiện:
Thuật toán tô màu dựa theo đường biên: [2]
Đường biên trong thuật toán này được mô tả bằng một giá trị duy nhất là màu của tất cả các điểm thuộc về đường biên.
Bắt đầu từ điểm nằm bên trong vùng tô, ta sẽ kiểm tra các điểm lân cận của nó đã được tô màu hay có phải là điểm biên hay không, nếu không phải là
điểm đã tô và không phải là điểm biên, ta sẽ tô màu nó. Quá trình này được lặp đi lặp lại cho đến khi nào không còn tô được điểm nào nữa thì dừng. Bằng cách này, toàn bộ các điểm thuộc vùng tô được kiểm tra và sẽ được tô hết.
Hình 2-10: quá trình thực hiện của thuật toán tô màu dựa theo đường biên
Tuy nhiên, do thuật toán này khi cài đặt có tính đệ quy, thường dẫn đến tràn bộ nhớ đối với vùng tô khá lớn. Cho nên, để cải tiến, ta sẽ tiến hành loang dần và lần lượt tô từng đoạn giao theo dòng quét ngang thay vì tô theo các điểm lân cận (chẳng hạn 4 điểm lân cận). Đó chính là thuật toán tô màu dựa theo dòng quét cải tiến được trình bày ngay sau đây.
Thuật toán tô màu theo dòng quét cải tiến:
9 Giới thiệu ý tưởng:
Lưu lại thông tin của điểm bắt đầu mỗi đoạn giao nhau của dòng quét ngang thay vì phải lưu hết tất cả các điểm lân cận chưa được tô xung quanh điểm hiện hành. Việc tô màu được thực hiện loang theo các dòng quét từ điểm bắt đầu hướng lên biên trên, sau khi tô xong, lại theo hướng xuống biên dưới. Ứng với mỗi dòng quét ngang, ta sẽ loang và tìm pixel trái nhất để lưu lại.
9 Chi tiết thuật toán:
B1: ta tìm điểm bên trái nhất trong vùng cần tô của dòng kề trên và dòng kề dưới điểm đang xét tính từ vị trí của điểm đang xét (miễn các dòng kề trên và dòng kề dưới này vẫn nằm trong vùng cần tô). Các điểm trái nhất đó, ta đưa vào một danh sách chờ theo thứ tự định sẵn (chẳng hạn điểm nằm trên trước rồi điểm nằm dưới sau) miễn các điểm đó không trùng với các điểm đã có trong danh sách chờ.
B2: Ta lại tiếp tục xét cho điểm kề bên phải của điểm đang xét. Nếu đã đến đường biên thì nhảy sang B3, còn ko thì quay lại B1.
B3: Ta lấy phần tử được đưa vào sau cùng của danh sách chờ rồi lại quay trở về B1 làm tương tự như trên. Nếu danh sách chờ hết phần tử thì đã tô xong vùng cần tô, thuật toán kết thúc.
9 Ví dụ minh hoạ:
Trong hình 2.10 sau, đoạn giao đầu tiên chứa điểm bắt đầu (tô màu trắng) sẽ được tô trước). Sau đó các vị trí 1, 2 ứng với các đoạn giao của các dòng quét kế tiếp sẽ được lưu lại.
Hình 2-11
Bước tiếp theo (hình 2.11), điểm ứng với vị trí 2 sẽ được lấy ra và tiến hành tô màu bằng cách loang từ điểm này ra theo chiều ngang, sau đó pixel ứng vị trí 3 của dòng quét kế tiếp sẽ được lưu lại.
Hình 2-12
Sau khi dòng quét ứng với điểm 3 đã được xử lý tương tự như trên xong, stack lưu các vị trí của các điểm “hạt giống” cho các dòng quét kế tiếp như trong hình 2.12.
Hình 2-13
Hình 2.13 minh hoạ khi thuật toán đã tô được toàn bộ một phần vùng phía trên bên phải của vùng tô. Khi pixel ứng với vị trí 5 được xử lý xong, ta có phần còn lại phía trên bên trái sẽ được tô. Sau đó pixel ứng với vị trí 4 sẽ được xử lý, các dòng quét phía dưới sẽ được tô tiếp theo.
Hình 2-14
Ý nghĩa:
Thuật toán tô màu dựa theo dòng quét cải tiến được dùng để tô màu 4 góc của ảnh bài thi khi mới vừa được đưa vào chấm. Vì ảnh của bài thi ban đầu có phần rìa xung quanh mày đen, mà nếu cứ để như vậy rồi nhận dạng các ký hiệu định sẵn ở bốn góc sẽ dẫn đến nhận dạng sai vị trí các ký hiệu đó.
Vì vậy, ta phải dùng thuật toán tô màu để tô trắng các vùng đen ở bốn góc giúp việc nhận dạng đựơc chính xác. Để giúp giảm bớt thời gian thực hiện của chương trình, trong tình huống cụ thể này, ta đã áp dụng thuật toán tô màu quét dòng cải tiến giúp việc tô màu được nhanh hơn, không tốn nhiều tài nguyên.