5.9. Các phép tính số học

Nhóm vẽ trong phần trước vẽ vào một ảnh. Nhóm số học kết hợp hai ảnh thành một ảnh thứ ba -- cộng các giá trị điểm ảnh lại với nhau, trừ ảnh này cho ảnh kia, lấy giá trị tối thiểu hoặc tối đa tại mỗi vị trí. Tập hợp nhỏ các phép tính số học theo từng điểm ảnh đó là nền tảng xây dựng nên vi sai khung hình, trừ nền, ghép ảnh phơi sáng và một số mẫu cổ điển khác.

Nhóm số học trên lớp Image đủ nhỏ để liệt kê ngay một lần:

  • add() -- self + other theo từng điểm ảnh, được cắt về giá trị tối đa của định dạng.

  • sub() -- self - other theo từng điểm ảnh, được cắt về 0 ở phía dưới.

  • rsub() -- other - self theo từng điểm ảnh, được cắt về 0 (phép tính tương tự như sub với các toán hạng đảo ngược).

  • min() -- giá trị tối thiểu theo từng điểm ảnh của hai giá trị.

  • max() -- giá trị tối đa theo từng điểm ảnh.

  • difference() -- |self - other| theo từng điểm ảnh, hiệu tuyệt đối.

Cộng thêm hai phép tính trên một ảnh đơn:

  • invert() -- thay thế mỗi điểm ảnh bằng 255 - pixel (hoặc giá trị tối đa tương đương với định dạng đó).

  • negate() -- một tên gọi khác của invert().

Two horizontal gradient bars at the top representing source images A and B -- A going dark to bright left-to-right, B going bright to dark left-to-right. Below them, five gradient bars representing the result of each pairwise operation applied to A and B: A.add(B) appears uniform white because every position sums past 255 and clips; A.sub(B) is zero on the left half and brightens toward the right; A.difference(B) shows a V shape, bright on each end and dark in the middle; A.min(B) is dark on the ends and brighter in the middle; A.max(B) is bright on the ends and grey in the middle.

Hai gradient nguồn A và B, và kết quả của mỗi phép tính kết hợp được áp dụng cho chúng. Mỗi phép tính chạy theo từng vị trí -- những gì hiển thị trong kết quả tại bất kỳ vị trí nào chỉ phụ thuộc vào hai điểm ảnh nguồn tại vị trí đó.

5.9.1. Hai dạng toán hạng

Mỗi phương thức hai ảnh chấp nhận một trong hai dạng cho toán hạng thứ hai của nó:

  • Một Image khác có cùng kích thước. Phép tính chạy theo từng vị trí -- kết quả tại (x, y) là phép tính được áp dụng cho các điểm ảnh nguồn tại (x, y) của cả hai ảnh.

  • Một giá trị vô hướng -- một số nguyên cho thang xám, một bộ giá trị (r, g, b) cho RGB565. Cùng một giá trị vô hướng được áp dụng tại mọi vị trí.

Dạng vô hướng hữu ích khi ứng dụng muốn dịch chuyển mọi điểm ảnh theo một lượng không đổi. img.add(40) làm sáng toàn bộ ảnh thêm 40; img.sub((20, 20, 20)) làm tối mỗi điểm ảnh đi 20 trên mỗi kênh; img.max(50) nâng bất kỳ điểm ảnh nào dưới 50 lên đến 50 và để yên phần còn lại -- kiểu phép tính biến nền cảm biến gần đen thành màu xám tối phẳng cho các giai đoạn tiếp theo xử lý.

5.9.2. Cắt giá trị

Các giá trị điểm ảnh được giữ trong phạm vi của định dạng qua mọi phép tính. Đối với kênh 8-bit điều đó có nghĩa là 0 -- 255: bất cứ thứ gì sẽ tràn qua 255 đều được cắt về 255, và bất cứ thứ gì sẽ giảm xuống dưới 0 đều được cắt về 0. Không có hiện tượng cuộn tròn.

