Không gian màu Oklab

Không gian màu Oklab là một không gian màu đồng nhất dành cho màu sắc không phụ thuộc vào thiết bị. Không gian màu này được thiết kế để cải thiện tính đồng nhất về tri giác, dự đoán sắc độ (hue) và độ sáng, pha trộn màu sắc và khả năng tiện dụng trong khi vẫn đảm bảo tính ổn định về số học và dễ lập trình. Không gian màu này được Björn Ottosson công bố vào tháng 12 năm 2020. Oklab và phiên bản hình trụ của nó là Oklch đã được đưa vào bản thảo mô đun màu CSS cấp 4 và cấp 5 dành cho màu web không phụ thuộc thiết bị kể từ tháng 12 năm 2021. Không gian màu này bắt đầu được hỗ trợ trên các phiên bản gần đây của các trình duyệt web phổ biến và cho phép chỉ định rõ ràng những màu thuộc hệ màu P3 gam màu rộng.

Mô hình của Oklab được điều chỉnh bằng các dữ liệu miêu tả màu sắc cải tiến, bao gồm dữ liệu CAM16 đối với độ sáng và độ kết tủa màu (chroma), dữ liệu IPT cho sắc độ. Sự điều chỉnh mới này đã giải quyết được một số vấn đề, chẳng hạn như sự biến đổi sắc độ và độ sáng dị thường đối với các màu xanh lam trong không gian màu CIELAB, cũng như đơn giản hoá việc tạo ra các lược đồ màu, bảng màu và màu chuyển sắc mượt mà hơn.

Theo Ottosson, anh đã chọn tên "Oklab" vì mô hình màu này thực hiện công việc đủ tốt (OK) và hệ màu này dựa trên ba tọa độ không gian màu là "L", "a" và "b".

== Tọa độ ==
Không gian màu Oklab sử dụng cùng một cấu trúc không gian như không gian màu CIELAB, biểu diễn màu sắc bằng ba thành phần sau:

- "L" là độ sáng tri giác (perceptual lightness), nằm trong khoảng từ 0 (đen tuyền) đến 1 (trắng tham chiếu, nếu là vô sắc), thường được biểu thị dưới dạng phần trăm
- "a" và "b" là hai kênh đối lập nhau của bốn sắc độ độc đáo là đỏ, vàng, lục và lam. Dù các thành phần này không giới hạn khoảng giá trị, nhưng trên thực tế thì giá trị dao động từ −0,5 đến +0,5; trong CSS thì giá trị nằm trong khoảng ±100%, tương ứng với ±0,4 cho cả hai thành phần
- "a" từ màu lục (âm) đến màu đỏ (dương)
- "b" từ màu lam (âm) đến màu vàng (dương)

Giống như trong CIELCh, hệ màu Oklch biểu diễn màu sắc bằng cách sử dụng ba thành phần sau:

- "L" là độ sáng tri giác
- "C" là độ kết tủa màu, đại diện cho cường độ sắc màu, với giá trị nhỏ nhất là 0 (vô sắc) và không có giá trị lớn nhất, nhưng trong thực tế không vượt quá +0,5; CSS coi +0,4 là 100%
- "h" là góc của sắc độ trong một bánh xe màu sắc, thường được đánh dấu bằng đơn vị độ kèm theo phần thập phân.

=== Màu vô sắc ===
Màu xám trung tính, màu đen tuyền và màu trắng tham chiếu là vô sắc, tức là formula_1, formula_2, formula_3 và "h" không xác định .Việc gán bất kỳ giá trị thực nào vào thành phần sắc độ của các màu này đều không ảnh hưởng đến việc chuyển đổi giữa các không gian màu.

=== Chênh lệch màu sắc ===
Sự chệnh lệnh màu sắc tri giác trong Oklab được tính bằng khoảng cách Euclid giữa các thành phần tọa độ .

== Chuyển đổi giữa các không gian màu ==
=== Chuyển đổi qua lại với Oklch ===
Giống như trong hệ màu CIELCh, các tọa độ "a" và "b" thuộc hệ toạ độ Descartes được chuyển thành các toạ độ "C" và "h" thuộc hệ tọa độ cực theo công thức sau:

formula_4

Và các tọa độ cực được chuyển ngược lại sang hệ tọa độ Descartes như sau:

formula_5

=== Chuyển đổi từ CIE XYZ ===
Việc chuyển từ không gian màu CIE XYZ với Nguồn sáng Tiêu chuẩn D65 (Illuminant D65) sang Oklab bao gồm các bước sau:

1. Áp dụng ánh xạ tuyến tính M1 với giá trị cụ thể ở phần dưới đây: formula_6
2. Áp dụng căn bậc ba, là phép biến đổi phi tuyến tính: formula_7
3. Chuyển sang hệ Oklab bằng một ánh xạ tuyến tính M2: formula_8

Trong đó:

formula_9

=== Chuyển đổi từ hệ sRGB ===
Để chuyển đổi từ hệ màu sRGB sang Oklab, trước tiên cần phải chuyển đổi từ hệ màu sRGB sang hệ màu CIE XYZ với Nguồn sáng Tiêu chuẩn D65. Vì bước cuối cùng của quá trình chuyển đổi này là ánh xạ tuyến tính từ hệ RGB tuyến tính sang hệ CIE XYZ, cho nên bản cài đặt tham khảo sẽ gộp hai phép ánh xạ tuyến tính tương ứng thành một ma trận để nhân ma trận trực tiếp:

=== Chuyển đổi sang CIE XYZ và sRGB ===
Việc chuyển đổi sang CIE XYZ và sRGB chỉ đơn giản là áp dụng các hàm ngược tương ứng theo thứ tự ngược lại:

formula_11