image - आरजीबी रंग की चमक निर्धारित करने के लिए फॉर्मूला




colors rgb (12)

अन्य सभी ने जो कहा, उसे जोड़ने के लिए:

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

गामा में प्रवेश करने और उचित गामा करने के बीच चमकदार अंतर अंधेरे ग्रे में 20% तक है।

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


आर के साथ रंग की चमक निर्धारित करने के लिए, मैं एचजीवी सिस्टम रंग में आरजीबी सिस्टम रंग को परिवर्तित करता हूं।

मेरी लिपि में, मैं अन्य कारणों से पहले हेक्स सिस्टम कोड का उपयोग करता हूं, लेकिन आप आरजीबी 2 rgb2hsv {grDevices} साथ आरजीबी सिस्टम कोड के साथ भी शुरू कर सकते हैं। दस्तावेज here

मेरे कोड का यह हिस्सा यहां दिया गया है:

 sample <- c("#010101", "#303030", "#A6A4A4", "#020202", "#010100")
 hsvc <-rgb2hsv(col2rgb(sample)) # convert HEX to HSV
 value <- as.data.frame(hsvc) # create data.frame
 value <- value[3,] # extract the information of brightness
 order(value) # ordrer the color by brightness

एचएसवी का 'वी' शायद आप जो खोज रहे हैं। MATLAB में एक rgb2hsv फ़ंक्शन है और पहले उद्धृत विकिपीडिया आलेख छद्म कोड से भरा है। यदि कोई आरजीबी 2 एचएसवी रूपांतरण संभव नहीं है, तो छवि का ग्रेस्केल संस्करण कम सटीक मॉडल होगा।


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

एच है ह्यू जो रंग के लिए एक संख्यात्मक मूल्य है (यानी लाल, हरा ...)

एस रंग की संतृप्ति है, यानी यह कितना 'तीव्र' है

वी रंग की 'चमक' है।


क्या आपका मतलब चमक है? अनुमानित चमक? Luminance?

  • ल्यूमिनेंस (कुछ रंग रिक्त स्थान के लिए मानक): (0.2126*R + 0.7152*G + 0.0722*B) [1]
  • ल्यूमिनेंस (माना गया विकल्प 1): (0.299*R + 0.587*G + 0.114*B) [2]
  • ल्यूमिनेंस (माना गया विकल्प 2, गणना करने के लिए धीमा): sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 ) ( @MatthewHerbst के लिए धन्यवाद) [3]

ग्रेस्केल में, ब्राउज़र आदि में उपयोग किए जाने वाले एसआरबीबी छवियों को परिवर्तित करने के लिए नीचे एकमात्र सही एल्गोरिदम है।

आंतरिक उत्पाद की गणना करने से पहले रंग स्थान के लिए गामा फ़ंक्शन के विपरीत को लागू करना आवश्यक है। फिर आप कम मूल्य पर गामा फ़ंक्शन लागू करते हैं। गामा फ़ंक्शन को शामिल करने में विफलता के परिणामस्वरूप 20% तक की त्रुटियां हो सकती हैं।

ठेठ कंप्यूटर सामान के लिए, रंग स्थान एसआरबीबी है। एसआरबीबी के लिए सही संख्या लगभग हैं। 0.21, 0.72, 0.07। एसआरबीबी के लिए गामा एक समग्र कार्य है जो 1 / (2.2) द्वारा एक्सपोनिएशन का अनुमान लगाता है। यहां सी ++ में पूरी बात है।

// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;

// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
    double c = ic/255.0;
    if ( c <= 0.04045 )
        return c/12.92;
    else 
        return pow(((c+0.055)/(1.055)),2.4);
}

// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
    if(v<=0.0031308)
        v *= 12.92;
    else 
        v = 1.055*pow(v,1.0/2.4)-0.055;
    return int(v*255+0.5); // This is correct in C++. Other languages may not
                           // require +0.5
}

// GRAY VALUE ("brightness")
int gray(int r, int g, int b) {
    return gam_sRGB(
            rY*inv_gam_sRGB(r) +
            gY*inv_gam_sRGB(g) +
            bY*inv_gam_sRGB(b)
    );
}

दिलचस्प बात यह है कि आरजीबी => एचएसवी के लिए यह फॉर्मूलेशन सिर्फ वी = MAX3 (आर, जी, बी) का उपयोग करता है। दूसरे शब्दों में, आप अधिकतम (आर, जी, बी) एचएसवी में वी के रूप में उपयोग कर सकते हैं।

मैंने चेक किया और हर्न एंड बेकर के पेज 575 पर इस तरह वे "वैल्यू" की गणना भी करते हैं।


