5.20. Hồi quy và độ tương đồng¶
Hai phép đo khác trên lớp Image tóm tắt ảnh theo cách khác với phân phối giá trị điểm ảnh. Hồi quy tuyến tính của các điểm ảnh đã phân ngưỡng cho ứng dụng một đường thẳng để hành động theo -- đầu vào cổ điển cho robot đi theo đường. Phép đo độ tương đồng cho ứng dụng một con số duy nhất mô tả mức độ giống nhau của hai ảnh -- đầu vào tự nhiên cho kiểm tra hồi quy ảnh chuẩn hoặc bộ phát hiện thay đổi thô.
5.20.1. Hồi quy tuyến tính¶
Khi các điểm ảnh tiền cảnh của ảnh tình cờ tạo thành một đường thẳng qua khung hình -- băng dính trên đường ray mà robot đang đi theo, đường chân trời, mép đường hoặc hành lang -- ứng dụng thường không muốn từng điểm ảnh tiền cảnh riêng lẻ. Nó muốn đường thẳng khớp tốt nhất qua tất cả chúng, được tham số hóa để nó có thể xác định hướng của đường thẳng và nơi nó cắt ngang khung hình.
get_regression() thực hiện việc khớp đó. Nó lấy cùng dạng tuple ngưỡng mà binary() và find_blobs() sử dụng, xác định mọi điểm ảnh khớp với ngưỡng, và trả về một kết quả line duy nhất mô tả đường thẳng khớp tốt nhất qua các điểm ảnh đó:
line = img.get_regression([(0, 60)])
if line:
img.draw_line((line.x1(), line.y1(),
line.x2(), line.y2()),
color=(255, 0, 0))
Phép khớp là hồi quy tuyến tính Theil-Sen -- một phương pháp bền vững chịu đựng ngoại lệ tốt hơn phép khớp bình phương nhỏ nhất quen thuộc hơn. Một số ít điểm ảnh cách xa đường thẳng thực sự không làm lệch kết quả theo cách chúng làm với bình phương nhỏ nhất, phù hợp với thực tế tiền cảnh nhiễu của đầu ra ngưỡng thực.
Kết quả line mang các điểm đầu cuối được cắt theo hình chữ nhật ảnh (x1, y1, x2, y2), độ dài và cường độ đường thẳng (length, magnitude), và mô tả hình học của đường thẳng theo dạng cực (theta, rho) -- góc của đường thẳng từ ngang và khoảng cách vuông góc từ gốc tọa độ. Dạng cực là điều vòng lặp điều khiển thường muốn: theta cho robot biết đường thẳng nghiêng theo hướng nào, rho cho nó biết đường thẳng cắt ngang ảnh ở đâu, và vòng phản hồi trên cả hai giữ robot ở giữa đường.
Một số đối số từ khóa điều chỉnh độ bền vững và chi phí. x_stride và y_stride bỏ qua các điểm ảnh trong quá trình khớp -- bước nhảy lớn hơn làm cho hồi quy rẻ hơn với chi phí khớp ít điểm ảnh hơn. area_threshold và pixels_threshold loại bỏ các đường thẳng không có đủ điểm ảnh khớp phía sau. target_size thay đổi kích thước đầu vào về kích thước nhỏ hơn trước khi khớp -- hồi quy chạy nhanh hơn trên ảnh thay thế 80x60 mà không mất nhiều độ chính xác hướng đường thẳng.
Nếu không thể khớp đường thẳng chấp nhận được -- nếu ngưỡng không khớp với điểm ảnh nào, hoặc khớp với mẫu không giống đường thẳng -- phương thức trả về None. Mã đi theo đường thực tế bảo vệ mọi lần gọi get_regression() bằng kiểm tra None trước khi truy cập các thuộc tính của đường thẳng.
5.20.2. Độ tương đồng ảnh¶
Một loại phép đo khác: thay vì hỏi "ảnh chứa gì?", hỏi "hai ảnh này giống nhau như thế nào?". Thao tác để tiếp cận là get_similarity(), tính Chỉ số tương đồng cấu trúc (SSIM) giữa ảnh nguồn và ảnh tham chiếu.
s = img.get_similarity(reference)
print(s.mean, s.stdev)
SSIM là chỉ số độ tương đồng ảnh tiêu chuẩn được sử dụng trong xử lý ảnh vì nó hoạt động theo cách trực quan của con người về độ tương đồng -- một sự dịch chuyển nhỏ hoặc thay đổi độ sáng nhỏ làm giảm điểm số một chút, trong khi thay đổi cấu trúc lớn (vật thể bị mất, cảnh khác) làm giảm đáng kể. Điểm số từ -1 đến +1: +1 có nghĩa là hai ảnh giống hệt nhau, 0 có nghĩa là chúng không liên quan, và -1 có nghĩa là chúng đối nghịch về cấu trúc. Đối tượng similarity được trả về hiển thị SSIM trung bình trên toàn ảnh, cộng với độ lệch chuẩn, min và max của các điểm số theo từng ô.
Đối với loại so sánh mà con số nhỏ tốt hơn con số lớn -- kiểm tra hồi quy nên báo cáo không ở "không có gì thay đổi" và tăng khi các thay đổi tích lũy -- cờ dssim=True trả về độ phi tương đồng cấu trúc: SSIM trung bình trừ đi 1, vì vậy giá trị trả về là 0.0 cho các ảnh giống hệt nhau và tăng khi chúng khác nhau.
5.20.3. Các trường hợp sử dụng SSIM¶
Hai ứng dụng phổ biến:
Kiểm tra hồi quy ảnh chuẩn. Framework kiểm tra chụp khung hình tham chiếu trong điều kiện đã biết tốt và lưu trữ nó như ảnh chuẩn. Các lần chạy kiểm tra tiếp theo chụp trong cùng điều kiện và so sánh với ảnh chuẩn bằng SSIM. Điểm số trên một ngưỡng nào đó (0.95 hoặc 0.98 tùy theo dung sai) là đạt; dưới đó là trượt. Framework kiểm tra không cần biết gì đã thay đổi -- điểm số SSIM là tín hiệu.
Phát hiện thay đổi thô. Ứng dụng muốn phiên bản thô hơn của tính chênh lệch khung hình -- phiên bản bỏ qua thay đổi độ sáng nhỏ nhưng phản ứng với thay đổi cấu trúc lớn -- có thể dùng SSIM so với khung hình tham chiếu thay vì difference() từng điểm ảnh theo sau bởi ngưỡng. SSIM ít nhạy cảm hơn với sự trôi dạt ánh sáng so với tính chênh lệch từng điểm ảnh, khiến nó là lựa chọn tốt hơn khi mục tiêu là phát hiện "cảnh trông khác biệt đáng kể" thay vì "bất kỳ điểm ảnh nào đã thay đổi."
Cả hai ứng dụng đều sử dụng cùng một lần gọi -- img.get_similarity(reference) -- và kích hoạt trên ngưỡng của điểm số được trả về. Sự khác biệt chỉ là liệu ngưỡng cao (kiểm tra hồi quy, tìm kiếm khớp gần giống hệt) hay thấp (phát hiện thay đổi, tìm kiếm bất kỳ thay đổi cấu trúc lớn nào).
5.20.4. Dạng biến đổi rồi so sánh¶
Một chi tiết hữu ích: get_similarity() chấp nhận cùng các tham số x, y, x_scale, y_scale, roi, rgb_channel, alpha, color_palette, alpha_palette, hint, và transform như draw_image(). Ảnh tham chiếu được định vị, chia tỷ lệ và biến đổi theo các tham số đó trước khi so sánh SSIM chạy.
Điều đó có nghĩa là ứng dụng có thể hỏi "cảnh này giống với khung hình tham chiếu sau một dịch chuyển / xoay / chia tỷ lệ đã biết như thế nào" mà không cần chuẩn bị ảnh tham chiếu đã biến đổi trước. Đó là cách tiết kiệm để xây dựng bộ theo dõi tìm kiếm không gian tham số và báo cáo phép biến đổi nào của tham chiếu khớp tốt nhất với khung hình hiện tại.