5.19. Hiệu chỉnh tông màu

Hiệu chỉnh tông màu thay đổi cách phân bố độ sáng và màu sắc trong một ảnh đã chụp -- các phép xử lý mà ứng dụng áp dụng khi một khung hình quá tối, quá sáng, quá phẳng, hoặc lệch về phía màu sai.

Các phép hiệu chỉnh thuộc hai nhóm: điều chỉnh độ sáng và độ tương phản để phân phối lại độ sáng, và điều chỉnh màu sắc để thay đổi màu sắc mà mỗi điểm ảnh đọc được. Cả hai đều có các phiên bản tương đương trong ISP của cảm biến, vốn hiệu chỉnh từng khung hình khi nó đi vào; các phương thức ở đây áp dụng cho một Image đã được chụp, sau khi thực tế, cho các trường hợp mà khung hình cần hiệu chỉnh nhiều hơn những gì ISP cung cấp.

5.19.1. Cân bằng biểu đồ tần suất

Thao tác kéo giãn độ tương phản đơn giản nhất là cân bằng biểu đồ tần suất. Ý tưởng là ánh xạ lại các giá trị điểm ảnh sao cho biểu đồ tần suất của đầu ra phẳng nhất có thể -- mỗi giá trị xuất hiện xấp xỉ đều nhau. Hiệu ứng hình ảnh là một ảnh có độ tương phản thấp (ảnh có biểu đồ tần suất tập trung trong một dải hẹp) trở thành ảnh có độ tương phản cao, với các điểm ảnh trải dài trên toàn bộ phạm vi 0 -- 255.

histeq() thực hiện phép cân bằng:

img.histeq()

Cơ chế hoạt động rất trực tiếp. Hàm phân phối tích lũy (CDF) của biểu đồ tần suất nguồn được tính toán; mỗi giá trị điểm ảnh đầu vào được ánh xạ đến vị trí của nó trong CDF, được chia tỷ lệ với phạm vi đầu ra. Khi các điểm ảnh đã được phân bố đều, ánh xạ gần giống ánh xạ đơn vị; khi các điểm ảnh tập trung ở một mức độ sáng, ánh xạ sẽ trải chúng ra bằng cách kéo giãn độ sáng đó trên một phạm vi rộng hơn của các giá trị đầu ra.

Kết quả rất ấn tượng với các cảnh có độ tương phản thấp -- sự khác biệt giữa một bức ảnh chụp trong nhà mờ và bức ảnh tương tự sau khi áp dụng histeq thường là sự khác biệt giữa "không đọc được" và "hoàn toàn rõ ràng." Đánh đổi là thao tác này khuếch đại mọi thứ, kể cả nhiễu của cảm biến. Với một cảnh có chi tiết độ tương phản thấp thực sự cần khôi phục, histeq là câu trả lời đúng; với một cảnh sạch, phơi sáng tốt mà không cần đến nó, histeq sẽ tạo ra nhiễu rõ ràng.

5.19.2. CLAHE: cân bằng thích nghi

Cân bằng biểu đồ tần suất là phương pháp toàn cục: nó sử dụng một CDF được tính từ toàn bộ ảnh và áp dụng cho mọi nơi. Cách này hiệu quả với các ảnh có phạm vi độ sáng tương đối đồng đều, nhưng thất bại với các cảnh có vùng tối và vùng sáng cục bộ -- CDF bị kéo về phía có nhiều điểm ảnh hơn, và phía đối diện bị hiệu chỉnh quá mức.

Biến thể thích nghi là Cân bằng biểu đồ tần suất thích nghi có giới hạn độ tương phản, thường được gọi là CLAHE. Thay vì một CDF toàn cục, CLAHE tính toán một CDF riêng biệt cho từng ô nhỏ của ảnh, cân bằng từng ô với CDF riêng của nó, và pha trộn các ranh giới giữa các ô lại. Kết quả là các điều chỉnh độ sáng xảy ra cục bộ -- góc tối có phép cân bằng riêng của nó mà không bị góc sáng kéo sai hướng.

Cờ adaptive=True chuyển histeq() sang chế độ CLAHE:

img.histeq(adaptive=True, clip_limit=10)

Tham số clip_limit là phần của CLAHE mà "giới hạn độ tương phản" trong tên gọi đề cập đến. Cân bằng cục bộ có thể khuếch đại quá mức nhiễu trong các vùng phẳng nơi CDF có rất ít giá trị phân biệt; giới hạn clip giới hạn mức độ phân phối lại tích cực của bất kỳ bin nào, điều này ngăn chặn sự khuếch đại nhiễu trong khi vẫn cho phép kéo giãn độ tương phản khi cần. Giá trị khoảng 10 là điểm khởi đầu hợp lý; giá trị lớn hơn cho phép CLAHE làm việc mạnh hơn với cái giá là nhiễu rõ ràng hơn, giá trị nhỏ hơn làm cho nó nhẹ nhàng hơn.

CLAHE tốn kém hơn histeq toàn cục, nhưng tạo ra kết quả sạch hơn với các cảnh có độ sáng phân bố không đều -- là hầu hết các cảnh thực tế.

5.19.3. Gamma, độ tương phản và độ sáng

