- CIE 1931 xy chromaticity diagram की घोड़े की नाल जैसी सीमा कोई मनमाना फ़ॉर्मूला नहीं है; यह इंसान लाल, हरे और नीले प्रकाश को सापेक्ष रूप से कैसे perceive करता है, इसे मापने वाली color matching functions से आती है
- CIE RGB डेटा 700nm, 546nm, 435nm प्रकाश स्रोतों को adjust करके spectral colors से मिलाने वाले प्रयोगों का परिणाम है, और कुछ wavelengths के negative values दिखाते हैं कि कुछ रंग pure RGB से reproduce नहीं किए जा सकते
- XYZ color space, RGB का linear transformation करके सभी values को positive और handle करने में आसान बनाने वाला standard है, और
x = X/(X+Y+Z), y = Y/(X+Y+Z) से 3D values को 2D chromaticity coordinates पर project करता है
- diagram के अंदर के रंगों को सीधे
x, y से calculate करने के बजाय, कई spectral line shapes बनाकर उन्हें color matching functions से multiply करके integrate करने और फिर xy coordinates पर plot करने के तरीके से approximate किया जा सकता है
- वास्तविक screens sRGB या display-p3 जैसे display color spaces से बंधी होती हैं, इसलिए boundary के पास के कई रंग ठीक-ठीक display नहीं होते और clipping या channel saturation होता है
घोड़े की नाल जैसे diagram की शुरुआत
- CIE 1931 XYZ color space को समझते समय बार-बार दिखने वाला chromaticity diagram brightness से अलग करके रंग की quality दिखाने वाला chart है
- किनारे किसी खास wavelength के spectral colors से जुड़े होते हैं, लेकिन पूरा shape और अंदरूनी रंग किसी simple
x = func(y) formula से explain नहीं होते
- core shape इस बात से आता है कि इंसान लाल, हरे और नीले को एक-दूसरे के सापेक्ष कैसे perceive करता है, और अंदरूनी रंगों को color mixing math और point sampling से 2D image में render किया जा सकता है
Color matching functions और CIE RGB
- Color matching functions दिखाती हैं कि किसी खास wavelength के target color को आंखों को समान दिखाने के लिए लाल, हरे और नीले light sources की intensity कितनी adjust करनी होगी
- CIE 1931 RGB color matching functions क्रमशः 700nm, 546nm, 435nm के लाल, हरे और नीले light sources पर आधारित हैं
- प्रयोग में एक तरफ target color light source रखा गया, और दूसरी तरफ RGB light sources को इंसान ने खुद adjust करके target color से match किया
- इस data में negative red जैसी values आती हैं
- negative light source physically बनाया नहीं जा सकता
- इसका मतलब है कि सिर्फ pure RGB light sources से कुछ spectral colors reproduce नहीं किए जा सकते
- फिर भी transformation के बाद color space calculations में इसे उपयोगी रूप से इस्तेमाल किया जा सकता है
XYZ color space और xy chromaticity coordinates
- XYZ color space, RGB color space को matrix से linear transform किया हुआ रूप है, और इसे उसी information को calculate करने में आसान किसी दूसरे coordinate system में rearrange करने जैसा समझा जा सकता है
- Wikipedia के RGB transformation matrix का उपयोग करके XYZ color matching function data की RGB graph से तुलना की जा सकती है
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 को display device सीधे produce न कर सकने वाले रंगों सहित सभी रंगों का वर्णन करने वाले standard space के रूप में इस्तेमाल किया जा सकता है
- हर device को इन values को अपने physically displayable color space में interpret करना होता है
- device का gamut जितना wide होगा, वही color information से उतने ज्यादा रंग express किए जा सकेंगे
- xy chromaticity coordinates, XYZ values को उनके कुल योग से divide करके calculate किए जाते हैं
const x = X / (X + Y + Z)
const y = Y / (X + Y + Z)
const z = Z / (X + Y + Z) = 1 - x - y
z को x और y से derive किया जा सकता है, इसलिए xy chromaticity diagram में आम तौर पर इसे omit किया जाता है
xy से वापस XYZ में जाने के लिए Y value चाहिए, और इसे शामिल करने वाला representation xyY color space है
यह घोड़े की नाल जैसा क्यों दिखता है
- RGB color matching function data को xy पर project करने से परिचित chromaticity diagram की outline दिखना शुरू होती है
- RGB data में impossible colors के कारण x-axis का negative region शामिल होता है, और XYZ में transform करने पर यह ज्यादा परिचित घोड़े की नाल जैसे shape के करीब हो जाता है
- XYZ color matching function table data को सीधे xy में render करने पर भी वही shape मिलता है
- shape सीधे XYZ color matching functions की curves से derive होता है
- हर wavelength के लिए calculate किया जाता है कि
X, Y, Z कुल में कितना हिस्सा लेते हैं
- इन ratios के अनुसार points plot करने पर chromaticity boundary बनती है
- मनमाने ढंग से बनाई गई color matching functions पर यही प्रक्रिया लागू करने पर बिल्कुल अलग shape आता है, इसलिए असली घोड़े की नाल जैसा shape human vision experiments से derive हुई functions का result है
अंदरूनी रंग भरने की approximation method
- केवल
x, y coordinates से तुरंत पता नहीं चलता कि वह point valid color है या नहीं, या उसे किस रंग के रूप में approximate करना चाहिए
- इसके उलट, arbitrary XYZ values या spectrum बनाकर उसे xy coordinates में convert करके chart पर plot करने का approach इस्तेमाल किया जा सकता है
- मुख्य बात spectral line shapes generate करना है
- सभी wavelength axes पर एक line बनाई जाती है जो दिखाती है कि हर wavelength color में कितना contribute करती है
- उस line को XYZ color matching functions से multiply और integrate करके final XYZ value मिलती है
- उसी तरह RGB color matching functions से multiply और integrate करके RGB values मिलती हैं
- मिली हुई XYZ value को xy में बदलकर chromaticity diagram पर plot किया जाता है
- दो sine curves में offset और width बदलने से अलग-अलग spectral lines बनती हैं, और उनके परिणामस्वरूप chart पर अलग रंग और coordinates दिखाई देते हैं
- automated demo offset और width बदलते हुए space को ज्यादा wide scan करता है, लेकिन पूरे color space को पूरी तरह नहीं भरता
- सीधे experiment करने के लिए CodePen demo दिया गया है
Screen display और color space constraints
- calculated XYZ values को screen पर display करने के लिए उन्हें sRGB जैसे वास्तविक rendering color space में convert करना होता है
- browser का
rgb() sRGB मानता है, इसलिए XYZ को RGB में बदलते समय gamma correction को ध्यान में रखना होगा
- display-p3, sRGB से wide gamut वाला color space है, और कई browsers और displays इसे support करते हैं
- CSS में
color(display-p3 r, g, b) form से display-p3 colors specify किए जा सकते हैं
- browser का p3 color space भी sRGB जैसी gamma correction इस्तेमाल करता है, इसलिए सही rendering के लिए इसे शामिल करना होगा
- wide gamut browsers और displays में ज्यादा strong colors दिख सकते हैं, लेकिन screenshots या Zoom screen sharing में p3 कैसे transmit होता है या sRGB में convert होता है, यह सिर्फ इस experiment से पक्का करना मुश्किल है
रंग पूरी तरह accurate क्यों नहीं हैं
- अंदरूनी रंगों को XYZ values से सीधे
XYZ_to_sRGB में convert करने पर कई colors 0~255 range से बाहर चले जाते हैं और result बहुत ज्यादा saturated हो जाता है
- XYZ से सीधे रंग पाने के बजाय spectral line को RGB color matching functions से multiply करके integrate करना बेहतर interpolation जैसा लगता है
- फिर भी generated colors में से काफी अभी भी invalid RGB values हैं
- 0~255 range से बाहर के colors render न करने पर केवल familiar sRGB triangle बचता है
- triangle के बाहर के colors accurately display नहीं होते, लेकिन RGB channels में से केवल 1~2 saturated होने की स्थिति में बाकी channels के बदलाव से color difference कुछ हद तक दिख सकता है
संबंधित सामग्री
1 टिप्पणियां
Hacker News टिप्पणियाँ
chromaticity को orthogonal coordinate grid पर दिखाने का सबसे आम तरीका काफ़ी भ्रामक है। chromaticity diagram barycentric coordinates का उपयोग करता है, और सामान्य XYZ chromaticity diagram का अजीब-सा टेढ़ा आकार डेटा की वास्तविक प्रकृति से ज़्यादा, उसे खींचने के तरीके से पैदा हुई विकृति के क़रीब है
chromaticity diagram को 3D color space में तीन standard unit vectors से गुजरने वाले 2D plane section के रूप में देखना ज़्यादा स्वाभाविक है, और [1] जैसा equilateral triangle वाला चित्र उस बात को अच्छी तरह दिखाता है। यह भी ज़्यादा साफ़ हो जाता है कि XYZ space का पूरा gamut कोई मनमाना विकृत आकार नहीं है, बल्कि इसे जानबूझकर इस तरह चुना गया था कि मानव दृष्टि की सीमाओं के भीतर positive octant को काफ़ी अच्छी तरह भरे
[1]: https://physics.stackexchange.com/questions/777501/why-is-th...
X, Y, Z axes स्वयं कुछ हद तक मनमाने हैं, इसलिए यह कहना मुश्किल है कि xy को equilateral triangle के भीतर दिखाना right isosceles triangle के भीतर दिखाने की तुलना में मूलतः ज़्यादा सही है। cone response के क़रीब coordinates इस्तेमाल करने से अवधारणात्मक रूप से ज़्यादा स्पष्टता मिल सकती है, लेकिन ऐसे 2D diagram अंततः उन लोगों को ग़लतफ़हमी में डाल सकते हैं जिन्हें यह गहरी समझ नहीं है कि vision कैसे काम करती है और diagram का मतलब क्या है
https://www.w6rz.net/chromacity.mp4
chromaticity diagram का वह विशेष संस्करण display में छूटे हुए रंगों को कई तरह के laser pointer green जैसा दिखाता है। वास्तव में बहुत से red और blue family के रंग भी छूट जाते हैं, क्योंकि बहुत saturated red·blue primaries ऊर्जा के हिसाब से इतने अंधेरे होते हैं कि व्यावहारिक नहीं रहते
संदर्भ: https://nanosys.com/blog-archive/2012/08/14/color-space-conf...
red-cyan stereogram बनाते हुए मैंने color management के बारे में जितना नहीं सीखना चाहता था, उससे कहीं ज़्यादा सीख लिया। वजह यह थी कि मैंने sRGB red माँगा, लेकिन wide-gamut monitor पर लगभग (180,16,16) जैसे मान मिले, जिससे channels के बीच crosstalk बहुत बढ़ गया। अब मैं अपनी एक seamstress दोस्त के साथ custom printed fabric पर काम कर रहा हूँ, और फूलों के pattern का yellow processing के दौरान किसी तरह orange में बदल रहा है, इसलिए order देने से पहले debugging और correction पूरा करने की कोशिश कर रहा हूँ। अब भी color management के बारे में ज़रूरत से ज़्यादा सीख रहा हूँ
लेकिन visual perception आँख की cone cells जो भौतिक रूप से देख सकती हैं, उससे कहीं आगे जाती है। इसके पीछे optic nerve की घटनाओं की व्याख्या करने की कोशिश करता हुआ पूरा मस्तिष्क है। एक दिलचस्प brain stimulus के रूप में उन chimerical colors को देखना अच्छा होगा जिन्हें cone cells भौतिक रूप से detect नहीं कर सकतीं, लेकिन जिन्हें देखा जा सकता है। जैसे stygian blue, self-luminous red, और hyperbolic orange
†: https://www.perplexity.ai/search/please-provide-chimerical-c...
W: https://en.wikipedia.org/wiki/Impossible_color
उदाहरण: https://ctnbee.com/en/upload
color space पर एक और दिलचस्प लेख है: https://ericportis.com/posts/2024/okay-color-spaces/
जो लोग सोचते हैं कि purple/magenta “वास्तविक” रंग नहीं हैं, उनसे मैं कहना चाहूँगा कि छोटी wavelengths पर red X, blue Z की तुलना में ज़्यादा धीरे घटता है, इसलिए 400nm से नीचे high-power single-wavelength saturated purple/magenta रंग प्राप्त किए जा सकते हैं। इन्हें standard chromaticity chart पर अच्छी तरह नहीं दिखाया जाता, monitor के लिए ये efficient भी नहीं हैं, और blue की तरह इन्हें देर तक देखना ख़तरनाक भी है। single-wavelength purple/magenta laser को देखें तो सिर घुमा लेना या आँखें बंद कर लेना चाहिए
शानदार। इससे color, perception, और gamut के बारे में एक विचार आया
सरल शब्दों में, मान लीजिए कि प्रकाश की कुछ wavelength combinations से पके हुए cheese की गंध का perception पैदा होता है, और किसी दूसरी combination से ऐसा लगता है कि पीछे कोई bear है। तब diagram में केवल color pixels ही नहीं, बल्कि उन बिंदुओं पर cheese और bear के छोटे चित्र भी होने चाहिए जहाँ वह विशेष perception उत्पन्न होता है
मुझे सच में लगता है कि magenta कुछ ऐसा ही है। यह spectrum में मौजूद रंग नहीं, बल्कि उस भावना या sensation के ज़्यादा क़रीब है जिसे मस्तिष्क, ज़्यादा overload हुए बिना, बस एक और रंग के रूप में perceive कर लेता है। कुछ हद तक यह अलग-अलग स्तर की synesthesia वाले लोगों—अगर शब्दों का खेल स्वीकार करें, तो synesthesia spectrum पर मौजूद लोगों—के वास्तविक अनुभव को समझाने के भी क़रीब है
XYZ से शुरुआत करना ठीक हो सकता है, लेकिन अब ऐसे कहीं बेहतर color spaces मौजूद हैं जो हमारी दृष्टि से ज़्यादा अच्छी तरह मेल खाते हैं। उदाहरण के तौर पर CIE 1976 L',u',v', और हाल में Dolby research का ICtCp
इसी तरह, अगर शुद्ध wavelengths के अनुरूप रंगों को प्लॉट करके उनका convex hull लिया जाए, तो भौतिक रूप से संभव पूरा color space मिल सकता है। ऐसी विशेषता को दूसरे color spaces में ठीक से दोहराना मुश्किल है, ज़्यादा से ज़्यादा linear transform तक ही बात जाती है। XYZ पहले से ही ऐसा transform है, और basis selection से जो गुण चाहे जा सकते हैं उनमें से लगभग सब इसमें हैं
https://giannirosato.com/blog/post/jpegli-xyb/
सोच रहा हूँ कि क्या शिक्षा और learning के लिए optimize किया गया कोई “educational” color space है। मेरा मतलब ऐसा color space है जो साधारण गणित से ज़्यादा accuracy को प्राथमिकता दे, और जिसकी नज़र आने वाली विशेषताएँ “model artifacts” न होकर वास्तविक human perception की विशेषताएँ हों
अच्छा होगा अगर वह पूरा gamut कवर करे और spectral locus पर भी ठीक काम करे, और hue तथा color mixing कुछ हद तक linear हों। कुछ वैसा क्षेत्र जैसा पहले Munsell कवर करता था, लेकिन पूरे gamut के साथ, और 21वीं सदी के हिसाब से। “क्या spectrum पर ज़ोर देने से रंग बेहतर सिखाए जा सकते हैं?” इस side project पर काम करते हुए मुझे कुछ भी क़रीबी नहीं मिला, इसलिए मैंने अस्थायी तौर पर चीज़ों को जोड़कर बनाया। perceptual color space के आधुनिक candidate के रूप में CAM16UCS लिया, linear hue के लिए Jzazbz से twist सुलझाया, absolute luminance sanity check भी किया, और CAM की non-perceptual चीज़ मानकर trajectory के पास वाली अजीब नीली tail को काफ़ी ad hoc तरीके से दबा दिया। implementation lookup table से किया। अगर इस तरह का कोई संबंधित काम है तो उसके बारे में सुनना चाहूँगा
Hellwig और Fairchild ने हाल में model को गणितीय रूप से सरल बनाते हुए chroma accuracy बेहतर की है(http://markfairchild.org/PDFs/PAP45.pdf). एक और सरल model CIELAB है, जो L, a, b parameters देता है। यहाँ L lightness है, hypot(a,b) chroma है, और arctan2(b,a) hue है
इससे बेहतर विकल्प Munsell color space हो सकता है। Munsell ने पूरे color region को हज़ारों छोटे हिस्सों में बाँटा था, और हर हिस्से के बीच की दूरी सावधानी से किए गए user tests के आधार पर तय की गई “बस मुश्किल से महसूस होने वाला अंतर” की एक unit थी। इसलिए हरे क्षेत्र का आकार पीले से बहुत बड़ा था। इस color space को विकसित करने की प्रक्रिया भी बहुत दिलचस्प है, और वे चित्रकार थे, लेकिन उनके काम ने ज़्यादा आधुनिक color spaces के लिए रास्ता खोला
“negative red light source” का मतलब है कि subject ने उस रंग से match करने के लिए लाल रोशनी जोड़ने वाला dial घुमाया
मूल रूप से आपके पास अज्ञात रंग C है और R+G+B रंग है। कभी-कभी match संभव नहीं होता, इसलिए C+R = G+B को match करने की कोशिश की जाती है। इस स्थिति में R समीकरण के दूसरी तरफ जोड़ा जाता है, इसलिए “negative” R आता है। यही बात हरे और नीले के साथ भी होती है, लेकिन मात्रा कम होती है
कुल मिलाकर सही है, लेकिन आख़िरी हिस्से में लेखक जिस तरह two-peak spectrum बनाकर उसे chromaticity diagram पर project करके locus के अंदरूनी हिस्से को भरने की कोशिश करता है, वह मुझे ठीक से समझ नहीं आया। समझ नहीं आता कि ऐसा क्यों किया जाए
मेरे हिसाब से इसे इस तरह करना चाहिए। पहले Y value चुनें, ताकि वह chart की luminance बने, फिर spectral locus और purple line से घिरे क्षेत्र के भीतर हर pixel के लिए x, y coordinates लें। ये तीनों मान CIE xyY color space में एक रंग निर्दिष्ट करते हैं, और xyY से XYZ में रूपांतरण सरल है: X = Y / y * x, Y = Y, Z = Y / y * (1 - x - y)। इसके बाद XYZ values को output image के color space, जैसे sRGB, में map करें। अगर कोई XYZ value sRGB के [0,1] range से बाहर जाती है, तो वह sRGB gamut से बाहर है, इसलिए उसे सबसे नज़दीकी वैध gamut value पर clip कर सकते हैं
समस्या “क्षेत्र के भीतर हर pixel” वाली बात है। उसके बाद output को उस shape से crop किया जा सकता था, लेकिन तब आप output को उसी shape से काट रहे होते, इसलिए वह shape ऐसी क्यों है इसका जवाब बिल्कुल नहीं मिलता। यह मुझे थोड़ा fake लगा। हालांकि लगता है कि यही सबसे आम तरीका है। मैं कोई ज़्यादा rigorous approach समझने की कोशिश कर रहा था, और spectrum generate करके भरने वाली विधि यहाँ समझाई गई है: https://clarkvision.com/articles/color-cie-chromaticity-and-...
वह ज़्यादा rigorous approach जैसी लगती है, लेकिन clipping भी शायद “काफ़ी ठीक” तरीका हो सकता है
color science जानने वालों से एक सवाल है। मैं Guild का original data https://royalsocietypublishing.org/doi/pdf/10.1098/rsta.1932... पढ़ रहा हूँ, लेकिन table 4 के numbers का मतलब समझना मुश्किल हो रहा है
जानना चाहता हूँ कि क्या वहाँ की सभी columns को समझने वाला कोई है। खास तौर पर मैं color matching experiment से निकले unnormalized coefficients, या उन coefficients को denormalize करने का तरीका ढूँढ रहा हूँ। यहाँ coefficients से मेरा मतलब table 3 के tristimulus coefficients u{a,b,c}_\lambda है। मुझे यह भी नहीं पता कि वह data table 4 में है या नहीं, इसलिए शायद ये दो अलग सवाल हों
मुझे लगता है कि इसका स्पष्टीकरण सरल है। रंग, प्रकाश है, और यह ultraviolet से blue, green, yellow, red, infrared तक जाने वाली एक रैखिक चीज़ है। यह बस एक ही रेखा है
भौतिक वास्तविकता में violet-purple जैसा कुछ मौजूद नहीं है। जब आँखों को red और blue प्रकाश एक साथ मिलता है, तो मन blue और red के बीच आने वाले सभी purple और magenta शेड्स बना लेता है। इसलिए magenta को शामिल करने के लिए blue और red के बीच एक और रेखा खींचनी पड़ती है। यानी रंगों की वास्तविक रेखा को मोड़ना पड़ता है, और chromaticity diagram में हम वही देखते हैं
इसलिए मैंने “लाल प्रकाश” की जगह “'लाल' प्रकाश” लिखा। भौतिक spectrum को nm और energy axis के grayscale के साथ, और perceptual spectrum को hue angle और luminance के रंगों के साथ जोड़ा। दोनों को 3D perceptual color space में लपेटा जा सकता है, और भौतिक spectrum को nm से hue में interpolate भी किया जा सकता है। या इसे 2D non-primate mammal dichromacy space के साथ रखकर nervous system पर निर्भरता को उभारा जा सकता है। रंग को लेकर गलतफ़हमियाँ kindergarten से लेकर graduate school तक इतनी व्यापक हैं कि स्पष्टता के लिए बेहद सावधान रहना मददगार होता है
जिस optics को मैंने “भौतिक वास्तविकता” कहा, उसमें रंग नाम की कोई चीज़ नहीं होती। मन ही सभी रंग बनाता है। देखने वाले से स्वतंत्र किसी रंग-विशेषता को प्रकाश पर थोपना एक category error है। color science में यहाँ जिस भौतिक वास्तविकता की बात हो रही है, उसे अधिक सटीक रूप से visible-range electromagnetic radiation की spectral power distribution कहा जाता है। जब तक वह radiation मानव visual system की color response को उत्तेजित करती है, तब तक violet-purple निश्चित रूप से मौजूद है। बस यह किसी एक संकीर्ण wavelength band radiation से simulate नहीं होता
CIE horseshoe diagram की निचली “purple boundary” long-wavelength और short-wavelength stimuli, यानी red/blue primaries को मिलाने पर बनने वाली perceptual boundary दिखाती है। लेकिन यह मान लेना कि प्रकाश का अपना कोई प्राकृतिक रंग होता है, वास्तविकता का बहुत मानव-केंद्रित वर्णन है। दूसरे जीवों की विशेष प्रतिक्रियाएँ मनुष्यों से बहुत अलग होती हैं। आप polarization-sensitive sense की कल्पना कर सकते हैं। कलाकारों का color wheel गोल होता है, क्योंकि कलाकार के मन में रंग qualia के रूप में ऐसे ही प्रकट होते हैं। qualia की physics, बाहरी stimuli की तुलना में, जीव के भीतर की प्रतिक्रिया की जटिलता से अधिक जुड़ी है। प्रकाश के रंग की बात करना आम बोलचाल में ठीक है, लेकिन यह stimulus की physics पर मानवीय विशेषताओं को ज़रूरत से ज़्यादा थोप देता है। जितना संभव हो उतना सरल समझाना चाहिए, लेकिन उससे भी ज़्यादा सरल नहीं बनाना चाहिए
“वास्तविक रंग” को perception की बजाय प्रकाश का गुण मानने वाली व्याख्या, स्पष्टता बढ़ाने के बजाय और अधिक भ्रम पैदा करती है