आरजीबी को ग्रेस्केल / तीव्रता में परिवर्तित करना


129

आरजीबी से ग्रेस्केल में परिवर्तित करते समय, यह कहा जाता है कि चैनल आर, जी और बी के लिए विशिष्ट वजन लागू किया जाना चाहिए। ये भार हैं: 0.2989, 0.5870, 0.1140।

ऐसा कहा जाता है कि इसका कारण इन तीन रंगों के प्रति अलग-अलग मानवीय धारणा / संवेदनशीलता है। कभी-कभी यह भी कहा जाता है कि ये NTSC सिग्नल की गणना करने के लिए उपयोग किए जाने वाले मान हैं।

हालाँकि, मुझे वेब पर इसके लिए एक अच्छा संदर्भ नहीं मिला। इन मूल्यों का स्रोत क्या है?

इन पिछले प्रश्नों को भी देखें: यहाँ और यहाँ


26
हाँ यह करता है। मैं हर समय आरजीबी मूल्यों पर प्रोग्रामिंग करता हूं। इन गणनाओं के लिए "वास्तविक दुनिया" मूल्यों को लागू करना बहुत महत्वपूर्ण है यदि आप चाहते हैं कि आपका ऐप इसके नमक के लायक हो।
नील एन

1
कई प्रोग्रामर "गलत" ग्रेस्केल चित्रों की देखभाल और गणना नहीं कर सकते हैं, लेकिन मैं करता हूं।
ypnos

6
यदि आप ग्राफिक्स कोडिंग कर रहे हैं तो मैं सहमत हूँ कि यह संबंधित - विशेष रूप से एक दिलचस्प और प्रासंगिक समस्या है। +1 जैसा कि मैं स्वयं इसका उत्तर जानना चाहता हूँ
क्रुचचन

6
आरजीबी है संबंधित प्रोग्रामिंग। यह प्रोग्रामिंग से संबंधित है जैसे पार्सिंग डेट स्ट्रिंग्स। पाठ "सत्य" को बूलियन मान में परिवर्तित करने के रूप में।
नील एन

जवाबों:


87

प्रश्न में विशिष्ट संख्या CCIR 601 (नीचे विकिपीडिया लिंक देखें) से है।

यदि आप RGB -> ग्रेस्केल को थोड़े अलग नंबरों / अलग-अलग तरीकों से परिवर्तित करते हैं, तो आपको सामान्य कंप्यूटर स्क्रीन पर सामान्य प्रकाश व्यवस्था की स्थितियों में बहुत अंतर नहीं दिखेगा - इसे आज़माएं।

यहाँ सामान्य रूप से रंग पर कुछ और लिंक दिए गए हैं:

विकिपीडिया लुमा

ब्रूस लिंडब्लूम की उत्कृष्ट वेब साइट

कॉलिन वेयर द्वारा किताब में रंग पर अध्याय 4, "सूचना विज़ुअलाइज़ेशन", isbn 1-55860-819-2; Ware to books.google.com का यह लंबा लिंक काम नहीं कर सकता है या नहीं

कैम्ब्रिजइन्कोलर : उत्कृष्ट, अच्छी तरह से लिखा "ट्यूटोरियल कैसे प्राप्त करें, व्याख्या करें और एक नेत्रहीन उन्मुख दृष्टिकोण का उपयोग करके डिजिटल तस्वीरों की प्रक्रिया करें, जो प्रक्रिया पर अवधारणा पर जोर देती है"

क्या आपको "रैखिक" बनाम "नॉनलाइनर" आरजीबी में चलना चाहिए, यहां एक पुराने नोट का हिस्सा इस पर खुद को देना है। दोहराएं, व्यवहार में आपको बहुत अंतर नहीं दिखेगा।


RGB -> ^ गामा -> Y -> L *

रंग विज्ञान में, html rgb (10%, 20%, 30%) के रूप में सामान्य RGB मानों को "नॉनलाइनर" या गामा सही कहा जाता है । "रैखिक" मानों के रूप में परिभाषित किया गया है

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

