5.12. العتبة الثنائية¶
تنتهي كثير من خطوط معالجة الصور إلى سؤال حول كل بكسل: هل هذا السطوع داخل النطاق الذي يعني "المقدمة"؟ هل هذا اللون قريب من الأحمر بما يكفي ليكون العلامة التي يتتبّعها التطبيق؟ هل هذا البكسل جزء من مجموعة المرشحين التي ينبغي أن تنظر إليها المرحلة التالية من خط المعالجة؟ العتبة هي العملية التي تحوّل تلك الأسئلة إلى إجابة ثنائية عند كل موضع -- مُشتغل إذا طابق البكسل، ومُطفأ إذا لم يطابق -- وتختزل الصورة بأكملها إلى قناع يمكن لبقية خط المعالجة العمل عليه.
5.12.1. الطريقة الثنائية¶
تُجري الطريقة binary() ذلك التصنيف على كل بكسل في الصورة في استدعاء واحد. تأخذ قائمة من نطاقات العتبة -- الشروط التي يمكن للبكسل أن يطابقها ليُحسب "مُشتغلًا" -- وتعيد كتابة الصورة بحيث يُضبط كل بكسل طابق نطاقًا واحدًا على الأقل على أقصى قيمة للصيغة، وكل بكسل لم يطابق على الصفر. والنتيجة هي القناع الثنائي الذي يمكن لبقية خط المعالجة استخدامه مباشرةً.
في أبسط صورة، تحتوي قائمة العتبة على نطاق واحد ويُرجع الاستدعاء قناعًا بالبكسلات الواقعة في ذلك النطاق:
img.binary([(120, 255)])
صيغة القائمة هي ما يجعل binary قوية. فخط معالجة يريد تتبّع علامتين ملوّنتين، أو نطاق سطوع إضافةً إلى ذروة تشبّع منعزلة، يمرّر كلا النطاقين في القائمة نفسها ويحصل على قناع خرج واحد يغطّي جميع المطابقات.
تحوّل العتبة صورةً ذات قيم متصلة إلى قناع ثنائي: كل بكسل داخل نطاق العتبة يصبح أقصى قيمة للصيغة، وكل بكسل خارجه يصبح صفرًا.¶
5.12.2. الصف الرباعي (tuple) لتدرج الرمادي¶
بالنسبة لصورة بتدرج الرمادي، يكون كل عنصر في قائمة العتبة صفًا رباعيًا من عنصرين (lo, hi) يصف نطاق سطوع شاملًا. تطابق البكسلات ذات القيم بين lo وhi (شاملًا)؛ وكل ما هو خارج ذلك النطاق لا يطابق. والأنماط الطبيعية مباشرة وواضحة:
(0, 60)تطابق البكسلات الداكنة -- كل شيء من الأسود حتى الرمادي العميق.
(180, 255)تطابق البكسلات الساطعة -- كل شيء من الرمادي الفاتح حتى الأبيض.
(100, 160)تطابق بكسلات الرمادي المتوسط -- نطاق في منتصف مجال السطوع.
لا يهمّ ترتيب القيمتين داخل الصف الرباعي؛ فالطريقة تبدّلهما داخليًا إذا كانت lo أكبر من hi، لذا تعمل (60, 0) بالطريقة نفسها التي تعمل بها (0, 60).
5.12.3. الصف الرباعي LAB للون¶
بالنسبة لصورة RGB565، يكون كل عنصر صفًا رباعيًا من ستة عناصر (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) يصف نطاقًا شاملًا في فضاء اللون LAB بدلًا من وصفه مباشرةً بالأحمر والأخضر والأزرق. والعتبات هي L (الإضاءة)، وA (المحور اللوني من الأخضر إلى الأحمر)، وB (المحور اللوني من الأزرق إلى الأصفر)، تُقارن كلٌّ منها بقيمة البكسل في تلك القناة.
سبب المرور عبر LAB بدلًا من تطبيق العتبة على RGB مباشرةً هو الخاصية التي صُمّم فضاء اللون LAB حولها: يفصل LAB الإضاءة عن اللونية. فبكسلان يُظهران اللون نفسه لكن بسطوعين مختلفين ينتهيان عند قيمتي L مختلفتين لكن عند قيمتي A وB متساويتين تقريبًا. يتيح ذلك الفصل لنطاقات العتبة أن تصف لونًا بموقعه على محوري A وB وأن تترك نطاق L مفتوحًا على مصراعيه ليقبل ذلك اللون عند كل سطوع من الظل حتى الإضاءة الساطعة. ولا يمكن لعتبة قائمة على RGB أن تفعل ذلك -- فأي تغيّر في الإضاءة يحرّك قيم R وG وB الثلاث دفعةً واحدة، ويتعطّل متتبّع مبني على عتبات RGB أول مرة تمرّ فيها سحابة أمام الشمس.
النمط العملي: اختر نطاقي A وB اللذين يصفان اللون الذي يتتبّعه التطبيق، واترك نطاق L واسعًا -- غالبًا (0, 100) لقبول أي سطوع -- ما لم يكن التطبيق يريد تحديدًا تطبيق العتبة على السطوع إضافةً إلى اللون.
بالنسبة للصفوف الرباعية ذات القيم الأقل من ستة، تأخذ المكوّنات الناقصة قيمتها الافتراضية وهي أقصى نطاق (لا قيد على ذلك المحور). لذا فإن صفًا رباعيًا من عنصرين (l_lo, l_hi) في قائمة عتبة RGB565 يطبّق العتبة على الإضاءة فقط ويطابق كل لون.
ملاحظة
لنطاق L المفتوح على مصراعيه فعلًا مأخذ عند طرفه الأدنى. فمع هبوط الإضاءة نحو الصفر يتقارب كل لون نحو الأسود، إذ تنهار قيم A وB نحو الصفر وتصير مهيمَنًا عليها بالضوضاء -- لذا يمكن أن تنجرف البكسلات الداكنة إلى نطاقي A وB وتُتتبَّع على أنها اللون المستهدف. إذا أضاءت المناطق السوداء من المشهد كمطابقات، فارفع l_lo حتى تختفي.
5.12.4. الرايات (Flags)¶
تتحكّم ثلاث وسائط مفتاحية في الخرج:
invert=Trueتقلب النتيجة. فكل بكسل كان سيطابق يصبح صفرًا، وكل بكسل كان سيصير صفرًا يصبح أقصى قيمة. وهي مفيدة حين تكون الطريقة الطبيعية لوصف المقدمة هي بما ليست عليه.
zero=Trueتغيّر نمط العمل: تُصفَّر البكسلات المطابِقة وتحتفظ البكسلات غير المطابِقة بقيمها الأصلية. استخدمها حين يكون الهدف محو البكسلات المطابِقة من الصورة بدلًا من اختزال الصورة إلى قناع ثنائي لها.
to_bitmap=Trueتُرجع النتيجة كصورةBINARYبدلًا من الكتابة فوق الصيغة الحالية للمصدر. والنتيجة ببت واحد لكل بكسل هي ما تقبله وسائط القناع اللاحقة مباشرةً، وكثيرًا ما يوفّر التحويل ضغط الذاكرة الناتج عن حمل قناع بصيغة كاملة.
يتبع القناع ومنطقة الاهتمام (ROI) العُرف نفسه الذي تتبعه بقية الواجهة: يحصر مستطيل roi العملية في منطقة فرعية، بينما تحصرها صورة mask في نمط اعتباطي من المواضع.
5.12.5. في المكان افتراضيًا¶
كما هو الحال مع العمليات الحسابية، تعمل binary في المكان افتراضيًا: يُكتب فوق بكسلات الصورة المصدر بالخرج الثنائي، وتختفي القيم الأصلية بعد الاستدعاء. وصيغة to_bitmap=True هي البديل حين يلزم الحفاظ على المصدر وينبغي أن يكون الخرج صورة BINARY مخصّصة حديثًا. كما تُقبل صيغة copy=True للحصول على نتيجة بالصيغة نفسها في مخزن جديد.