graphics - एक रैखिक बनाम एक गैर रेखीय आरजीबी अंतरिक्ष में रंगों के साथ काम करते समय व्यावहारिक मतभेद क्या हैं?




colors rgb (2)

एक रैखिक आरजीबी अंतरिक्ष की मूल संपत्ति क्या है और एक गैर-रैखिक की मौलिक संपत्ति क्या है? उन 8 (या अधिक) बिट्स में प्रत्येक चैनल के अंदर मूल्यों के बारे में बात करते समय, क्या परिवर्तन होते हैं?

ओपनजीएल में, रंग 3 + 1 मान होते हैं, और इसके साथ मेरा मतलब आरजीबी + अल्फा है, प्रत्येक चैनल के लिए 8 बिट आरक्षित है, और यह वह हिस्सा है जिसे मैं स्पष्ट रूप से प्राप्त करता हूं।

लेकिन जब गामा सुधार की बात आती है तो मुझे नहीं मिलता कि गैर-रैखिक आरजीबी अंतरिक्ष में काम करने का क्या प्रभाव है।

चूंकि मुझे पता है कि फोटो-एडिटिंग के लिए ग्राफ़िक सॉफ़्टवेयर में वक्र का उपयोग कैसे किया जाए, मेरी व्याख्या यह है कि एक रैखिक आरजीबी स्पेस में आप वैल्यू लेते हैं, क्योंकि कोई मैनिपुलेशन नहीं होता है और कोई गणित फ़ंक्शन संलग्न नहीं होता है, इसके बजाय जब यह प्रत्येक गैर-रैखिक होता है चैनल आमतौर पर क्लासिक पावर फ़ंक्शन व्यवहार के बाद विकसित होता है।

यहां तक ​​कि अगर मैं इस स्पष्टीकरण को असली के रूप में लेता हूं, तो मुझे अभी भी वास्तविक रैखिक स्थान नहीं मिलता है, क्योंकि गणना के बाद सभी गैर-रैखिक आरजीबी रिक्त स्थान रैखिक हो जाते हैं और सबसे महत्वपूर्ण बात यह है कि मुझे वह हिस्सा नहीं मिलता है जहां एक गैर -लाइन रंगीन जगह मानव आंखों के लिए अधिक उपयुक्त है क्योंकि अंत में सभी आरजीबी रिक्त स्थान जो मैं समझता हूं उसके लिए रैखिक होते हैं।


मान लीजिए कि आप आरजीबी रंगों के साथ काम कर रहे हैं: प्रत्येक रंग को तीन तीव्रता या चमक के साथ दर्शाया जाता है। आपको "रैखिक आरजीबी" और "एसआरबीबी" के बीच चयन करना होगा। अभी के लिए, हम तीन अलग-अलग तीव्रताओं को अनदेखा करके चीजों को सरल बना देंगे, और मान लें कि आपको केवल एक तीव्रता है: यानी, आप केवल ग्रे के रंगों से निपट रहे हैं।

एक रैखिक रंग-स्थान में, आपके द्वारा संग्रहीत संख्याओं और तीव्रता के बीच संबंध रैखिक है। व्यावहारिक रूप से, इसका मतलब है कि यदि आप संख्या को दोगुना करते हैं, तो आप तीव्रता (भूरे रंग की हल्की) को दोगुना करते हैं। यदि आप एक साथ दो तीव्रता जोड़ना चाहते हैं (क्योंकि आप दो प्रकाश स्रोतों के योगदान के आधार पर तीव्रता की गणना कर रहे हैं, या क्योंकि आप एक अपारदर्शी वस्तु के शीर्ष पर एक पारदर्शी वस्तु जोड़ रहे हैं), तो आप इसे जोड़कर ऐसा कर सकते हैं एक साथ दो संख्याएं। यदि आप किसी भी प्रकार की 2 डी मिश्रण या 3 डी छायांकन कर रहे हैं, या लगभग किसी भी छवि प्रसंस्करण कर रहे हैं, तो आप अपनी तीव्रता को रैखिक रंग-स्थान में चाहते हैं , ताकि आप समान प्रभाव डालने के लिए संख्याओं को जोड़, घटाएं, गुणा करें और विभाजित कर सकें तीव्रता पर। अधिकतर रंग-प्रसंस्करण और प्रतिपादन एल्गोरिदम केवल रैखिक आरजीबी के साथ सही परिणाम देते हैं, जब तक कि आप सब कुछ के लिए अतिरिक्त वजन नहीं जोड़ते।