मुझे यह कोड मिला (सी # में लिखा गया) जो रंग की "चमक" की गणना करने का उत्कृष्ट काम करता है। इस परिदृश्य में, कोड यह निर्धारित करने की कोशिश कर रहा है कि रंग पर सफेद या काला पाठ डालना है या नहीं।


मुझे लगता है कि आप जो खोज रहे हैं वह आरजीबी -> Luma रूपांतरण फॉर्मूला है।

फोटोमेट्रिक / डिजिटल आईटीयू बीटी 7070 :

Y = 0.2126 R + 0.7152 G + 0.0722 B

डिजिटल आईटीयू बीटी 601 (आर और बी घटकों को अधिक वजन देता है):

Y = 0.299 R + 0.587 G + 0.114 B

यदि आप परफॉर्मेंस के लिए सटीकता का व्यापार करने के इच्छुक हैं, तो इसके लिए दो अनुमानित सूत्र हैं:

Y = 0.33 R + 0.5 G + 0.16 B

Y = 0.375 R + 0.5 G + 0.125 B

इनकी गणना जल्दी ही की जा सकती है

Y = (R+R+B+G+G+G)/6

Y = (R+R+R+B+G+G+G+G)>>3

मैंने स्वीकृत उत्तर में तीन एल्गोरिदम की तुलना की है। मैंने चक्र में रंग उत्पन्न किए जहां केवल हर 400 वें रंग का इस्तेमाल किया गया था। प्रत्येक रंग को 2x2 पिक्सेल द्वारा दर्शाया जाता है, रंगों को सबसे हल्के से हल्के (बाएं से दाएं, ऊपर से नीचे तक) क्रमबद्ध किया जाता है।

पहली तस्वीर - [1]

0.2126 * R + 0.7152 * G + 0.0722 * B

दूसरी तस्वीर - [2]

0.299 * R + 0.587 * G + 0.114 * B

तीसरी तस्वीर - [3]

sqrt(0.299 * R^2 + 0.587 * G^2 + 0.114 * B^2)

चौथी तस्वीर - डब्ल्यूसीएजी 2.0 एससी 1.4.3 सापेक्ष चमक और विपरीत अनुपात सूत्र (देखें @Synchro's जवाब)

एक पंक्ति में रंगों की संख्या के आधार पर कभी-कभी पैटर्न को पहली और दूसरी तस्वीर पर देखा जा सकता है। मैंने कभी तीसरे या चौथे एल्गोरिदम से चित्र पर कोई पैटर्न नहीं देखा।

अगर मुझे चुनना पड़ा कि मैं एल्गोरिदम नंबर 3 के साथ जाऊंगा क्योंकि इसे कार्यान्वित करना बहुत आसान है और यह चौथाई से 33% तेज है।


यहां वर्णित सूत्रों के यादृच्छिक चयन के बीच खोने की बजाय, मेरा सुझाव है कि आप डब्ल्यू 3 सी मानकों द्वारा अनुशंसित सूत्र के लिए जाएं।

डब्ल्यूसीएजी 2.0 एससी 1.4.3 रिश्तेदार ल्यूमिनेंस और कंट्रास्ट अनुपात सूत्रों का एक सीधा लेकिन सटीक PHP कार्यान्वयन यहां दिया गया है। यह उन मानों का उत्पादन करता है जो इस पृष्ठ पर डब्ल्यूसीएजी अनुपालन के लिए आवश्यक अनुपात का मूल्यांकन करने के लिए उपयुक्त हैं, और इस तरह के किसी भी वेब ऐप के लिए उपयुक्त और उचित है। यह अन्य भाषाओं के लिए बंदरगाह के लिए तुच्छ है।

/**
 * Calculate relative luminance in sRGB colour space for use in WCAG 2.0 compliance
 * @link http://www.w3.org/TR/WCAG20/#relativeluminancedef
 * @param string $col A 3 or 6-digit hex colour string
 * @return float
 * @author Marcus Bointon <[email protected]>
 */
function relativeluminance($col) {
    //Remove any leading #
    $col = trim($col, '#');
    //Convert 3-digit to 6-digit
    if (strlen($col) == 3) {
        $col = $col[0] . $col[0] . $col[1] . $col[1] . $col[2] . $col[2];
    }
    //Convert hex to 0-1 scale
    $components = array(
        'r' => hexdec(substr($col, 0, 2)) / 255,
        'g' => hexdec(substr($col, 2, 2)) / 255,
        'b' => hexdec(substr($col, 4, 2)) / 255
    );
    //Correct for sRGB
    foreach($components as $c => $v) {
        if ($v <= 0.03928) {
            $components[$c] = $v / 12.92;
        } else {
            $components[$c] = pow((($v + 0.055) / 1.055), 2.4);
        }
    }
    //Calculate relative luminance using ITU-R BT. 709 coefficients
    return ($components['r'] * 0.2126) + ($components['g'] * 0.7152) + ($components['b'] * 0.0722);
}

/**
 * Calculate contrast ratio acording to WCAG 2.0 formula
 * Will return a value between 1 (no contrast) and 21 (max contrast)
 * @link http://www.w3.org/TR/WCAG20/#contrast-ratiodef
 * @param string $c1 A 3 or 6-digit hex colour string
 * @param string $c2 A 3 or 6-digit hex colour string
 * @return float
 * @author Marcus Bointon <[email protected]>
 */
function contrastratio($c1, $c2) {
    $y1 = relativeluminance($c1);
    $y2 = relativeluminance($c2);
    //Arrange so $y1 is lightest
    if ($y1 < $y2) {
        $y3 = $y1;
        $y1 = $y2;
        $y2 = $y3;
    }
    return ($y1 + 0.05) / ($y2 + 0.05);
}

स्पष्टता के लिए, वर्ग रूट का उपयोग करने वाले सूत्र होने की आवश्यकता है

sqrt(coefficient * (colour_value^2)

नहीं

sqrt((coefficient * colour_value)^2

इसका सबूत आर = जी = बी त्रिभुज को ग्रेस्केल आर के रूपांतरण में निहित है। यह केवल तभी सही होगा जब आप रंग मान को स्क्वायर करते हैं, न कि रंग मान समय गुणांक। Greyscale के नौ रंग देखें







rgb