تحويل درجة حرارة اللون (K) إلى RGB: مثال الخوارزمية والرمز



إذا كنت لا تعرف درجة حرارة اللون ، فابدأ من هنا .

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


مثال لشاشة الكاميرا بإعداد توازن اللون الأبيض. المصدر

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

لسوء الحظ ، لا يوفر هذا النهج صيغة رياضية بحتة - إنه ببساطة استيفاء وفقًا لجدول التحويل. قد يكون هذا معقولًا في ظل ظروف معينة ، ولكن إذا أخذت في الاعتبار التحويل الإضافي XYZ → RGB ، فإنه يصبح بطيئًا جدًا لتعديل بسيط لدرجة حرارة اللون في الوقت الفعلي.

لذلك كتبت خوارزمي الخاص ، وهي تعمل بشكل جيد. هكذا حصلت عليه.

تحذيرات بخصوص هذه الخوارزمية


تحذير 1 : توفر الخوارزمية تقريبيًا عالي الجودة ، ولكنها ليست دقيقة بما يكفي للاستخدام العلمي الجاد. الغرض منه هو في المقام الأول لمعالجة الصور - لذلك لا تحاول استخدامها لعلم الفلك أو في الطب.

تحذير 2 : نظرًا لبساطتها النسبية ، فإن هذه الخوارزمية سريعة بما يكفي للعمل في الوقت الفعلي على صور ذات حجم معقول (اختبرتها على صور بدقة 12 ميجابكسل) ، ولكن للحصول على أفضل النتائج ، استخدم تحسينات رياضية خاصة بلغة البرمجة الخاصة بك. أعرض الخوارزمية بدون تحسينات رياضية حتى لا أعقدها.

تحذير 3 : الخوارزمية للاستخدام فقط في النطاق من 1000 كلفن إلى 40000 كلفن ، وهي مجموعة جيدة للتصوير الفوتوغرافي. (في الواقع ، إنه أكبر بكثير مما قد يكون مطلوبًا في معظم الحالات). على الرغم من أنه يعمل لدرجات الحرارة خارج هذا النطاق ، إلا أن الجودة ستنخفض.

شكر خاص لجمعية ميتشل الخيرية


أولاً ، يجب أن أدفع الكثير من الديون وأشكر Mitchell Charity على البيانات الأولية التي استخدمتها لإنشاء هذه الخوارزميات: ملف أسود غير معالج . توفر Charity مجموعتين من البيانات ، وتستخدم الخوارزمية الخاصة بي وظيفة مطابقة الألوان 10 درجات CIE 1964 . مناقشة وظيفة 2 درجة CIE 1931 مع تصحيحات Judd Wos مقارنة بمجموعة العشر درجات خارج نطاق هذه المقالة ، ولكن إذا كنت مهتمًا ، يمكنك بدء تحليل شامل من هذه الصفحة .

خوارزمية: إخراج المثال


هنا ناتج الخوارزمية في النطاق من 1000 كلفن إلى 40000 كلفن:


ناتج خوارزمي هو من 1000 كلفن إلى 40000 كلفن. النقطة البيضاء هي 6500-6600 كلفن ، وهي مثالية لمعالجة الصور على شاشة LCD حديثة

فيما يلي لقطة أكثر تفصيلاً للخوارزمية في نطاق مثير للاهتمام للتصوير الفوتوغرافي من 1500 كلفن إلى 15000 كلفن:


نفس الخوارزمية ، ولكن من 1500 كلفن إلى 15000 كلفن

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

كيف جئت إلى هذه الخوارزمية


كانت الخطوة الأولى لاشتقاق صيغة موثوقة هي رسم القيم الأصلية للجسم الأسود من Charity . يمكنك تنزيل جدول البيانات بالكامل بتنسيق LibreOffice / OpenOffice .ods (430 كيلو بايت) .

فيما يلي البيانات بعد التخطيط:


بيانات درجة الحرارة الأصلية (K) في RGB (sRGB) ، الرسم البياني لحساب LibreOffice. مرة أخرى ، يعتمد التحويل على دالة CIE 1964 ذات 10 درجات CMF. تقع النقطة البيضاء ، حسب الحاجة ، بين 6500 كلفن و 6600 كلفن (الذروة على الجانب الأيسر من الرسم البياني). المصدر

من السهل ملاحظة أن هناك عدة أقسام تبسط الخوارزمية. على وجه الخصوص:

  • دائمًا ما تكون القيم الحمراء أقل من 6600 كلفن 255
  • القيم الزرقاء أقل من 2000 ك هي دائمًا 0
  • القيم الزرقاء فوق 6500 ك دائمًا 255

من المهم أيضًا ملاحظة أنه من أجل ملاءمة المنحنى مع البيانات ، يُنظر إلى اللون الأخضر على أنه منحنى منفصلان - أحدهما لدرجات حرارة أقل من 6600 كلفن ، والآخر لدرجات الحرارة فوق هذه النقطة.