यह वास्तव में आसान लगता है, लेकिन एक समस्या है। प्रकाश की मानव आंख की संवेदनशीलता उच्च तीव्रता की तुलना में कम तीव्रता पर बेहतर है। ऐसा कहने के लिए, यदि आप उन सभी तीव्रताओं की एक सूची बनाते हैं जिन्हें आप अलग कर सकते हैं, तो हल्के से अधिक अंधेरे होते हैं। इसे एक और तरीके से रखने के लिए, आप भूरे रंग के हल्के रंगों के साथ ग्रे के अंधेरे रंगों को बेहतर बता सकते हैं। विशेष रूप से, यदि आप अपनी तीव्रता का प्रतिनिधित्व करने के लिए 8 बिट्स का उपयोग कर रहे हैं, और आप इसे रैखिक रंग-स्थान में करते हैं, तो आप बहुत सारे हल्के रंगों के साथ समाप्त हो जाएंगे, और पर्याप्त अंधेरे रंग नहीं होंगे। आप अपने अंधेरे क्षेत्रों में बैंडिंग प्राप्त करते हैं, जबकि आपके प्रकाश क्षेत्रों में, आप निकट-सफेद के विभिन्न रंगों पर बिट्स बर्बाद कर रहे हैं जो उपयोगकर्ता अलग नहीं बता सकते हैं।

इस समस्या से बचने के लिए, और उन 8 बिट्स का सबसे अच्छा उपयोग करने के लिए, हम एसआरबीबी का उपयोग करते हैं। एसआरबीबी मानक आपको अपने रंगों को गैर-रैखिक बनाने के लिए उपयोग करने के लिए एक वक्र बताता है। वक्र नीचे की ओर उथला होता है, इसलिए आप अधिक अंधेरे ग्रे और शीर्ष पर खड़ी हो सकते हैं, इसलिए आपके पास कम रोशनी होती है। यदि आप संख्या को दोगुना करते हैं, तो आप तीव्रता को दोगुना से अधिक करते हैं। इसका मतलब यह है कि यदि आप एक साथ एसआरबीबी रंग जोड़ते हैं, तो आप इसके परिणामस्वरूप समाप्त होते हैं जो कि हल्का होना चाहिए। इन दिनों, अधिकांश मॉनीटर अपने इनपुट रंगों को एसआरबीबी के रूप में समझते हैं। इसलिए, जब आप स्क्रीन पर रंग डाल रहे हों, या इसे 8-बिट-प्रति-चैनल बनावट में संग्रहीत करते हैं , तो उसे एसआरबीबी के रूप में स्टोर करें , ताकि आप उन 8 बिट्स का सबसे अच्छा उपयोग कर सकें।

आपको पता चलेगा कि अब हमें कोई समस्या है: हम चाहते हैं कि हमारे रंग रैखिक स्थान पर संसाधित हों, लेकिन एसआरबीबी में संग्रहित हों। इसका मतलब है कि आप पढ़ने पर एसआरबीबी-टू-रैखिक रूपांतरण, और लिखने पर रैखिक-से-एसआरबीबी रूपांतरण कर रहे हैं। जैसा कि हमने पहले ही कहा है कि रैखिक 8-बिट तीव्रता में पर्याप्त अंधेरे नहीं हैं, इससे समस्याएं पैदा हो जाएंगी, इसलिए एक और व्यावहारिक नियम है: यदि आप इससे बच सकते हैं तो 8-बिट रैखिक रंगों का उपयोग न करें । इस नियम का पालन करने के लिए परंपरागत हो रहा है कि 8-बिट रंग हमेशा एसआरबीबी होते हैं, इसलिए आप अपने एसआरबीबी-टू-रैखिक रूपांतरण को उसी समय करते हैं जैसे आपकी तीव्रता 8 से 16 बिट्स तक, या पूर्णांक से फ़्लोटिंग-पॉइंट तक; इसी तरह, जब आप अपनी फ्लोटिंग-पॉइंट प्रोसेसिंग समाप्त कर लेते हैं, तो आप उसी समय 8 बिट्स को संकीर्ण करते हैं जैसे एसआरबीबी में कनवर्ट करना। यदि आप इन नियमों का पालन करते हैं, तो आपको गामा सुधार के बारे में चिंता करने की ज़रूरत नहीं है।

जब आप एक एसआरबीबी छवि पढ़ रहे हैं, और आप रैखिक तीव्रता चाहते हैं, तो इस सूत्र को प्रत्येक तीव्रता पर लागू करें:

float s = read_channel();
float linear;
if (s <= 0.04045) linear = s / 12.92;
else linear = pow((s + 0.055) / 1.055, 2.4);

दूसरी तरफ जाकर, जब आप एसआरबीबी के रूप में एक छवि लिखना चाहते हैं, तो इस सूत्र को प्रत्येक रैखिक तीव्रता पर लागू करें:

float linear = do_processing();
float s;
if (linear <= 0.0031308) s = linear * 12.92;
else s = 1.055 * pow(linear, 1.0/2.4) - 0.055; ( Edited: The previous version is -0.55 )

दोनों स्थितियों में, फ़्लोटिंग-पॉइंट का मान 0 से 1 तक होता है, इसलिए यदि आप 8-बिट पूर्णांक पढ़ रहे हैं तो आप पहले 255 तक विभाजित करना चाहते हैं, और यदि आप 8-बिट पूर्णांक लिख रहे हैं तो आप 255 तक गुणा करना चाहते हैं आखिरकार, वही तरीका जो आप आमतौर पर करेंगे। एसआरबीबी के साथ काम करने के लिए आपको बस इतना ही पता होना चाहिए।