Lựa chọn này quan trọng trong thực tế. add làm sáng điểm ảnh không bao giờ tạo ra hiện tượng đột ngột tối đi ở đầu sáng nơi phép tính toán học sẽ bị tràn; sub làm tối điểm ảnh không bao giờ tạo ra hiện tượng đột ngột sáng lên ở đầu tối nơi nó sẽ bị tràn xuống. Kết quả vẫn có ý nghĩa trực quan với chi phí là mất một số thông tin ở các cực bão hòa.

Việc cắt giá trị cũng là lý do tại sao subrsub trả về kết quả khác nhau. img_a.sub(img_b) cho phần của a sáng hơn b và bằng không ở mọi nơi khác; img_a.rsub(img_b) cho phần của b sáng hơn a. Cả hai đều hữu ích cho phát hiện thay đổi một chiều -- nếu ứng dụng chỉ quan tâm đến các điểm ảnh sáng hơn, hoặc chỉ về các điểm ảnh tối hơn -- nhưng không cái nào nắm bắt tất cả sự thay đổi giữa hai khung hình.

5.9.3. Phép tính hiệu

Để phát hiện thay đổi hai chiều, phép tính cần dùng là difference(), tính |self - other| tại mỗi vị trí -- hiệu tuyệt đối, không có dấu. Mỗi điểm ảnh thay đổi theo bất kỳ hướng nào đều xuất hiện dưới dạng giá trị khác không trong kết quả, với độ lớn tỷ lệ thuận với mức độ thay đổi tại vị trí đó.

Thuộc tính đó -- khác không chính xác ở những nơi hai ảnh không đồng nhất -- là điều làm cho difference trở thành công cụ chủ chốt trong phát hiện thay đổi từng khung hình. Một khung hình tham chiếu được lưu khi khởi động và một ảnh chụp mới, được xử lý qua difference, tạo ra một ảnh mà các điểm ảnh khác không đánh dấu mọi vị trí nơi điều gì đó trong cảnh đã di chuyển hoặc thay đổi độ sáng.

5.9.4. Phạm vi với mặt nạ

Tất cả các phương thức số học đều chấp nhận đối số từ khóa mask được giới thiệu trên trang vùng và mặt nạ. Khi một mặt nạ được truyền vào, phép tính chỉ chạy tại các vị trí mà mặt nạ khác không; ở mọi nơi khác ảnh đích được giữ nguyên.

Cách kết hợp đó xuất hiện trong hai mẫu. Mẫu đầu tiên là giới hạn phép tính vào một vùng đã biết: ví dụ, cộng hai khung hình lại với nhau chỉ bên trong hộp giới hạn của một dấu hiệu đã phát hiện. Mẫu thứ hai là xây dựng một khung hình tổng hợp từng phần -- min trên một chuỗi các khung hình bên trong mặt nạ tiền cảnh, max trên cùng chuỗi bên trong mặt nạ bổ sung -- kiểu mẫu đó.

5.9.5. Tại chỗ và bảo toàn đầu vào

Các phương thức số học đều tuân theo quy ước hoạt động được thiết lập trước đó: mỗi phương thức sửa đổi ảnh nguồn tại chỗ và trả về cùng ảnh đó để có thể xâu chuỗi. Các điểm ảnh của nguồn bị mất sau lời gọi -- được thay thế bằng kết quả của phép tính so với bất cứ điều gì được truyền làm toán hạng thứ hai.

Khi ứng dụng cần bảo toàn cả hai đầu vào, mẫu an toàn là sao chép một trong số chúng trước:

diff = current.copy()       # leaves current intact
diff.difference(reference)  # diff now holds the absolute difference

Mẫu đó -- sao chép, rồi thực hiện phép tính -- là xương sống của bất kỳ đường xử lý vi sai khung hình nào, nơi khung hình tham chiếu phải tồn tại sau khi so sánh để có thể tái sử dụng trên khung hình chụp tiếp theo.

Với sáu phép tính kết hợp, hai phép tính trên một ảnh đơn, một công cụ hiệu tuyệt đối chủ chốt và từ khóa mask để giới hạn phạm vi, bộ công cụ số học điểm ảnh bao gồm các kết hợp độ sáng và kênh mà thị giác máy cổ điển cần. Các công cụ giống số học còn lại trên bề mặt hoạt động theo từng bit thay vì theo từng giá trị.