- Đường biên hình móng ngựa của biểu đồ sắc độ xy CIE 1931 không phải là một công thức tùy ý, mà bắt nguồn từ hàm so khớp màu đo cách con người cảm nhận tương đối ánh sáng đỏ, lục và lam
- Dữ liệu CIE RGB là kết quả thí nghiệm điều chỉnh các nguồn sáng 700nm, 546nm, 435nm để khớp với màu quang phổ; các giá trị âm ở một số bước sóng cho thấy có những màu không thể tái tạo chỉ bằng RGB thuần
- Không gian màu XYZ là một chuẩn được tạo ra bằng cách biến đổi tuyến tính RGB để mọi giá trị đều dương và dễ xử lý; nó chiếu giá trị 3 chiều xuống tọa độ sắc độ 2 chiều bằng
x = X/(X+Y+Z), y = Y/(X+Y+Z)
- Có thể xấp xỉ màu bên trong biểu đồ bằng cách tạo nhiều dạng đường quang phổ, nhân chúng với hàm so khớp màu rồi lấy tích phân, sau đó chấm lên tọa độ xy, thay vì tính trực tiếp từ
x, y
- Màn hình thực tế bị ràng buộc bởi các không gian màu hiển thị như sRGB hoặc display-p3, nên nhiều màu gần đường biên không được hiển thị chính xác và sẽ xảy ra clipping hoặc bão hòa kênh
Điểm xuất phát của biểu đồ hình móng ngựa
- Biểu đồ sắc độ thường xuyên xuất hiện khi tìm hiểu không gian màu CIE 1931 XYZ là biểu đồ thể hiện chất lượng màu tách khỏi độ sáng
- Phần rìa liên quan đến màu quang phổ của các bước sóng cụ thể, nhưng toàn bộ hình dạng và màu bên trong không thể được giải thích bằng một công thức đơn giản kiểu
x = func(y)
- Hình dạng cốt lõi bắt nguồn từ cách con người cảm nhận đỏ, lục và lam tương đối với nhau; màu bên trong có thể được render thành ảnh 2D bằng toán học pha trộn màu và lấy mẫu điểm
Hàm so khớp màu và CIE RGB
- Hàm so khớp màu biểu thị cần điều chỉnh cường độ các nguồn sáng đỏ, lục và lam bao nhiêu để làm cho một màu mục tiêu ở bước sóng cụ thể trông giống nhau đối với mắt
- Hàm so khớp màu CIE 1931 RGB dùng các nguồn sáng đỏ, lục và lam lần lượt ở 700nm, 546nm, 435nm làm chuẩn
- Thí nghiệm được thực hiện bằng cách đặt nguồn sáng màu mục tiêu ở một bên, còn nguồn sáng RGB ở bên kia để người tham gia tự điều chỉnh cho khớp với màu mục tiêu
- Trong dữ liệu này xuất hiện các giá trị như đỏ âm
- Nguồn sáng âm không thể tạo ra về mặt vật lý
- Điều đó có nghĩa là chỉ bằng các nguồn sáng RGB thuần thì không thể tái tạo một số màu quang phổ
- Tuy vậy, sau khi biến đổi, chúng vẫn có thể được dùng hữu ích trong tính toán không gian màu
Không gian màu XYZ và tọa độ sắc độ xy
- Không gian màu XYZ là dạng biến đổi tuyến tính của không gian màu RGB bằng ma trận, gần giống việc sắp xếp lại cùng một thông tin sang một hệ tọa độ khác dễ tính toán hơn
- Dùng ma trận biến đổi RGB trên Wikipedia, có thể so sánh dữ liệu hàm so khớp màu XYZ với đồ thị RGB
matrix = [
2.364613, -0.89654, -0.468073,
-0.515166, 1.426408, 0.088758,
0.005203, -0.014408, 1.009204
]
[R, G, B] = matrix * [X, Y, Z]
- XYZ có thể được dùng như một không gian chuẩn để mô tả mọi màu, bao gồm cả những màu mà thiết bị hiển thị không thể phát trực tiếp
- Mỗi thiết bị phải diễn giải giá trị này sang không gian màu mà nó có thể hiển thị về mặt vật lý
- Khi gamut màu của thiết bị rộng hơn, cùng một thông tin màu có thể biểu diễn được nhiều màu hơn
- Tọa độ sắc độ xy được tính bằng cách chia các giá trị XYZ cho tổng của chúng
const x = X / (X + Y + Z)
const y = Y / (X + Y + Z)
const z = Z / (X + Y + Z) = 1 - x - y
z có thể suy ra từ x và y, nên thường bị lược bỏ trong biểu đồ sắc độ xy
- Để quay lại XYZ từ
xy, cần có giá trị Y; biểu diễn bao gồm giá trị này là không gian màu xyY
Vì sao nó trông giống móng ngựa
- Khi chiếu dữ liệu hàm so khớp màu RGB sang xy, đường viền của biểu đồ sắc độ quen thuộc bắt đầu xuất hiện
- Dữ liệu RGB bao gồm vùng âm trên trục x do các màu bất khả thi, và khi biến đổi sang XYZ thì nó gần hơn với hình móng ngựa quen thuộc
- Render trực tiếp dữ liệu bảng hàm so khớp màu XYZ sang xy cũng khớp với cùng hình dạng đó
- Hình dạng được suy ra trực tiếp từ các đường cong của hàm so khớp màu XYZ
- Với mỗi bước sóng, tính tỷ lệ của
X, Y, Z trong tổng
- Chấm các điểm theo các tỷ lệ này sẽ tạo ra đường biên sắc độ
- Nếu áp dụng cùng quy trình cho một hàm so khớp màu tự tạo, sẽ thu được hình dạng hoàn toàn khác, vì vậy hình móng ngựa thực tế là kết quả của các hàm được suy ra từ thí nghiệm thị giác của con người
Cách xấp xỉ để tô màu bên trong
- Chỉ với tọa độ
x, y, không thể biết ngay điểm đó có phải là màu hợp lệ hay phải xấp xỉ thành màu nào
- Ngược lại, có thể dùng cách tạo một giá trị XYZ hoặc một quang phổ tùy ý, rồi chuyển nó sang tọa độ xy và chấm lên biểu đồ
- Điểm cốt lõi là tạo ra dạng đường quang phổ
- Tạo một đường trên toàn bộ trục bước sóng, thể hiện mỗi bước sóng đóng góp bao nhiêu vào màu
- Nhân đường đó với hàm so khớp màu XYZ rồi lấy tích phân để thu được giá trị XYZ cuối cùng
- Theo cách tương tự, nhân với hàm so khớp màu RGB rồi lấy tích phân để thu được giá trị RGB
- Chuyển giá trị XYZ thu được sang xy và chấm lên biểu đồ sắc độ
- Thay đổi offset và độ rộng của hai đường sin sẽ tạo ra các đường quang phổ khác nhau, và kết quả là các màu và tọa độ khác nhau xuất hiện trên biểu đồ
- Demo tự động quét không gian rộng hơn bằng cách thay đổi offset và độ rộng, nhưng không lấp đầy hoàn toàn toàn bộ không gian màu
- Có cung cấp demo CodePen để tự thử nghiệm
Hiển thị trên màn hình và ràng buộc không gian màu
- Để hiển thị giá trị XYZ đã tính lên màn hình, cần chuyển nó sang một không gian màu render thực tế như sRGB
rgb() của trình duyệt giả định sRGB, nên khi chuyển XYZ sang RGB cần tính đến hiệu chỉnh gamma
- display-p3 là không gian màu có gamut rộng hơn sRGB, được nhiều trình duyệt và màn hình hỗ trợ
- Trong CSS có thể chỉ định màu display-p3 dưới dạng
color(display-p3 r, g, b)
- Không gian màu p3 của trình duyệt cũng dùng cùng hiệu chỉnh gamma như sRGB, nên phải tính cả phần này thì màu mới được render đúng
- Trên trình duyệt và màn hình wide gamut, có thể thấy các màu mạnh hơn, nhưng chỉ từ thí nghiệm này thì khó xác định p3 được truyền đi như thế nào hoặc được chuyển đổi sang sRGB ra sao trong ảnh chụp màn hình hay chia sẻ màn hình qua Zoom
Vì sao màu không hoàn toàn chính xác
- Nếu chuyển trực tiếp màu bên trong từ giá trị XYZ bằng
XYZ_to_sRGB, nhiều màu sẽ vượt ngoài phạm vi 0~255 và cho kết quả quá bão hòa
- Thay vì lấy màu trực tiếp từ XYZ, cách nhân đường quang phổ với hàm so khớp màu RGB rồi lấy tích phân trông giống một phép nội suy tốt hơn
- Dù vậy, nhiều màu được tạo ra vẫn là giá trị RGB không hợp lệ
- Nếu không render các màu vượt ngoài phạm vi 0~255, chỉ còn lại tam giác sRGB quen thuộc
- Các màu bên ngoài tam giác không được hiển thị chính xác, nhưng khi chỉ 1~2 kênh RGB bị bão hòa, thay đổi ở các kênh còn lại vẫn có thể phần nào cho thấy khác biệt màu
Tài liệu liên quan
1 bình luận
Các ý kiến trên Hacker News
Cách phổ biến nhất để vẽ sắc độ trên lưới tọa độ trực giao khá dễ gây hiểu lầm. Biểu đồ sắc độ dùng tọa độ trọng tâm, và hình dạng méo lệch kỳ lạ của biểu đồ sắc độ XYZ thông thường có thể xem là một sự biến dạng do cách vẽ hơn là do bản chất thực sự của dữ liệu
Sẽ tự nhiên hơn nếu xem biểu đồ sắc độ như một mặt cắt phẳng 2 chiều đi qua ba vectơ đơn vị chuẩn trong không gian màu 3 chiều; hình tam giác đều như [1] thể hiện rất rõ điểm đó. Điều này cũng làm rõ hơn rằng toàn bộ gamut trong không gian XYZ không phải là một hình dạng bị bóp méo tùy tiện, mà được chọn có chủ ý để lấp đầy khá tốt bát diện dương trong các giới hạn của thị giác con người
[1]: https://physics.stackexchange.com/questions/777501/why-is-th...
Bản thân các trục X, Y, Z cũng tùy ý ở mức nào đó, nên khó nói rằng vẽ xy trong một tam giác đều là đúng về bản chất hơn so với vẽ trong một tam giác vuông cân. Dùng các tọa độ gần với đáp ứng của tế bào nón hơn có thể làm khái niệm rõ ràng hơn, nhưng những biểu đồ 2 chiều kiểu này rốt cuộc vẫn có thể gây hiểu lầm cho những người không hiểu sâu cách thị giác hoạt động và ý nghĩa của biểu đồ
https://www.w6rz.net/chromacity.mp4
Phiên bản biểu đồ sắc độ cụ thể đó khiến các màu bị thiếu trên màn hình trông giống màu xanh lục của nhiều loại bút laser. Trên thực tế, cũng có nhiều dải đỏ và xanh lam bị thiếu do các màu cơ bản đỏ/xanh lam rất bão hòa nhưng quá tối trên mỗi đơn vị năng lượng nên không dùng được
Tham khảo: https://nanosys.com/blog-archive/2012/08/14/color-space-conf...
Tôi đã học nhiều hơn mức mong muốn về quản lý màu khi làm ảnh lập thể đỏ-lục lam. Tôi yêu cầu màu đỏ sRGB, nhưng trên màn hình gamut rộng lại ra giá trị đại khái như (180,16,16), khiến hiện tượng xuyên kênh trở nên nghiêm trọng. Giờ tôi đang làm vải in tùy chỉnh với một người bạn thợ may, nhưng màu vàng của họa tiết hoa bằng cách nào đó đã chuyển thành cam trong quá trình xử lý, nên tôi đang cố hoàn tất việc debug và hiệu chỉnh trước khi đặt hàng. Tôi vẫn đang học quá nhiều về quản lý màu
Nhưng tri giác thị giác đi xa hơn rất nhiều so với những gì tế bào nón trong mắt có thể nhìn thấy về mặt vật lý. Phía sau còn có cả bộ não đang cố diễn giải các hiện tượng của dây thần kinh thị giác. Nếu muốn một dạng kích thích não thú vị, hãy tìm hiểu về màu khảm: các màu mà tế bào nón không thể phát hiện về mặt vật lý nhưng ta vẫn có thể nhìn thấy. Ví dụ như xanh lam Stygian, đỏ tự phát sáng, cam hyperbolic
†: https://www.perplexity.ai/search/please-provide-chimerical-c...
W: https://en.wikipedia.org/wiki/Impossible_color
Ví dụ: https://ctnbee.com/en/upload
Có một khám phá thú vị khác về không gian màu: https://ericportis.com/posts/2024/okay-color-spaces/
Với những người nghĩ tím/vàng hồng không phải là màu “thật”, tôi muốn nói rằng ở các bước sóng ngắn, X đỏ giảm chậm hơn Z xanh lam, nên dưới 400nm có thể thu được màu tím/vàng hồng bão hòa đơn sắc công suất cao. Nó không được thể hiện rõ trên biểu đồ độ bão hòa chuẩn, cũng không hiệu quả cho màn hình, và cũng nguy hiểm nếu nhìn lâu, giống như ngay cả màu xanh lam cũng vậy. Nếu thấy laser tím/vàng hồng đơn sắc, bạn nên quay đầu đi hoặc nhắm mắt lại
Tuyệt vời. Điều này làm tôi nảy ra một ý tưởng về màu sắc, tri giác và gamut
Nói ngắn gọn, hãy tưởng tượng một tổ hợp bước sóng ánh sáng nào đó khiến ta tri giác được mùi phô mai ủ, còn một tổ hợp khác khiến ta nghĩ rằng có con gấu ở phía sau. Khi đó biểu đồ sẽ phải đặt cả hình nhỏ của phô mai và gấu tại những điểm nơi tri giác cụ thể đó xuất hiện, chứ không chỉ có các pixel màu
Tôi nghĩ thực ra màu vàng hồng là thứ như vậy. Nó là một màu không có trong phổ, và có cảm giác giống một cảm giác/tri giác mà não chỉ đơn giản quy về thêm một màu nữa để khỏi bị quá tải. Tôi cho rằng điều này cũng gần với cách mô tả một hiện tượng có thật ở những người có mức độ liên giác khác nhau, hay nếu được phép chơi chữ, những người nằm trên phổ liên giác
Bắt đầu từ XYZ thì cũng ổn, nhưng hiện nay đã có những không gian màu tốt hơn nhiều, tương ứng với thị giác của chúng ta hơn. Tiêu biểu là CIE 1976 L',u',v', và gần đây hơn là ICtCp từ nghiên cứu của Dolby
Tương tự, nếu vẽ các màu tương ứng với bước sóng thuần rồi lấy bao lồi của chúng, ta có thể thu được toàn bộ không gian màu khả dĩ về mặt vật lý. Đặc tính này khó tái hiện đúng trong các không gian màu khác, cùng lắm chỉ có thể là biến đổi tuyến tính. XYZ vốn đã là một biến đổi như vậy, và gần như có đủ mọi tính chất đáng mong đợi khi chọn cơ sở
https://giannirosato.com/blog/post/jpegli-xyb/
Tôi tò mò liệu có một không gian màu “dành cho giáo dục” được tối ưu cho việc dạy và học không. Ý tôi là một không gian màu ưu tiên độ chính xác hơn toán học đơn giản, và những đặc tính nổi bật của nó là đặc điểm của tri giác con người thực sự chứ không phải “artifact của mô hình”
Sẽ tốt nếu nó bao phủ toàn bộ gam màu, hoạt động tốt cả với quỹ tích phổ, và sắc độ cũng như pha trộn màu có phần tuyến tính. Tương tự vùng mà Munsell từng đảm nhiệm, nhưng xử lý toàn bộ gam màu và theo kiểu thế kỷ 21. Khi làm một dự án phụ với ý tưởng “liệu nhấn mạnh phổ có giúp dạy màu tốt hơn không?”, tôi không tìm được thứ gì đủ gần nên đã tạm ghép một giải pháp. Tôi dùng CAM16UCS làm ứng viên hiện đại cho không gian màu tri giác, dùng Jzazbz để gỡ xoắn cho sắc độ tuyến tính, cũng kiểm tra sanity về độ chói tuyệt đối, và đã khá tùy tiện nén cái đuôi xanh kỳ lạ gần quỹ tích mà tôi hiểu là phần phi tri giác của CAM. Phần triển khai dùng lookup table. Nếu có công trình liên quan, tôi rất muốn nghe
Hellwig và Fairchild gần đây đã đơn giản hóa mô hình về mặt toán học đồng thời cải thiện độ chính xác chroma (http://markfairchild.org/PDFs/PAP45.pdf). Một mô hình đơn giản hơn là CIELAB, xuất ra các tham số L, a, b. Ở đây L là độ sáng, hypot(a,b) là chroma, còn arctan2(b,a) là sắc độ
Một lựa chọn tốt hơn có thể là không gian màu Munsell. Munsell chia toàn bộ vùng màu thành hàng nghìn mảnh nhỏ, và khoảng cách giữa mỗi mảnh là một đơn vị “khác biệt vừa đủ nhận thấy”, được xác định bằng kiểm thử người dùng rất cẩn thận. Vì vậy vùng màu xanh lá lớn hơn nhiều so với màu vàng. Quá trình phát triển không gian màu này cũng rất thú vị; ông là họa sĩ, nhưng công trình của ông đã mở đường cho các không gian màu hiện đại hơn
“Nguồn sáng đỏ âm” có nghĩa là người tham gia thí nghiệm đã xoay núm thêm ánh sáng đỏ vào màu mà họ đang cố so khớp
Về cơ bản có một màu chưa biết C và màu R+G+B. Đôi khi không thể so khớp được, nên họ thử làm cho C+R = G+B. Khi đó R được cộng sang phía đối diện của phương trình, nên xuất hiện R “âm”. Điều tương tự cũng xảy ra với xanh lá và xanh lam, nhưng ở mức độ nhỏ hơn
Nhìn chung là đúng, nhưng ở đoạn cuối tôi không hiểu lắm phần tác giả tạo các phổ có hai đỉnh rồi chiếu lên biểu đồ sắc độ để lấp đầy bên trong quỹ tích. Tôi không biết vì sao lại làm vậy
Tôi nghĩ cách nên làm là thế này. Trước hết chọn một giá trị Y làm độ chói của biểu đồ, rồi với mỗi pixel nằm trong vùng được bao quanh bởi quỹ tích phổ và đường màu tím, lấy tọa độ x, y. Ba giá trị này xác định một màu trong không gian màu CIE xyY, và phép chuyển từ xyY sang XYZ rất đơn giản: X = Y / y * x, Y = Y, Z = Y / y * (1 - x - y). Sau đó ánh xạ các giá trị XYZ sang không gian màu của ảnh đầu ra, chẳng hạn sRGB. Nếu một giá trị XYZ cụ thể nằm ngoài phạm vi [0,1] của sRGB thì nó nằm ngoài gam màu sRGB, nên chỉ cần clipping về giá trị gam màu hợp lệ gần nhất
Vấn đề là “mỗi pixel trong vùng”. Lẽ ra tôi có thể làm như vậy rồi cắt đầu ra theo hình đó, nhưng như thế là dùng chính hình đó để cắt đầu ra, nên hoàn toàn không trả lời được vì sao nó lại có hình dạng như vậy. Nó có cảm giác giả tạo. Tuy nhiên có vẻ đây là cách phổ biến nhất. Tôi đã cố hiểu một cách tiếp cận nghiêm ngặt hơn, và phương pháp tạo phổ để lấp đầy được mô tả ở đây: https://clarkvision.com/articles/color-cie-chromaticity-and-...
Cách đó có cảm giác như một cách tiếp cận nghiêm ngặt hơn, nhưng clipping có lẽ cũng là một phương pháp “đủ tốt”
Tôi có câu hỏi cho những người am hiểu khoa học màu sắc. Tôi đang đọc dữ liệu gốc của Guild https://royalsocietypublishing.org/doi/pdf/10.1098/rsta.1932... và khó hiểu các con số trong Bảng 4 có ý nghĩa gì
Tôi muốn biết liệu có ai hiểu tất cả các cột trong đó không. Đặc biệt, tôi đang tìm các hệ số chưa chuẩn hóa từ thí nghiệm so khớp màu, hoặc cách hoàn nguyên chuẩn hóa các hệ số đó. Các hệ số tôi nói đến là hệ số tam sắc u{a,b,c}_\lambda trong Bảng 3. Tôi cũng không rõ dữ liệu đó có nằm trong Bảng 4 không, nên có thể đây là hai câu hỏi khác nhau
Tôi thấy cách giải thích khá đơn giản. Màu sắc là ánh sáng, và là thứ tuyến tính kéo dài từ tia tử ngoại sang xanh lam, xanh lục, vàng, đỏ rồi tới hồng ngoại. Nó chỉ là một đường thẳng
Trong thực tại vật lý không tồn tại ánh sáng tím. Khi mắt nhận đồng thời ánh sáng đỏ và xanh lam, tâm trí tạo ra mọi sắc tím và magenta nằm giữa xanh lam và đỏ. Vì vậy, để bao gồm magenta, ta phải vẽ thêm một đường nữa giữa xanh lam và đỏ. Nói cách khác, phải uốn cong đường màu sắc thực, và đó chính là thứ ta thấy trong biểu đồ sắc độ
Vì vậy tôi viết là ánh sáng “‘đỏ’”, chứ không phải ánh sáng đỏ. Phổ vật lý được ghép với thang xám theo trục nm và năng lượng, còn phổ tri giác được ghép với màu theo góc sắc độ và độ chói. Cả hai đều có thể được quấn vào không gian màu tri giác 3 chiều, và cũng có thể nội suy phổ vật lý từ nm sang màu sắc. Hoặc có thể bố trí theo không gian lưỡng sắc 2 chiều của các loài thú không phải linh trưởng để nhấn mạnh sự phụ thuộc vào hệ thần kinh. Những hiểu lầm về màu sắc lan quá rộng, từ mẫu giáo đến sau đại học, nên việc cực kỳ cẩn trọng để đạt sự rõ ràng là có ích
Trong quang học được ngụ ý là “thực tại vật lý”, hoàn toàn không có màu sắc. Tâm trí tạo ra mọi màu sắc. Gán cho ánh sáng một đặc tính màu sắc độc lập với chủ thể nhìn là một lỗi phạm trù. Trong khoa học màu sắc, cái được gọi ở đây là thực tại vật lý chính xác hơn là phân bố công suất phổ của bức xạ điện từ trong dải khả kiến. Chừng nào bức xạ đó kích thích phản ứng màu của hệ thị giác con người, ánh sáng tím chắc chắn tồn tại. Chỉ là nó không được mô phỏng bằng một dải bức xạ hẹp có bước sóng đơn nhất mà thôi
“Ranh giới tím” ở phần dưới của biểu đồ móng ngựa CIE cho thấy ranh giới tri giác khi trộn các kích thích bước sóng dài và bước sóng ngắn, tức các màu cơ bản đỏ/xanh lam. Nhưng giả định rằng ánh sáng có màu sắc tự nhiên là một mô tả thực tại rất lấy con người làm trung tâm. Các sinh vật khác có những phản ứng đặc trưng rất khác con người. Chỉ cần hình dung một giác quan nhạy với phân cực. Vòng màu của họa sĩ có dạng tròn vì trong tâm trí người họa sĩ, màu sắc hiện ra như vậy dưới dạng chất cảm giác. Vật lý học của chất cảm giác liên quan nhiều hơn đến độ phức tạp của phản ứng bên trong sinh vật so với kích thích bên ngoài. Nói về màu của ánh sáng là cách diễn đạt thông thường, nhưng nó gán quá mức các đặc tính của con người cho vật lý của kích thích. Hãy giải thích đơn giản nhất có thể, nhưng đừng làm nó đơn giản hơn thế
Cách giải thích coi “màu thật” là thuộc tính của ánh sáng chứ không phải tri giác sẽ gây thêm hiểu lầm hơn là làm rõ