अब तक, मैंने केवल एक तीव्रता से निपटाया है, लेकिन रंगों के साथ करने के लिए चतुर चीजें हैं। मानव आंख अलग-अलग चमकों से अलग अलग चमक को बता सकती है (अधिक तकनीकी रूप से, इसमें क्रोमिनेंस की तुलना में बेहतर ल्यूमिनेंस रिज़ॉल्यूशन होता है), ताकि आप टिंट से अलग चमक को संग्रहित करके अपने 24 बिट्स का बेहतर उपयोग कर सकें। यही यूयूवी, वाईसीआरसीबी, आदि प्रस्तुतिकरण करने की कोशिश करता है। वाई चैनल रंग की समग्र हल्काता है, और अन्य दो चैनलों की तुलना में अधिक बिट्स (या अधिक स्थानिक रिज़ॉल्यूशन) का उपयोग करता है। इस तरह, आपको आरजीबी तीव्रता के साथ एक वक्र लागू करने की आवश्यकता नहीं है (हमेशा)। वाईयूवी एक रैखिक रंग-स्थान है, इसलिए यदि आप वाई चैनल में संख्या को दोगुना करते हैं, तो आप रंग की चमक को दोगुना करते हैं, लेकिन आप आरयूजी रंगों के साथ यूयूवी रंगों को एक साथ जोड़ या गुणा नहीं कर सकते हैं, इसलिए इसका उपयोग नहीं किया जाता है छवि प्रसंस्करण, केवल भंडारण और संचरण के लिए।

मुझे लगता है कि आपके प्रश्न का उत्तर दें, इसलिए मैं एक त्वरित ऐतिहासिक नोट के साथ समाप्त हो जाऊंगा। एसआरबीबी से पहले, पुरानी सीआरटी में उनमें एक गैर-रैखिकता थी। यदि आपने पिक्सेल के लिए वोल्टेज को दोगुना कर दिया है, तो आप तीव्रता को दोगुना से अधिक कर देंगे। प्रत्येक मॉनीटर के लिए कितना अलग था, और इस पैरामीटर को गामा कहा जाता था। यह व्यवहार उपयोगी था क्योंकि इसका मतलब था कि आप रोशनी से अधिक अंधेरे प्राप्त कर सकते हैं, लेकिन इसका मतलब यह भी था कि आप यह नहीं बता सकते कि आपके रंग उपयोगकर्ता के सीआरटी पर कितने उज्ज्वल होंगे, जब तक कि आप इसे पहले कैलिब्रेट नहीं करते। गामा सुधार का अर्थ उन रंगों को बदलना है जो आप शुरू करते हैं (शायद रैखिक) और उपयोगकर्ता के सीआरटी की गामा के लिए उन्हें बदलना। ओपनजीएल इस युग से आता है, यही कारण है कि इसका एसआरबीबी व्यवहार कभी-कभी थोड़ा उलझन में होता है। लेकिन जीपीयू विक्रेता अब ऊपर वर्णित सम्मेलन के साथ काम करते हैं: जब आप एक बनावट या फ्रेमबफर में 8-बिट तीव्रता संग्रहित कर रहे हैं, तो यह एसआरबीबी है, और जब आप रंगों को संसाधित कर रहे हैं, तो यह रैखिक है। उदाहरण के लिए, ओपनजीएल ईएस 3.0, प्रत्येक फ्रेमबफर और बनावट में "एसआरबीबी ध्वज" होता है जिसे आप पढ़ना और लिखते समय स्वचालित रूपांतरण सक्षम करने के लिए चालू कर सकते हैं। आपको स्पष्ट रूप से एसआरबीबी रूपांतरण या गामा सुधार करने की आवश्यकता नहीं है।


मैं एक "मानव रंग का पता लगाने विशेषज्ञ" नहीं हूं, लेकिन मैं YUV-> आरजीबी रूपांतरण पर समान चीज़ से मिला हूं। आर / जी / बी चैनलों के लिए अलग-अलग वजन हैं, इसलिए यदि आप एक्स द्वारा स्रोत रंग बदलते हैं, तो आरजीबी मूल्य अलग मात्रा बदलते हैं।

जैसा कि कहा गया है, मैं एक विशेषज्ञ नहीं हूं, वैसे भी, मुझे लगता है, अगर आप कुछ रंग-सही परिवर्तन करना चाहते हैं, तो आपको इसे यूयूवी स्पेस में करना चाहिए, फिर इसे आरजीबी में परिवर्तित करना चाहिए (या आरजीबी पर गणितीय समकक्ष ऑपरेशन करें, सावधान रहें डेटा हानि का)। साथ ही, मुझे यकीन नहीं है कि यूयूवी रंगों का सबसे अच्छा देशी प्रतिनिधित्व है, लेकिन वीडियो कैमरे उस प्रारूप को प्रदान करते हैं, जहां मैं इस मुद्दे को पूरा कर चुका हूं।

गुप्त संख्या के साथ जादू YUV-> आरजीबी फॉर्मूला यहां शामिल है: http://www.fourcc.org/fccyvrgb.php