سؤال

أنا أبحث عن نوع من الصيغة أو خوارزمية لتحديد سطوع اللون نظرا قيم RGB.أعلم أنه لا يمكن أن تكون بسيطة مثل إضافة قيم RGB معا وجود مبالغ أعلى يكون أكثر إشراقا, ولكن أنا في حيرة من أين تبدأ.

هل كانت مفيدة؟

المحلول

هل تقصد السطوع؟ السطوع المتصور؟ الانارة؟

  • النصوع (قياسي لبعض المساحات الملونة): (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]

نصائح أخرى

أعتقد أن ما تبحث عنه هو RGB -> لوما صيغة التحويل.

الضوئية / الرقمية ITU BT.709.:

Y = 0.2126 R + 0.7152 G + 0.0722 B

الرقمية ITU BT.601. (يعطي المزيد من الوزن إلى مكونات R و B):

Y = 0.299 R + 0.587 G + 0.114 B

إذا كنت على استعداد لتداول الدقة ل Berfomance، فهناك صيغة تقريبان لهذا واحد:

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 فقط. يتم تمثيل كل لون بمقدار 2 × 2 بكسل، يتم فرز الألوان من أحلك إلى أخف (يسار إلى اليمين، أعلى إلى أسفل).

1st الصورة - النصوع (قريب)

0.2126 * R + 0.7152 * G + 0.0722 * B

الصورة الثانية - http://www.w3.org/tr/aert#color-contrast.

0.299 * R + 0.587 * G + 0.114 * B

الصورة الثالثة - نموذج لون HSP

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

الصورة الرابعة - WCAG 2.0 SC 1.4.3 النصوع النسبي و نسبة التباين الصيغة (انظر @ synchro إجابه هنا)

يمكن أن يتم رصد نمط في بعض الأحيان على الصورة الأولى والثانية اعتمادا على عدد الألوان في صف واحد. لم أكن أبدا أي نمط على الصورة من الخوارزمية الثالثة أو الرابعة.

إذا اضطررت إلى اختيار أود أن أذهب مع الخوارزمية رقم 3 منذ أسهل بكثير لتنفيذها و 33٪ أسرع من الرابع.

Perceived brightness algorithm comparison

فيما يلي الخوارزمية الصحيحة الوحيدة لتحويل صور SRGB، كما هو مستخدم في المتصفحات وما إلى ذلك، إلى Grayscale.

من الضروري تطبيق عكس وظيفة GAMMA للمساحة الملونة قبل حساب المنتج الداخلي. ثم تقوم بتطبيق وظيفة GAMMA على القيمة المخفضة. يمكن أن يؤدي الفشل في دمج وظيفة GAMMA إلى أخطاء تصل إلى 20٪.

لأشياء الكمبيوتر النموذجية، مساحة اللون هي SRGB. الأرقام الصحيحة ل SRGB هي تقريبا. 0.21، 0.72، 0.07. Gamma for SRGB هي وظيفة مركبة تقارب للأسف بنسبة 1 / (2.2). هنا هو كل شيء في C ++.

// 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)
    );
}

ومن المثير للاهتمام، هذه الصيغة ل RGB => HSV فقط يستخدم v = max3 (r، g، b). بمعنى آخر، يمكنك استخدام أقصى من (ص، g، ب) باعتباره الخامس في HSV.

راجعت وفي الصفحة 575 من hearn & baker. هذه هي الطريقة التي تحسب "القيمة" أيضا.

From Hearn&Baker pg 319