जहां गामा कई पीसी के लिए 2.2 है। सामान्य आरजीबी को कभी-कभी R 'G' B '(R' = Rlin ^ (1 / गामा)) (शुद्धतावादी जीभ-क्लिक) के रूप में लिखा जाता है, लेकिन यहां मैं 'छोड़ दूंगा'।

CRT डिस्प्ले पर चमक RGBlin = RGB ^ गामा के समानुपाती होती है, इसलिए CRT पर 50% ग्रे काफी गहरा होता है ।5 ^ 2.2 = 22% अधिकतम चमक। (एलसीडी डिस्प्ले अधिक जटिल हैं; इसके अलावा, कुछ ग्राफिक्स कार्ड गामा के लिए क्षतिपूर्ति करते हैं।)

L*RGB से बुलाई गई लपट का माप प्राप्त करने के लिए , पहले RGB को 255 से विभाजित करें, और गणना करें

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

यह YXYZ रंग अंतरिक्ष में है; यह रंग "ल्यूमिनेंस" का एक माप है। (वास्तविक सूत्र बिल्कुल x ^ गामा नहीं हैं, लेकिन करीब; x ^ गामा के साथ पहले पास के लिए छड़ी।)

आखिरकार,

L* = 116 * Y ^ 1/3 - 16

"... अवधारणात्मक एकरूपता की आकांक्षा [और] बारीकी से हल्केपन की मानवीय धारणा से मेल खाती है।" - विकिपीडिया लैब रंग स्थान


8
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B - विकिपीडिया ( en.wikipedia.org/wiki/Grayscale )
iamantony

14

मैंने पाया कि इस प्रकाशन ने पिछले समान प्रश्न के उत्तर में संदर्भित किया था। यह बहुत ही उपयोगी है:

http://cadik.posvete.cz/color_to_gray_evaluation/

यह विभिन्न परिणामों के साथ स्केल छवियों को उत्पन्न करने के लिए विभिन्न तरीकों का 'टन' दिखाता है!


9

Rgb को ग्रेस्केल में बदलने के लिए सी में कुछ कोड का उपयोग करता है। आरजीबी से ग्रेस्केल रूपांतरण के लिए उपयोग किया जाने वाला वास्तविक भारांक 0.3R + 0.6G + 0.11B है। ये भार पूरी तरह से महत्वपूर्ण हैं ताकि आप उनके साथ खेल सकें। मैंने उन्हें 0.25R + 0.5G + 0.25B बनाया है। यह थोड़ा गहरा चित्र बनाता है।

नोट: निम्न कोड xRGB 32 बिट पिक्सेल प्रारूप मानता है

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>16);
            g=(fourBytes>>8);
            b=fourBytes;

            I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
            //I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
        }

2
0.3 0.6 0.11 को जोड़ नहीं है। विकिपीडिया 0.30 0.59 0.11 का सुझाव देता है।
डेमिक्स

सच है, लेकिन उनमें से केवल 1 को जोड़ने का परिणाम तीव्रता में बहुत मामूली बदलाव नहीं होगा। 0.25,0.5,0.25 का प्रस्तावित तरीका 1 में जोड़ता है, लेकिन अगर यह नहीं होता है। यह एक अनुकूलन है इसलिए सटीकता का एक छोटा सा हिस्सा देना एक उचित व्यापार है।
Twerdster

2
@twerdster न तो गुणांक के सेट सही हैं। .3, .6, .11 पुराना Ntsc मानक है, न कि sRGB / Rec709 (जो कि वेब और अधिकांश कंप्यूटरों में है)। और आपका 0.25,0.5,0.25 एक उचित ट्रेडऑफ नहीं है - बी केवल 7% ल्यूमिनेन्स है, आप 347% से गलत हैं। SRGB / r709 (रैखिककरण के बाद) के लिए गुणांक: रलाइन * 0.2126 + ग्लिन * 0.7152 + ब्लिन * 0.0722 = वाई ये वर्णक्रमीय भार मानव स्पेक्ट्रल धारणा से प्राप्त होते हैं। सुविधा के लिए और सटीक होने की उम्मीद में आप जो भी संख्या चाहते हैं, उसमें सिर्फ जाम नहीं कर सकते। आपको sRGB को रैखिक बनाने और फिर सही गुणांक लागू करने की आवश्यकता है।
माईंडेक्स

