5.18. Biểu đồ tần suất và thống kê¶
Bên cạnh các thao tác thay đổi điểm ảnh của ảnh, lớp Image cung cấp một nhóm phương thức để đo lường chúng -- tóm tắt phân phối giá trị điểm ảnh, trả về độ sáng trung bình và trung vị, tìm ngưỡng tối ưu giữa điểm ảnh tối và sáng, báo cáo độ phân tán của các kênh màu sắc. Các phép đo này phục vụ ứng dụng theo hai cách: làm đầu vào cho mã quyết định ngưỡng nào cần dùng, độ khuếch đại nào cần đặt, profil tông màu của cảnh trông như thế nào; và làm tín hiệu chẩn đoán -- "cảnh có đủ sáng không?" -- mà ứng dụng có thể phản ứng mà không cần đưa ra quyết định về bất kỳ điểm ảnh cụ thể nào.
Điểm khởi đầu cho hầu hết mọi phép đo là biểu đồ tần suất.
5.18.1. Biểu đồ tần suất¶
Biểu đồ tần suất của một ảnh là số lượng điểm ảnh có mỗi giá trị độ sáng có thể. Đối với ảnh thang xám, đó là danh sách số đếm được lập chỉ mục theo các giá trị 0 đến 255. Đối với ảnh màu sắc, đó là ba danh sách như vậy -- một danh sách mỗi kênh.
get_histogram() tính toán một biểu đồ:
h = img.get_histogram()
Đối tượng được trả về là một kết quả histogram hiển thị danh sách bin theo từng kênh và một vài truy vấn cấp cao trên chúng. Số đếm bin được chuẩn hóa sao cho tổng bằng 1.0 -- biểu đồ tần suất mô tả profil phân phối thay vì số đếm điểm ảnh tuyệt đối, giúp các phép đo có thể so sánh được giữa các ảnh có kích thước khác nhau.
Đối với ảnh thang xám, biểu đồ tần suất có một kênh bin, có thể truy cập bằng h.bins() (hoặc tương đương h[0]). Đối với ảnh RGB565, biểu đồ tần suất được tính trong không gian màu LAB được giới thiệu ở trang phân ngưỡng nhị phân, với ba kênh bin có thể truy cập bằng h.l_bins(), h.a_bins(), h.b_bins() (hoặc h[0], h[1], h[2]). LAB là lựa chọn giống với các phương thức phân ngưỡng và theo dõi sử dụng; biểu đồ tần suất đồng thuận với các ngưỡng về không gian đo màu sắc.
5.18.2. Bin và số lượng bin¶
Biểu đồ tần suất mặc định có một bin cho mỗi giá trị điểm ảnh có thể -- 256 bin cho kênh 8-bit. Đôi khi đó là độ phân giải mịn hơn mức ứng dụng cần. Bộ phân loại chỉ quan tâm đến profil thô của phân phối có thể được phục vụ tốt hơn với số lượng bin nhỏ hơn -- 32 hoặc thậm chí 8 bin -- vừa chạy nhanh hơn vừa cho kết quả sạch hơn khi có nhiễu. Từ khóa bins (và l_bins, a_bins, b_bins theo từng kênh cho màu sắc) đặt số lượng:
h = img.get_histogram(bins=32)
Phạm vi ROI và ngưỡng hoạt động theo cách tương tự như trên mọi phương thức đo lường khác. Truyền roi để giới hạn biểu đồ tần suất trong một hình chữ nhật điểm ảnh; truyền danh sách thresholds để chỉ bao gồm các điểm ảnh khớp với các phạm vi đó. Dạng ngưỡng là điều làm cho "tính biểu đồ tần suất của các điểm ảnh khớp" trở thành một lần gọi -- một mẫu phổ biến khi ứng dụng muốn đặc trưng kết cấu của vùng đã phát hiện mà không cần tự duyệt các điểm ảnh.
Biểu đồ tần suất thang xám với ba phép đo tóm tắt được phủ lên: ngưỡng Otsu (ngưỡng phân tách tốt nhất giữa các cụm tối và sáng), giá trị trung bình và trung vị. Mỗi phép đo nói lên điều gì đó khác nhau về cùng một phân phối.¶
5.18.3. Thống kê¶
Biểu đồ tần suất là mô tả về mức phổ biến của mỗi giá trị; thống kê là các tóm tắt số học được dẫn xuất từ nó. Đối tượng statistics được trả về bởi get_statistics() mang tập hợp tiêu chuẩn:
mean-- giá trị trung bình số học của các giá trị điểm ảnh.median-- giá trị mà dưới đó một nửa số điểm ảnh nằm.mode-- giá trị đơn lẻ phổ biến nhất.stdev-- độ lệch chuẩn, thước đo độ phân tán xung quanh giá trị trung bình.minvàmax-- các giá trị điểm ảnh sáng nhất và tối nhất hiện có.lqvàuq-- các ngưỡng tứ phân vị dưới và trên.
Đối với ảnh RGB565, các dạng theo từng kênh (l_mean, a_median, b_mode, v.v.) cung cấp các phép đo tương tự theo từng kênh.
Hầu hết các con số đó xuất hiện trong các ngữ cảnh cụ thể. mean và stdev cùng nhau cho ước tính nhiễu: một cảnh nên đồng nhất sẽ có stdev nhỏ, trong khi cảm biến nhiễu cho cùng cảnh stdev lớn hơn. min và max cho độ tương phản của ảnh: chúng càng gần nhau, cảnh càng phẳng; càng xa nhau, thuật toán càng có nhiều dải động để làm việc. median là tâm bền vững khi phân phối có ngoại lệ (một vài điểm ảnh rất sáng không kéo trung vị như chúng kéo giá trị trung bình). mode là giá trị phổ biến nhất, hữu ích để tìm mức nền của ảnh mà nền bao phủ phần lớn các điểm ảnh.
get_statistics() chạy lượt biểu đồ tần suất bên trong rồi tóm tắt nó; truyền các đối số thresholds và roi giống như biểu đồ tần suất đã tính trước đó sẽ tạo ra thống kê cho cùng tập hợp điểm ảnh.
5.18.4. Phân vị và tra cứu CDF¶
Đối tượng histogram hiển thị phương thức get_percentile() chuyển đổi một phân số thành giá trị điểm ảnh -- giá trị mà dưới đó phân số điểm ảnh được yêu cầu nằm. h.get_percentile(0.5) là trung vị; h.get_percentile(0.05) và h.get_percentile(0.95) cùng nhau cho min/max bền vững bỏ qua 5% dưới và trên là ngoại lệ.
Đó là dạng ứng dụng sử dụng khi muốn đặc trưng phạm vi giá trị điểm ảnh mà không để một số điểm ảnh lạc lõng sáng hoặc tối làm lệch câu trả lời. Min/max bền vững từ phân vị thứ 5 và 95 cũng là đầu vào tự nhiên cho lượt kéo giãn độ tương phản -- phép ánh xạ lại từng điểm ảnh mà phần Hiệu chỉnh tông màu đề cập.
5.18.5. Phương pháp Otsu¶
Biểu đồ tần suất trả lời một câu hỏi khác đáng chú ý riêng: cho ảnh mà các điểm ảnh chia thành cụm "tối" và "sáng", ngưỡng giữa chúng là gì? Trang phân ngưỡng đã đặt tên cho cơ chế theo kết quả của nó -- một ngưỡng toàn cục duy nhất mà ứng dụng có thể truyền vào binary() -- nhưng hoãn lại phần cách thức. Cách thức là phương pháp Otsu, và nó nằm trên biểu đồ tần suất.
Trực quan: ảnh có tiền cảnh và hậu cảnh rõ ràng có hai cụm trong biểu đồ tần suất độ sáng, với một thung lũng giữa chúng. Vị trí thích hợp để phân ngưỡng là đáy thung lũng -- giá trị mà tại đó hai cụm được phân tách tốt nhất. Phương pháp Otsu tìm kiếm mọi ngưỡng có thể và chọn ngưỡng mà phương sai trong cụm nhỏ nhất (tương đương với phương sai giữa các cụm lớn nhất), và kết quả là phân tách nhị phân tối ưu cho phân phối của ảnh đó.
Đối tượng histogram hiển thị Otsu thông qua get_threshold:
h = img.get_histogram()
t = h.get_threshold()
Đối tượng threshold được trả về có thuộc tính value (cho thang xám) hoặc l_value / a_value / b_value (cho màu sắc) mang ngưỡng đã chọn. Đưa kết quả trực tiếp trở lại binary() cho ngưỡng toàn cục tự điều chỉnh mà ngưỡng của nó được chọn bởi chính ảnh:
img.binary([(t.value, 255)])
Mẫu đó không giải quyết vấn đề chiếu sáng không đều mà ngưỡng thích nghi dựa trên bộ lọc giải quyết; điều nó giải quyết là câu hỏi "tôi nên cắt ở giá trị nào?" khi phân ngưỡng toàn cục đã là cách tiếp cận đúng. Đối với cảnh mà sự phân biệt tiền cảnh/hậu cảnh được xác định rõ, giá trị Otsu chọn thường cách giá trị mà người dùng chọn bằng mắt chỉ vài đơn vị.
5.18.6. Tính toán trên ảnh chênh lệch¶
Một chi tiết hữu ích về get_histogram() và get_statistics(): cả hai đều chấp nhận từ khóa difference lấy một Image khác và tính biểu đồ tần suất (hoặc thống kê) của sự chênh lệch từng điểm ảnh giữa nguồn và ảnh đó, mà không cấp phát ảnh chênh lệch riêng biệt. Đó là cách tiết kiệm để hỏi "cảnh đã thay đổi bao nhiêu kể từ khung hình tham chiếu?" mà không phải trả chi phí cho lần gọi difference() tường minh để tạo ảnh mà mục đích duy nhất là được đo. Đối với tập lệnh phát hiện chuyển động chạy liên tục, khoản tiết kiệm cộng dồn.