وجدت هذا الرمز (مكتوبة في C #) التي تقوم بعمل ممتاز لحساب "سطوع" اللون. في هذا السيناريو، يحاول الرمز تحديد ما إذا كنت تريد وضع نص أبيض أو أسود على اللون.

لإضافة كل ما قاله الآخرون:

كل هذه المعادلات العمل نوعا جيدا من الناحية العملية ، ولكن إذا كنت تحتاج إلى أن تكون دقيقة جدا يجب عليك أولا تحويل اللون إلى لون خطي الفضاء (تطبيق معكوس صورة-غاما), هل وزن المتوسط من الألوان الأساسية و - إذا كنت ترغب في عرض الألوان اتخاذ الإنارة مرة أخرى إلى مراقبة غاما.

الإنارة الفرق بين ingnoring غاما والقيام السليم جاما يصل إلى 20% في رمادية داكنة.

بدلا من الضياع بين الاختيار العشوائي للصيغ المذكورة هنا، أقترح عليك أن تذهب للصيغة الموصى بها مع معايير W3C.

إليك تطبيق PHP واضح ولكن الدقيق لل WCAG 2.0 SC 1.4.3 النصوع النسبي و نسبة التباين الصيغ. وتنتج القيم المناسبة لتقييم النسب المطلوبة لامتثال WCAG، كما هو الحال هذه الصفحة, وعلى هذا النحو مناسب ومناسب لأي تطبيق ويب. هذا تافهة إلى ميناء لغات أخرى.

/**
 * 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 <marcus@synchromedia.co.uk>
 */
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 <marcus@synchromedia.co.uk>
 */
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);
}

الجواب "المقبول" غير صحيح وغير مكتمل

الإجابات الوحيدة التي هي دقيقة هي @ جيف دالسون و @ eddingtonsmonkey. الإجابات، ودعم @ nils-pipenbrinck. وبعد الإجابات الأخرى (بما في ذلك المقبول) ترتبط أو نقلا عن مصادر إما خاطئة أو غير ذات صلة أو عفا عليها الزمن أو مكسورة.

موجز:

  • يجب أن يكون SRGB. snearized. قبل تطبيق المعاملات.
  • النصوع (L أو Y) هو خطي كما هو الضوء.
  • الخفة المتصورة (L *) غير الخطية كما هو الإدراك البشري.
  • HSV و HSL ليست دقيقة حتى عن بعد من حيث التصور.
  • يحدد معيار IEC ل SRGB عتبة 0.04045 ليس 0.03928 (كان ذلك من مشروع مبكر قديم).
  • يكون مفيدا (أي النسبي للإدراك), ، تتطلب مسافات Euclidian مساحة متجهية ميكرانية موحدة للغاية مثل Cielab. SRGB ليس واحدا.

ما يلي هو إجابة صحيحة وكاملة:

لأن هذا الخيط يبدو كبيرا في محركات البحث، فأنا أضيف هذه الإجابة لتوضيح المفاهيم الخاطئة المختلفة حول هذا الموضوع.

سطوع هي سمة إدراكية، لا يكون لها تدبير مباشر.

Lightness يقاس من قبل بعض نماذج الرؤية مثل cielab، وهنا l * (lstar) هو مقياس ل الخفة الحديثة, ، وهو غير خطي لتقريب منحنى الرؤية البشرية غير الخطية المنحنى.

الانارة هو مقياس خطي للضوء، مرجح للغاية للرؤية العادية ولكن لم يتم تعديله بسبب التصور غير الخطي للخفة.

لوما (Y' PRIME) هي إشارة مشفرة غاما، تستخدم في بعض ترميزات الفيديو. لا ينبغي الخلط بينها مع الإنارة الخطية.

غاما أو منحنى النقل (TRC) هو منحنى غالبا ما يشبه المنحنى الإدراكي، ويتم تطبيقه بشكل شائع على بيانات الصورة للتخزين أو البث لتقليل الضوضاء المتصورة و / أو تحسين استخدام البيانات (والأسباب ذات الصلة).

لتحديد الخفة المتصورة, ، أولا تحويل جاما تشفير قيم صورة r'g'b للإصبع الخطي (L أو Y ) ثم إلى Lightness غير الخطية المتصورة (L*)


للعثور على النصوع:

... لأنه يبدو أنه فقدت في مكان ما ...

الخطوةالاولى:

تحويل جميع القيم الصحيحة SRGB 8 بت إلى عشري 0.0-1.0

  vR = sR / 255;
  vG = sG / 255;
  vB = sB / 255;

الخطوة الثانية:

تحويل جاما تشفير RGB إلى قيمة خطية. يتطلب SRGB (معيار الكمبيوتر) على سبيل المثال منحنى طاقة تقريبا v ^ 2.2، على الرغم من التحويل "الدقيق" هو:

sRGB to Linear

حيث V'هو قناة R، G، أو B قناة SRGB.
كود مزيف:

function sRGBtoLin(colorChannel) {
        // Send this function a decimal sRGB gamma encoded color value
        // between 0.0 and 1.0, and it returns a linearized value.

    if ( colorChannel <= 0.04045 ) {
            return colorChannel / 12.92;
        } else {
            return pow((( colorChannel + 0.055)/1.055),2.4));
        }
    }