Cân bằng biểu đồ tần suất là cách dựa trên dữ liệu để ánh xạ lại độ sáng. Cách độc lập với dữ liệu là áp dụng một đường cong đã chọn, được tham số hóa bởi một số nút điều chỉnh dễ dàng. gamma() cung cấp ba nút:

img.gamma(gamma=1.0, contrast=1.0, brightness=0.0)

Mỗi tham số áp dụng một phép biến đổi cụ thể cho từng điểm ảnh:

gamma chạy giá trị của từng điểm ảnh qua hàm lũy thừa output = input ** (1 / gamma). Ý nghĩa chuẩn: giá trị lớn hơn 1.0 làm sáng ảnh và nâng tông trung gian (phép hiệu chỉnh "gamma màn hình" cổ điển); giá trị nhỏ hơn 1.0 làm tối ảnh. Tham số này phi tuyến -- nó giữ nguyên các điểm đen và trắng và chỉ định hình lại phân bố ở giữa, đó là hành vi đúng khi mục tiêu là khôi phục chi tiết trong vùng bóng tối hoặc vùng sáng mà không làm mất đi các giá trị cực đoan hiện có.

contrast chạy từng điểm ảnh qua một phép nhân thẳng quanh điểm xám trung gian. Giá trị lớn hơn 1.0 tăng độ tương phản (tối trở nên tối hơn, sáng trở nên sáng hơn, xám trung gian giữ nguyên); giá trị nhỏ hơn 1.0 giảm độ tương phản.

brightness cộng một hằng số vào mọi giá trị điểm ảnh. Giá trị dương làm sáng, giá trị âm làm tối. Dịch chuyển này đồng đều -- không có gì được bảo tồn -- điều này hiếm khi là thứ ứng dụng muốn một mình, nhưng kết hợp tốt với một lần điều chỉnh độ tương phản để căn chỉnh lại kết quả.

Ba tham số kết hợp với nhau: một lần gọi gamma() có thể áp dụng đường cong gamma, sau đó nhân độ tương phản, rồi dịch chuyển độ sáng, tất cả trong một lần xử lý. Thứ tự là gamma trước, rồi độ tương phản, rồi độ sáng, khớp với thứ tự mang lại kết quả trực quan nhất khi cả ba đều khác giá trị mặc định.

5.19.4. Cân bằng trắng tự động

Nhóm điều chỉnh màu sắc của hiệu chỉnh tông màu bắt đầu với cân bằng trắng tự động. Cơ chế tương tự mà ISP của cảm biến chạy như một phần của đường ống xử lý ảnh -- điều chỉnh độ khuếch đại tương đối trên các kênh đỏ, xanh lá và xanh dương sao cho một miếng màu xám trung bình đọc là xám thực sự -- cũng có sẵn như một thao tác xử lý sau khi chụp trên một Image hoàn chỉnh:

img.awb()

Mặc định sử dụng thuật toán gray-world: màu trung bình của toàn bộ ảnh được giả định là xám trung tính, và độ khuếch đại theo từng kênh được điều chỉnh để làm cho điều đó đúng. Dạng thay thế max=True sử dụng thuật toán white-patch: các điểm ảnh sáng nhất được giả định là trắng trung tính, và độ khuếch đại được điều chỉnh để làm cho chúng như vậy. Cả hai đều hoạt động trên RGB565 và Bayer thô; không cái nào hoạt động trên thang xám (nơi không có màu sắc để cân bằng) hoặc YUV (nơi biểu diễn màu sắc không phải là thứ các thuật toán này hoạt động trên).

Khi nào nên dùng dạng xử lý sau khi chụp thay vì cân bằng trắng tự động của ISP: khi lựa chọn của ISP không phù hợp với cảnh cụ thể, khi ứng dụng đang tải các khung hình tham chiếu từ đĩa được chụp trong các điều kiện khác nhau, hoặc khi việc đánh giá màu sắc quan trọng đến mức ứng dụng muốn chạy lại nó với lựa chọn thuật toán của riêng mình.

5.19.5. Ma trận hiệu chỉnh màu sắc

Khi việc hiệu chỉnh màu sắc mà ảnh cần không phải là phép chia tỷ lệ theo từng kênh mà cân bằng trắng cung cấp, mà là một trộn kênh tổng quát hơn, thao tác cần dùng là ma trận hiệu chỉnh màu sắc. Phương thức ccm() áp dụng ma trận 3x3 (hoặc 3x4 với độ lệch) nhân vector (r, g, b) của mỗi điểm ảnh để tạo ra vector (r, g, b) mới:

img.ccm([[1.1, -0.05, -0.05],
        [-0.05, 1.1, -0.05],
        [-0.05, -0.05, 1.1]])

Ma trận cho phép ứng dụng hiệu chỉnh hiện tượng xuyên nhiễu giữa các kênh màu -- nơi phản hồi của cảm biến đỏ bao gồm một phần ánh sáng xanh lá, chẳng hạn, ma trận có thể trừ đi một phần kênh xanh lá khỏi đầu ra đỏ để bù trừ. Kết hợp với độ lệch theo từng kênh, dạng 3x4 cho phép ứng dụng cũng thiết lập lại điểm không cho từng kênh.

Tài liệu ISP pipeline đề cập đến lý do của các ma trận hiệu chỉnh màu sắc. Dạng xử lý sau khi chụp trên Image chỉ là cùng một thao tác, được áp dụng sau thực tế.