ما هي أفضل طريقة لحساب متوسط ​​لونين يحددان التدرج الخطي؟

StackOverflow https://stackoverflow.com/questions/649454

  •  19-08-2019
  •  | 
  •  

سؤال

إذا كان لدي لونين محددين بقيم RGB الخاصة بهما، فهل يمكنني حساب متوسط ​​قيم الأحمر والأخضر والأزرق ثم دمجهما لتحديد لون ثالث يبدو كمتوسط ​​مرئي للاثنين؟

أي لون جديد = (R1+R2)/2،(G1+G2)/2،(B1+B2)/2

تحرير 1:شكرا لجميع الردود.بالنسبة لاحتياجاتي الحالية، فأنا أتعامل فقط مع أزواج الألوان التي تكون ظلالًا من نفس اللون، لذا أعتقد أن حساب متوسطها سينجح.ومع ذلك، سأحاول التحويل إلى Lab Space للتأكد من صحة هذا الافتراض وأن التقنية ستكون مفيدة في المستقبل.

تحرير 2:وهنا نتائجي FWIW.Color1 وColor2 هما اللونان الخاصان بي، والعمودان الأوسطان هما نتيجة المتوسط ​​بـ Lأب الفضاء ومتوسط ​​RGB على التوالي.في هذه الحالة لا يوجد فرق كبير بين اللونين وبالتالي فإن الاختلافات في الناتج من تقنيات المتوسط ​​تكون دقيقة.

visual comparison of color averaging techniques

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

المحلول

ألق نظرة على الإجابات على هذا السؤال.

في الأساس، تريد تحويل الألوان إلى شيء يسمى مساحة المختبر, ، والعثور على متوسطها في تلك المساحة.

مساحة المختبر هي طريقة لتمثيل الألوان حيث تكون النقاط القريبة من بعضها البعض هي تلك التي تبدو متشابهة مع بعضها البعض بالنسبة للإنسان.

نصائح أخرى

تقترح العديد من الإجابات التحويل إلى مساحة ألوان Lab - والتي ربما تكون طريقة جيدة لمعالجة الألوان الأكثر تعقيدًا.

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

مثله:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

إليك مقطع فيديو رائع يشرح سبب فعالية هذه الطريقة: https://www.youtube.com/watch?v=LKnqECcg6Gw

المتوسط ​​في مساحة الألوان HSL قد تسفر عن نتائج أفضل.

لا أعرف ما إذا كان أخذ متوسط ​​بسيط للمكونات هو "الأفضل" من وجهة نظر إدراكية (وهذا يبدو وكأنه سؤال لطبيب نفساني)، ولكن إليك بعض الأمثلة باستخدام متوسط ​​المكونات البسيطة.

alt text

الأحمر والخردل والأخضر قبيح ولكن الاستيفاء يبدو معقولا بما فيه الكفاية.

نعم.يمكنك متوسط ​​لونين معًا بهذه الطريقة.إنه الأسلوب الذي يستخدمه OpenGL لمزج الألوان معًا (على سبيل المثال، في إنشاء خرائط mip لعرض الكائنات البعيدة، أو عرض مادة شفافة بنسبة 50٪).إنه سريع وبسيط و"جيد بما فيه الكفاية" للعديد من المواقف.ومع ذلك، فهي ليست واقعية تمامًا، وربما لن يتم استخدامها في الصور ذات جودة الصور الفوتوغرافية.

هذا صعب.أولاً، لا تحدد مجموعة قيم RGB اللون.ويجب تفسيرها في ضوء الألوان الأساسية التي تشير إليها (مساحة اللون)، مثل sRGB، وRec.709، وRec.2020، وAdobe RGB (1998)، وما إلى ذلك.