यदि आप ऐसी स्थिति में हैं जहां विभाजन बहुत महंगा है, तो एक सन्निकटन जो बदलाव के साथ एक एकल का उपयोग करता है और जोड़ता है 0.11111111 * ((G + (G<<1) + R) <<1) + B):। यह (2*R+6*G+B) / 9)या के बराबर है 0.222 R + 0.666 G + 0.111 B। उत्पादन में जाने से पहले, विभिन्न परीक्षण मामलों के लिए एक सटीक सूत्र की तुलना करें।
टूलमेकरसेव


6

की जाँच करें रंग पूछे जाने वाले प्रश्न इस बारे में जानकारी के लिए। ये मान RGB मानों के मानकीकरण से आते हैं जिनका उपयोग हम अपने डिस्प्ले में करते हैं। दरअसल, कलर एफएक्यू के अनुसार, आपके द्वारा उपयोग किए जा रहे मान पुराने हैं, क्योंकि वे मूल NTSC मानक के लिए उपयोग किए जाने वाले मान हैं और आधुनिक मॉनिटर नहीं हैं।


3

इन मूल्यों का स्रोत क्या है?

पोस्ट किए गए गुणांकों के "स्रोत" एनटीएससी विनिर्देश हैं जो Rec601 और टेलीविजन के लक्षण में देखे जा सकते हैं ।

"अंतिम स्रोत" मानव रंग धारणा पर CIE लगभग 1931 प्रयोग हैं। मानव दृष्टि की वर्णक्रमीय प्रतिक्रिया एक समान नहीं है। प्रयोगों ने धारणा के आधार पर ट्रिस्टिमुलस मूल्यों का भार उठाया। हमारे एल, एम, और एस शंकु 1 प्रकाश तरंग दैर्ध्य के प्रति संवेदनशील हैं जिन्हें हम "रेड", "ग्रीन" और "ब्लू" (क्रमशः) के रूप में पहचानते हैं, जो कि ट्रिस्टिमुलस प्राथमिक रंग हैं।2

SRGB (और Rec709) के लिए रैखिक प्रकाश 3 वर्णक्रमीय भार हैं:

आर लिन * 0.2126 + जी लिन * 0.7152 + बी लिन * 0.0722 = वाई

ये sRGB और rec709 colorspaces है, जो कंप्यूटर मॉनिटर (sRGB) या HDTV मॉनिटर (Rec709) का प्रतिनिधित्व करने का इरादा कर रहे हैं के लिए विशिष्ट हैं, और के लिए आईटीयू दस्तावेजों में विस्तार से बताया गया Rec709 और भी BT.2380-2 (10/2018)

जूते (1) शंकु आंख के रेटिना की रंग का पता लगाने वाली कोशिकाएं हैं।
(२) हालाँकि, चुने हुए ट्रिस्टिमुलस तरंगदैर्ध्य प्रत्येक शंकु प्रकार के "शिखर" पर नहीं होते हैं - इसके बजाय ट्रिस्टिमुलस मानों को इस तरह चुना जाता है कि वे विशेष शंकु प्रकार पर एक दूसरे की तुलना में अधिक अर्थात् उत्तेजना को अलग करते हुए उत्तेजित करते हैं।
(3) गुणांकों को लागू करने से पहले आपको अपने sRGB मूल्यों को रैखिक बनाना होगा। मैं यहां एक अन्य उत्तर में इस पर चर्चा करता हूं


-2

ये मान एक व्यक्ति से दूसरे व्यक्ति में भिन्न होते हैं, खासकर ऐसे लोगों के लिए जो कलरब्लाइंड होते हैं।


-4

क्या यह सब वास्तव में आवश्यक है, मानवीय धारणा और सीआरटी बनाम एलसीडी अलग-अलग होंगे, लेकिन आरजीबी की तीव्रता L = (R + G + B)/3एल, एल, एल के लिए नया आरजीबी क्यों नहीं और क्यों निर्धारित करती है?


3
बस तीनों आर, जी, बी प्राइमरी से औसतन उन्हें अवधारणात्मक रूप से समान माना जाता है, जो मानव दृष्टि प्रणाली के लिए ऐसा नहीं है।
बिल फथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.