منذ هذه اللحظة ، قمت بتقسيم البيانات (بدون المقطع "دائمًا 0" و "دائمًا 255") إلى مكونات ألوان منفصلة. في عالم مثالي ، يمكن تعديل المنحنى لكل مجموعة من النقاط ، ولكن للأسف ، في الواقع ، ليس بهذه البساطة. نظرًا لوجود اختلاف قوي بين قيم X و Y على الرسم البياني - جميع قيم x أكبر من 1000 ويتم عرضها في 100 نقطة ، في حين أن قيم y بين 255 و 0 - اضطررت إلى تبديل بيانات x للحصول على أفضل ملاءمة. لأغراض التحسين ، قمت أولاً بتقسيم قيمة x (درجة الحرارة) على 100 لكل لون ، ثم طرح المبلغ الذي احتاجه إذا ساعدني كثيرًا في التوافق مع الرسم البياني. فيما يلي الرسوم البيانية الناتجة لكل منحنى ، بالإضافة إلى المنحنى الأنسب والقيمة المقابلة لمعامل التحديد (R-squared):









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

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

خوارزمية


هنا الخوارزمية بكل مجدها.

أولاً ، الرمز الزائف:

     -  1000  40000. (   ,             40000 K).  ,             . Set Temperature = Temperature \ 100  : If Temperature <= 66 Then Red = 255 Else Red = Temperature - 60 Red = 329.698727446 * (Red ^ -0.1332047592) If Red < 0 Then Red = 0 If Red > 255 Then Red = 255 End If  : If Temperature <= 66 Then Green = Temperature Green = 99.4708025861 * Ln(Green) - 161.1195681661 If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 Else Green = Temperature - 60 Green = 288.1221695283 * (Green ^ -0.0755148492) If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 End If  : If Temperature >= 66 Then Blue = 255 Else If Temperature <= 19 Then Blue = 0 Else Blue = Temperature - 10 Blue = 138.5177312231 * Ln(Blue) - 305.0447927307 If Blue < 0 Then Blue = 0 If Blue > 255 Then Blue = 255 End If End If 

لاحظ أنه في الكود الزائف أعلاه ، تعني Ln () اللوغاريتم الطبيعي . لاحظ أيضًا أنه يمكنك حذف الاختيار إذا كان اللون أقل من 0 ، إذا كانت درجة الحرارة دائمًا في النطاق الموصى به. (ومع ذلك ، ما زلت بحاجة إلى ترك الاختيار "إذا كان اللون أكبر من 255").

فيما يتعلق بالرمز الفعلي ، إليك وظيفة Visual Basic الدقيقة التي أستخدمها في PhotoDemon . لم يتم تحسينها بعد (على سبيل المثال ، ستكون اللوغاريتمات أسرع بكثير مع جداول المراسلات) ، ولكن على الأقل الشفرة موجزة وقابلة للقراءة:

 '   ( )  RGB- Private Sub getRGBfromTemperature(ByRef r As Long, ByRef g As Long, ByRef b As Long, ByVal tmpKelvin As Long) Static tmpCalc As Double '      1000  40000  If tmpKelvin < 1000 Then tmpKelvin = 1000 If tmpKelvin > 40000 Then tmpKelvin = 40000 '   tmpKelvin \ 100,       tmpKelvin = tmpKelvin \ 100 '     '  If tmpKelvin <= 66 Then r = 255 Else ':  R-    0,988 tmpCalc = tmpKelvin - 60 tmpCalc = 329.698727446 * (tmpCalc ^ -0.1332047592) r = tmpCalc If r < 0 Then r = 0 If r > 255 Then r = 255 End If '  If tmpKelvin <= 66 Then ':  R-    0,996 tmpCalc = tmpKelvin tmpCalc = 99.4708025861 * Log(tmpCalc) - 161.1195681661 g = tmpCalc If g < 0 Then g = 0 If g > 255 Then g = 255 Else ':  R-    0,987 tmpCalc = tmpKelvin - 60 tmpCalc = 288.1221695283 * (tmpCalc ^ -0.0755148492) g = tmpCalc If g < 0 Then g = 0 If g > 255 Then g = 255 End If ',  If tmpKelvin >= 66 Then b = 255 ElseIf tmpKelvin <= 19 Then b = 0 Else ':  R-    0,998 tmpCalc = tmpKelvin - 10 tmpCalc = 138.5177312231 * Log(tmpCalc) - 305.0447927307 b = tmpCalc If b < 0 Then b = 0 If b > 255 Then b = 255 End If End Sub 

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

صور عينة


فيما يلي مثال رائع على ما يمكن أن تفعله تعديلات درجة حرارة اللون. توضح الصورة أدناه ، وهي ملصق إعلاني لـ True Blood لـ HBO ، بشكل مذهل إمكانية ضبط درجة حرارة اللون. على اليسار هو الإطار الأصلي ؛ على اليمين - اضبط درجة حرارة اللون باستخدام الرمز أعلاه. بنقرة واحدة ، يمكن إعادة تشكيل المشهد الليلي في وضح النهار.


تعديل درجة حرارة اللون في العمل

أداة درجة حرارة اللون الحقيقية في برنامج PhotoDemon هي كما يلي:


أداة درجة حرارة اللون PhotoDemon

قم بتنزيل البرنامج ومشاهدته في العمل.

تحديث أكتوبر 2014


قدمت رينو بيدار عرضًا توضيحيًا رائعًا عبر الإنترنت لهذه الخوارزمية. شكرا رينو!

تحديث أبريل 2015


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

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

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

Source: https://habr.com/ru/post/ar427333/


All Articles