علاوة على ذلك، فإن قيم RGB كما نواجهها عادةً لا تتناسب مع الضوء الخطي:يتم "تشفيرها" باستخدام دالة غير خطية (جاما).وفي بعض الأحيان (في تطبيقات الفيديو غالبًا) لا تكون قيمة "الأسود" صفرًا، بل يتم إزاحتها من الصفر، وعادةً ما تكون 16 لقيم 8 بت.و"الأبيض" ليس 255 بل 235.يتشارك sRGB وRec.709 في الألوان الأساسية لـ RGB، لكن وظائف جاما الخاصة بهما مختلفة.

يبدأ تحويل مساحة اللون بإزالة أي إزاحة سوداء بحيث يصبح اللون الأسود صفرًا.إذا كانت وظيفة جاما تحتوي على نقطة توقف (مثل sRGB وRec.709)، فسوف تحتاج إلى قياس قيم RGB بعناية بحيث يكون "الأبيض" هو 1.0.

ثم، "فك تشفير" جاما عن طريق إجراء عكس وظيفة جاما الأصلية.(تقترح إحدى الإجابات تربيع القيم، وهو تقريب لفك تشفير جاما.) الآن لديك قيم RGB للضوء الخطي في بعض مساحات الألوان.عند هذه النقطة يمكنك التحويل من مساحة اللون تلك إلى مساحة Lab.تمر معظم التحويلات من RGB إلى Lab عبر مساحة ألوان متوسطة تسمى XYZ.

الخطوات التي تستدعي دالة متداخلة:

Lab = XYZ2Lab(RGB2XYZ(gamma_decode(offset_and_scale(RGB), gammaFunction ), مساحة اللون RGB ) )

(تم تطوير مساحة المختبر في عام 1976 كمحاولة لإنشاء تشويه موحد للإدراك الحسي لمساحة CIE XYZ القياسية.(كانت Luv محاولة أخرى.) الفكرة هي أن المسافة الإقليدية (الخط المستقيم) بين لونين مختلفين بشكل ملحوظ (1 "JND") ستكون نفس المسافة لأي لونين.تُعرف المسافة بين لونين في المختبر باسم "delta-E".تسمى الآن صيغة مسافة دلتا الإقليدية البسيطة dE76.يرى https://en.wikipedia.org/wiki/Color_difference)

في حالتك، يمكنك متوسط ​​لوني Lab للحصول على لون Lab جديد، ثم عكس جميع التحويلات للعودة إلى RGB في مساحة اللون التي اخترتها.

سيقربك هذا، لكنه غير مضمون، وذلك ببساطة لأن "اللون" هو إدراك بشري، وليس كمية فيزيائية، وكان من الصعب للغاية وصفه بشكل موثوق.في الواقع، لم يعمل المختبر بشكل جيد في أن يكون موحدًا من الناحية الإدراكية.لذا بدلًا من إصلاح Lab، اقترحوا دالة delta-E جديدة وأكثر تعقيدًا مع التفاف آخر مدمج:DE94.كان ذلك أفضل، لكنه لم يكن مثاليًا، لذلك ظهر اقتراح آخر في عام 2000:دي2000.أفضل أيضًا ولكن ليس مثاليًا.راجع صفحة Wiki أعلاه لمزيد من المعلومات.

إذا لم يكن DE2000 جيدًا بما فيه الكفاية (أو معقدًا جدًا!) فقد تلقي نظرة على بديل يسمى Lab ICtCp يُزعم أنه أكثر اتساقًا من الناحية الإدراكية من Lab.

أعتقد أن إجابة arntjw تسير في الاتجاه الصحيح، وتتعرف على الأساس اللوغاريتمي، كما ذكر Dan W.ومع ذلك، فإن الوسط الهندسي المناسب ليس sqrt((C1^2+C2^2)/2)، بل sqrt(C1*C2).وبالتالي فإن اللون المتوسط ​​سيكون:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

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

هناك في الواقع طريقة أبسط بكثير.

  • قم بقياس الصورة إلى 1 بكسل × 1 بكسل.

    لون 1 بكسل هو متوسط ​​لون كل ما قمت بقياسه

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