5.12. Ngưỡng hóa nhị phân¶
Nhiều pipeline xử lý ảnh quy về một câu hỏi về từng điểm ảnh: độ sáng này có nằm trong phạm vi có nghĩa là "tiền cảnh" không? Màu sắc này có đủ gần với màu đỏ để là điểm đánh dấu mà ứng dụng đang theo dõi không? Điểm ảnh này có thuộc tập ứng viên mà giai đoạn tiếp theo của pipeline nên xem xét không? Ngưỡng hóa là phép toán biến những câu hỏi đó thành câu trả lời nhị phân tại mỗi vị trí -- bật nếu điểm ảnh khớp, tắt nếu không -- và rút gọn toàn bộ ảnh thành một mặt nạ mà phần còn lại của pipeline có thể làm việc với.
5.12.1. Phương thức binary¶
Phương thức binary() thực hiện phân loại đó trên mọi điểm ảnh trong một lần gọi. Nó nhận một danh sách các phạm vi ngưỡng -- các điều kiện mà một điểm ảnh có thể khớp để được tính là "bật" -- và viết lại ảnh sao cho mỗi điểm ảnh khớp với ít nhất một trong các phạm vi được đặt thành giá trị tối đa của định dạng, và mỗi điểm ảnh không khớp được đặt thành không. Kết quả là mặt nạ nhị phân mà phần còn lại của pipeline có thể sử dụng trực tiếp.
Ở dạng đơn giản nhất, danh sách ngưỡng có một phạm vi và lời gọi trả về mặt nạ các điểm ảnh trong phạm vi đó:
img.binary([(120, 255)])
Dạng danh sách làm cho binary trở nên mạnh mẽ. Một pipeline muốn theo dõi hai điểm đánh dấu có màu sắc, hoặc một phạm vi độ sáng cộng với một đỉnh độ bão hòa riêng biệt, truyền cả hai phạm vi vào cùng danh sách và nhận được một mặt nạ đầu ra duy nhất bao phủ tất cả các kết quả khớp.
Ngưỡng hóa biến ảnh có giá trị liên tục thành mặt nạ nhị phân: mỗi điểm ảnh trong phạm vi ngưỡng trở thành giá trị tối đa của định dạng, mỗi điểm ảnh ngoài phạm vi trở thành không.¶
5.12.2. Tuple thang xám¶
Đối với ảnh thang xám, mỗi mục trong danh sách ngưỡng là một tuple hai phần tử (lo, hi) mô tả một phạm vi độ sáng bao gồm. Các điểm ảnh có giá trị giữa lo và hi (bao gồm) khớp; mọi thứ ngoài phạm vi đó thì không. Các mẫu thông thường khá đơn giản:
(0, 60)khớp với các điểm ảnh tối -- từ màu đen đến xám đậm.(180, 255)khớp với các điểm ảnh sáng -- từ xám nhạt đến trắng.(100, 160)khớp với các điểm ảnh xám trung bình -- một dải ở giữa phạm vi độ sáng.
Thứ tự của hai giá trị bên trong một tuple không quan trọng; phương thức hoán đổi chúng nội bộ nếu lo lớn hơn hi, vì vậy (60, 0) hoạt động giống như (0, 60).
5.12.3. Tuple LAB cho màu sắc¶
Đối với ảnh RGB565, mỗi mục là một tuple sáu phần tử (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) mô tả một phạm vi bao gồm trong không gian màu LAB thay vì trực tiếp trong đỏ, xanh lá và xanh lam. Các ngưỡng là L (độ sáng), A (trục màu sắc từ xanh lá đến đỏ) và B (trục màu sắc từ xanh lam đến vàng), mỗi trục được so sánh với giá trị của điểm ảnh trong kênh đó.
Lý do sử dụng LAB thay vì ngưỡng hóa trực tiếp RGB là tính chất mà không gian màu LAB được thiết kế xung quanh: LAB tách độ sáng khỏi màu sắc (chroma). Hai điểm ảnh hiển thị cùng màu sắc nhưng ở các độ sáng khác nhau sẽ có giá trị L khác nhau nhưng giá trị A và B gần như giống nhau. Sự tách biệt đó cho phép các phạm vi ngưỡng mô tả một màu sắc theo vị trí của nó trên các trục A và B và để phạm vi L rộng mở để chấp nhận màu đó ở mọi độ sáng từ bóng tối đến ánh sáng cao. Ngưỡng dựa trên RGB không thể làm điều đó -- bất kỳ thay đổi nào về ánh sáng đều dịch chuyển cả ba giá trị R, G, B cùng một lúc, và bộ theo dõi được xây dựng trên ngưỡng RGB sẽ bị hỏng ngay lần đầu tiên có đám mây che mặt trời.
Mẫu thực tế: chọn phạm vi A và B mô tả màu sắc mà ứng dụng đang theo dõi, và để phạm vi L rộng -- thường là (0, 100) để chấp nhận bất kỳ độ sáng nào -- trừ khi ứng dụng cụ thể muốn ngưỡng hóa cả độ sáng lẫn màu sắc.
Đối với các tuple có ít hơn sáu giá trị, các thành phần còn thiếu mặc định là phạm vi tối đa (không ràng buộc trên trục đó). Một tuple hai phần tử (l_lo, l_hi) trong danh sách ngưỡng RGB565 do đó chỉ ngưỡng hóa theo độ sáng và khớp với mọi màu sắc.
Ghi chú
Phạm vi L rộng hoàn toàn có một vấn đề ở đầu dưới. Khi độ sáng giảm về không, mọi màu sắc hội tụ về màu đen, với các giá trị A và B thu hẹp về không và bị chi phối bởi nhiễu -- vì vậy các điểm ảnh tối có thể trôi vào phạm vi A và B và bị theo dõi như màu mục tiêu. Nếu các vùng đen trong cảnh sáng lên như kết quả khớp, hãy tăng l_lo cho đến khi chúng biến mất.
5.12.4. Cờ tùy chọn¶
Ba đối số từ khóa kiểm soát đầu ra:
invert=Truelật kết quả. Mỗi điểm ảnh sẽ khớp trở thành không, và mỗi điểm ảnh sẽ là không trở thành giá trị tối đa. Hữu ích khi cách tự nhiên để mô tả tiền cảnh là bởi những gì nó không phải.zero=Truethay đổi chế độ hoạt động: các điểm ảnh khớp bị đặt về không và các điểm ảnh không khớp giữ nguyên giá trị gốc. Sử dụng khi mục tiêu là xóa các điểm ảnh khớp khỏi ảnh thay vì rút gọn ảnh thành mặt nạ nhị phân của chúng.to_bitmap=Truetrả về kết quả dưới dạng ảnhBINARYthay vì ghi đè định dạng hiện có của nguồn. Kết quả một bit trên điểm ảnh là thứ mà các đối số mặt nạ sau này chấp nhận trực tiếp, và việc chuyển đổi thường tiết kiệm áp lực bộ nhớ khi phải mang theo một mặt nạ định dạng đầy đủ.
Mặt nạ và ROI tuân theo cùng quy ước với phần còn lại của giao diện: một hình chữ nhật roi giới hạn phạm vi thao tác trong một vùng con, một ảnh mask giới hạn phạm vi trong một mẫu vị trí tùy ý.
5.12.5. Mặc định thực hiện tại chỗ¶
Giống như các phép toán số học, binary mặc định chạy tại chỗ: các điểm ảnh của ảnh nguồn bị ghi đè bởi đầu ra nhị phân, và các giá trị gốc sẽ mất sau lần gọi. Dạng to_bitmap=True là lựa chọn thay thế khi cần bảo toàn nguồn và đầu ra nên là ảnh BINARY được cấp phát mới. Dạng copy=True cũng được chấp nhận cho kết quả cùng định dạng trên bộ đệm mới.