الخطوة الثالثة:

للعثور على النصوع (Y) تطبيق المعاملات القياسية ل SRGB:

Apply coefficients Y = R * 0.2126 + G * 0.7152 + B *  0.0722

pseudocode باستخدام الوظائف أعلاه:

Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))

للعثور على الخفة المتصورة:

الخطوة الرابعة:

خذ الإنارة ذ من الأعلى، وتحول إلى L *

L* from Y equation
كود مزيف:

function YtoLstar(Y) {
        // Send this function a luminance value between 0.0 and 1.0,
        // and it returns L* which is "perceptual lightness"

    if ( Y <= (216/24389) {       // The CIE standard states 0.008856 but 216/24389 is the intent for 0.008856451679036
            return Y * (24389/27);  // The CIE standard states 903.3, but 24389/27 is the intent, making 903.296296296296296
        } else {
            return pow(Y,(1/3)) * 116 - 16;
        }
    }

L * هي قيمة من 0 (أسود) إلى 100 (أبيض) حيث 50 هو "الرمادي الأوسط" الإدراكي. L * = 50 هو ما يعادل y = 18.4، أو بمعنى آخر بطاقة رمادية بنسبة 18٪، تمثل منتصف التعرض التصويري (منطقة أنسل آدمز الخامس).

مراجع:

IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
تشارلز بوياتي جاما أسئلة وأجوبة

يجب أن تفعل Colorspace HSV الخدعة، راجع ويكيبيديا المادة اعتمادا على اللغة التي تعمل فيها، قد تحصل على تحويل مكتبة.

H هو هوى وهو قيمة رقمية للون (أي الأحمر والأخضر ...)

S هو تشبع اللون، أي كيف "المكثف" هو

الخامس هو "سطوع" اللون.

قيمة الإنارة RGB = 0.3 ص + 0.59 جم + 0.11 ب

http://www.scantips.com/lumin.html.

إذا كنت تبحث عن مدى قريبة من اللون الأبيض، فيمكنك استخدام المسافة Euclidean من (255، 255، 255)

أعتقد أن مساحة ألوان RGB غير موحدة إدراك فيما يتعلق بمسافة L2 Euclidian. تشمل مساحات موحدة مختبر CIE و LUV.

يحتاج صيغة Gamma العكسية بواسطة Jive Dadson إلى إزالتها نصف الضبط عند تنفيذها في JavaScript، أي عودة من الوظيفة Gam_srgb تحتاج إلى عودة Int (V * 255)؛ عدم إرجاع int (v * 255 + .5)؛ نصف ضبط جولات، وهذا يمكن أن يسبب قيمة واحدة مرتفعة للغاية على R = G = B IE اللون الرمادي TRIAD. تحول Greyscale على R = G = B TRIAD يجب أن تنتج قيمة مساوية ل R؛ إنه دليل واحد على أن الصيغة صالحة. يرى تسعة ظلال من greyscale بالنسبة للصيغة في العمل (بدون نصف الضبط).

إليك القليل من كود C الذي يجب حساب النصوع الوصي بشكل صحيح.

// reverses the rgb gamma
#define inverseGamma(t) (((t) <= 0.0404482362771076) ? ((t)/12.92) : pow(((t) + 0.055)/1.055, 2.4))

//CIE L*a*b* f function (used to convert XYZ to L*a*b*)  http://en.wikipedia.org/wiki/Lab_color_space
#define LABF(t) ((t >= 8.85645167903563082e-3) ? powf(t,0.333333333333333) : (841.0/108.0)*(t) + (4.0/29.0))


float
rgbToCIEL(PIXEL p)
{
   float y;
   float r=p.r/255.0;
   float g=p.g/255.0;
   float b=p.b/255.0;

   r=inverseGamma(r);
   g=inverseGamma(g);
   b=inverseGamma(b);

   //Observer = 2°, Illuminant = D65 
   y = 0.2125862307855955516*r + 0.7151703037034108499*g + 0.07220049864333622685*b;

   // At this point we've done RGBtoXYZ now do XYZ to Lab

   // y /= WHITEPOINT_Y; The white point for y in D65 is 1.0

    y = LABF(y);

   /* This is the "normal conversion which produces values scaled to 100
    Lab.L = 116.0*y - 16.0;
   */
   return(1.16*y - 0.16); // return values for 0.0 >=L <=1.0
}

أتساءل كيف تم تحديد هؤلاء معاملات RGB. لقد قمت بتجربة نفسي انتهى بي الأمر بما يلي:

Y = 0.267 R + 0.642 G + 0.091 B

أغلق ولكن من الواضح أنه مختلف عن معاملات الاتحاد القديمة القائمة. أتساءل عما إذا كانت هذه المعاملات قد تكون مختلفة عن كل مراقب، لأننا جميعا قد يكون لدينا كمية مختلفة من المخاريط والقضبان على شبكية العين في أعيننا، وخاصة النسبة بين الأنواع المختلفة من المخاريط قد تختلف.

كمرجع:

ITU BT.709:

Y = 0.2126 R + 0.7152 G + 0.0722 B

ITU BT.601:

Y = 0.299 R + 0.587 G + 0.114 B

لقد قمت بالاختبار بسرعة نقل شريط رمادي صغير على خلفية زرقاء حمراء ومشرقة مشرقة، وضبط الرمادي حتى يمزج بنفس قدر الإمكان. وأكررت أيضا أن الاختبار مع ظلال أخرى. كررت الاختبار على شاشات مختلفة، حتى واحدة مع عامل غاما ثابت من 3.0، ولكن كل شيء يبدو نفسه بالنسبة لي. أكثر من ذلك، معاملات الاتحاد حرفيا مخطئ عيني.

ونعم، من المفترض أن يكون لدي رؤية ألوان طبيعية.

يرجى تحديد السطوع. إذا كنت تبحث عن مدى قريبة من اللون الأبيض، فيمكنك استخدامه المسافة الإقليدية من (255، 255، 255)

ربما "V" من HSV هو ما تبحث عنه. MATLAB لديه وظيفة RGB2HSV ومقالة ويكيبيديا التي تم الاقتباس سابقا مليئة بالأشعة الكفاءة. إذا كان التحويل RGB2HSV غير ممكن، فسيكون نموذج أقل دقة إصدار الرمادي من الصورة.

هذا الرابط يوضح كل شيء في العمق، بما في ذلك سبب وجود ثوابت المضاعف هذه قبل قيم R و G و B.

تحرير: لديه تفسير لأحد الإجابات هنا أيضا (0.299 * R + 0.587 * G + 0.114 * B)

لتحديد سطوع اللون مع R، قمت بتحويل لون نظام RGB في لون نظام HSV.

في البرنامج النصي، يمكنني استخدام رمز نظام HEX قبل لسبب آخر، ولكن يمكنك البدء أيضا مع رمز نظام RGB مع rgb2hsv {grDevices}. وبعد الوثائق هي هنا.

هنا هذا الجزء من التعليمات البرمجية الخاصة بي:

 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

بالنسبة للوضوح، يجب أن تكون الصيغ التي تستخدم جذر مربع

sqrt(coefficient * (colour_value^2))

ليس

sqrt((coefficient * colour_value))^2

دليل على هذا يكمن في تحويل R = G = B TRIAD إلى Greyscale R. الذي سيكون صحيحا فقط إذا قمت بمربع قيمة اللون، وليس معامل أوقات قيمة اللون. يرى تسعة ظلال من greyscale

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top