5.8. Tô màu lan và ký hiệu phát hiện

Các hình dạng hình học cơ bản ở đầu phần này đặt dấu ở các vị trí mà ứng dụng đã biết. Ghép ảnh đặt một ảnh lên ảnh khác. Một nhóm nhỏ các phương thức vẽ cuối cùng làm điều khác: đặt các dấu có hình dạng phụ thuộc vào những gì đã có trong ảnh, hoặc những gì một thuật toán trước đó đã tìm thấy trong đó.

5.8.1. Tô màu lan

flood_fill() bắt đầu từ một điểm ảnh duy nhất -- hạt giống -- và lan rộng ra ngoài, tô màu mọi điểm ảnh đủ tương đồng với hạt giống và được kết nối với nó qua một chuỗi các điểm ảnh tương đồng khác. Kết quả là một vùng được lấp đầy có ranh giới được quyết định bởi chính ảnh, không phải bởi bất cứ thứ gì truyền vào lệnh gọi.

Dạng đơn giản nhất nhận tọa độ hạt giống và màu sắc để tô:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

Hai tham số ngưỡng kiểm soát mức độ tích cực của việc lan tô. seed_threshold (một phân số chuẩn hóa từ 0.0 đến 1.0) đặt mức chênh lệch tối đa của một điểm ảnh so với giá trị hạt giống ban đầu mà vẫn được đưa vào. floating_threshold đặt mức chênh lệch so với mỗi láng giềng đã được đưa vào. Hai ngưỡng hoạt động cùng nhau: floating_threshold rộng rãi cho phép lan tô đi theo một gradient qua ảnh, trong khi seed_threshold chặt chẽ giữ cho nó không đi quá xa giá trị hạt giống ngay cả dọc theo gradient đó.

Một vài cờ tinh chỉnh kết quả thêm:

  • invert=True tô màu mọi điểm ảnh không khớp -- phần bù của vùng khớp -- thay vì chính các điểm ảnh khớp.

  • clear_background=True đặt về 0 mọi điểm ảnh bên ngoài vùng tô. Hữu ích cho việc trích xuất chỉ vùng được tô làm mặt nạ.

  • Từ khóa mask có nghĩa thông thường: các điểm ảnh tắt trong mặt nạ sẽ được giữ nguyên bất kể việc tô có đến đó hay không.

Tô màu lan hữu ích nhất cho hai mẫu. Mẫu đầu tiên là trực quan hóa những gì một bộ phát hiện vùng tìm thấy, bằng cách tô vùng được phát hiện với một màu sắc riêng biệt để nó nổi bật so với phần còn lại của khung hình. Mẫu thứ hai là trích xuất vùng đó, bằng cách kết hợp clear_background=True với một hạt giống đã biết bên trong vùng và đọc ảnh kết quả như một mặt nạ cho các phép toán tiếp theo.

5.8.2. Vẽ kết quả phát hiện

Các thuật toán xử lý ảnh thường trả về các đối tượng kết quả mang cả vị trí và một số cấu trúc bổ sung: một điểm đặc trưng với hướng, một phát hiện khuôn mặt với tâm riêng biệt so với hộp giới hạn, một AprilTag với bốn điểm góc. Vẽ chúng đúng cách -- với một ký hiệu nắm bắt được cấu trúc, không chỉ là hộp giới hạn -- là một mẫu đủ lặp đi lặp lại khiến module cung cấp hai hàm trợ giúp cho nó.

draw_keypoints() nhận một bộ mô tả điểm đặc trưng trả về bởi một bộ trích xuất đặc trưng, hoặc một danh sách thuần túy các bộ ba (x, y, rotation), và vẽ một ký hiệu nhỏ tại mỗi điểm. Ký hiệu mang cả vị trí và hướng: một vòng tròn quanh điểm cộng với một đường từ tâm ra ngoài biểu thị góc xoay. Trực quan hóa một lần gọi đó là cách dễ nhất để kiểm tra tính hợp lý rằng một bộ trích xuất điểm đặc trưng đang trả về các hướng mà ứng dụng mong đợi.

draw_detection() nhận một bộ sáu giá trị (rx, ry, rw, rh, cx, cy) -- hình chữ nhật giới hạn cộng với tâm được báo cáo riêng -- và vẽ cả hai cùng lúc: một hình chữ nhật quanh hộp giới hạn, một dấu thập tại tâm, và tùy chọn một nhãn văn bản ở góc hình chữ nhật. Dạng này khớp với những gì một phát hiện mạng nơ-ron hoặc một bộ theo dõi mẫu thường báo cáo, nơi tâm là vị trí chính xác hơn so với tâm của hộp giới hạn.

Cả hai phương thức ký hiệu đều là các lớp tiện lợi trên các hình dạng hình học cơ bản ở đầu phần này. Ứng dụng luôn có thể tái tạo cùng trực quan hóa bằng cách gọi trực tiếp draw_rectangle(), draw_circle(), draw_cross(), và draw_string(); các phương thức ký hiệu chỉ giúp tiết kiệm phần ghi chép cho các mẫu xuất hiện lặp đi lặp lại.

Với các hình dạng hình học cơ bản cho hình học đã biết, ghép ảnh cho lớp phủ, tô màu lan cho các vùng được dẫn xuất từ ảnh, và các ký hiệu phát hiện cho các mẫu trực quan hóa chuẩn, bộ công cụ vẽ đã hoàn chỉnh. Bất cứ điều gì ứng dụng cần để làm cho đầu ra thuật toán hiển thị đều có một phương thức trên bề mặt để thực hiện điều đó.