5.13. المرشحات الخطية ومرشحات الجوار¶
كانت عمليات حسابات البكسل في وقت سابق من هذا الفصل تدمج صورتين نقطة بنقطة. أما المرشحات فتؤدي عملاً ذا صلة بطريقة مختلفة: إذ تحسب قيمة كل بكسل في الخرج انطلاقاً من جوار صغير من بكسلات الدخل المحيطة بالموضع المقابل. فالخرج عند (x, y) هو قيمة إحصائية ما -- المتوسط أو الوسيط أو القيمة الأكثر شيوعاً -- لبكسلات الدخل ضمن مربع صغير متمركز حول (x, y).
هذا التغيير الطفيف في التأطير -- الانتقال من معالجة بكسل واحد في كل مرة إلى معالجة نافذة من البكسلات في كل مرة -- هو ما يجعل عائلة كاملة من العمليات المفيدة قابلة للعمل. فأخذ متوسط بسيط على نافذة صغيرة يُملّس ضوضاء المستشعر. والوسيط على النافذة نفسها يزيل النقاط المفردة دون تنعيم الحواف بالقدر نفسه. والمتوسط الثنائي يرفض التمليس عبر حدود التباين القوية، فيحافظ على حواف الأجسام بينما ينظف الأنسجة داخلها. الجوار هو وحدة العمل، أما اختيار القيمة الإحصائية فهو ما يحدد وظيفة المرشح.
5.13.1. حجم النواة¶
يأخذ كل مرشح جوار معاملاً اسمه size يحدد نصف قطر النافذة بالبكسل. والنافذة نفسها مربعة وتغطي (2 * size + 1) بكسلاً على كل جانب -- فالقيمة size=1 تعني جواراً بأبعاد 3 في 3، وsize=2 تعني 5 في 5، وsize=3 تعني 7 في 7، وهكذا.
ينزلق الجوار عبر الصورة بكسلاً واحداً في كل مرة، من أعلى اليسار إلى أسفل اليمين. وكل بكسل في الخرج هو نتيجة تطبيق القيمة الإحصائية للمرشح على جوار الدخل المتمركز حوله.¶
الأحجام الأكبر تعني جواراً أكبر، وهو ما يعني ترشيحاً أكثر تمليساً (أو أكثر عدوانية). وتتزايد التكلفة مع مساحة النافذة، لذا فإن مرشحاً بقيمة size=3 يؤدي عملاً يعادل نحو تسعة أضعاف العمل لكل بكسل مقارنة بمرشح بقيمة size=1. والإعداد العملي الافتراضي لمعظم أعمال التنظيف هو size=1 أو size=2، ولا تلجأ إلى الأحجام الأكبر إلا حين لا يكفي الجوار الصغير لكبح الميزة التي يحاول التطبيق كبحها.
5.13.2. مرشح المتوسط¶
تستبدل mean() كل بكسل بـالمتوسط الحسابي لجواره. وتُملّس النتيجة التباين بين البكسلات على امتداد حجم النافذة، مما يجعلها أرخص طريقة لكبح نقاط ضوضاء المستشعر: إذ يتلاشى التباين عالي التردد بالتوسيط، بينما ينجو المحتوى منخفض التردد.
والمقايضة هي أن الحواف وغيرها من الميزات الحادة تخضع للتوسيط أيضاً. فالحافة الساطعة التي كان عرضها بكسلاً واحداً قبل المرشح يصبح عرضها بكسلين أو ثلاثة بعد مرشح متوسط بقيمة size=1، مع تدرج السطوع نزولاً عند الأكتاف. وفي حالة تقليل الضوضاء الخالص على صورة فقيرة بالأنسجة (جدار نظيف، أو داخل علامة ملونة) تكون المقايضة جيدة. أما في مشهد مزدحم تهم فيه الحواف، فعادةً ما يكون أحد المرشحات التالية أنسب.
img.mean(1) # 3x3 box average -- fast, gentle smoothing
img.mean(2) # 5x5 box average -- stronger, slower
5.13.3. الوسيط والمنوال ونقطة المنتصف¶
تستبدل المرشحات الإحصائية الثلاثة الأخرى للجوار المتوسط الحسابي البسيط بشيء أكثر متانة في مواجهة القيم الشاذة.
تُرجع median() الوسيط للجوار -- أي القيمة التي تقع في منتصف القائمة المرتبة لبكسلات النافذة. ووجود بكسل واحد شديد السطوع أو شديد القتامة في النافذة لا يسحب الوسيط، بل يصبح مجرد واحد من القيمتين القصويين المُهمَلتين. والأثر العملي هو أن الترشيح بالوسيط يزيل النقاط المفردة وضوضاء الملح والفلفل دون تنعيم الحواف بالطريقة التي يفعلها mean. والتكلفة هي مزيد من الحساب لكل بكسل -- فترتيب نافذة أبطأ من توسيطها -- كما أن النتيجة ليست متوسطاً بدقة، وهو ما يهم أحياناً للعمليات الحسابية اللاحقة.
يُزيح معاملٌ اسمه percentile (قيمته الافتراضية 0.5) القيمة المختارة عن الوسيط الدقيق. فالقيمة percentile=0.0 تُرجع الحد الأدنى للجوار، وpercentile=1.0 الحد الأقصى، أما القيم الوسيطة فتختار نسبياً بينهما ضمن النافذة المرتبة. وهذا يمنح median القدرة على إبراز الأجزاء القاتمة أو الساطعة من الجوار دون فقدان متانة إحصاء الترتيب في مواجهة القيم الشاذة.
تُرجع mode() القيمة الأكثر شيوعاً في الجوار. وهي مفيدة حين يكون نموذج الضوضاء هو "أن معظم البكسلات صحيحة، وقليلاً منها تعرض للتلف بدرجات متفاوتة"، حيث تكون الإجابة الصحيحة هي أي قيمة تظهر أكثر -- وهو ما قد يفوته الوسيط حين تتراكم القيم التالفة على جانب واحد من النافذة المرتبة.
تُرجع midpoint() تركيبة موزونة من الحد الأدنى والحد الأقصى للجوار -- فالقيمة bias=0.5 تعطي نقطة المنتصف بينهما، وbias=0.0 تعطي الحد الأدنى، وbias=1.0 تعطي الحد الأقصى. وهي أقل استخداماً من غيرها لكن من الجدير معرفتها حين يكون الهدف تحديداً استخراج الميزات القاتمة أو الساطعة.
5.13.4. المرشح الثنائي، النسخة الحافظة للحواف¶
تُعدّ bilateral() مرشح الجوار الأجدر بالفهم الجيد. فهي تُنتج أثر التمليس الذي تُنتجه mean()، لكن مع قيد إضافي: فكلما اختلف بكسل في الجوار عن البكسل المركزي قلّ وزنه في المتوسط. والنتيجة تُملّس داخل كل منطقة متجانسة دون أن تنزف عبر الحواف التي تفصل بينها، وهذا بالضبط ما تريده معظم التطبيقات فعلاً.
هناك معاملان يتحكمان في مدى عدوانية المرشح في خصم البكسلات:
يُقرر
color_sigmaكيف يؤثر الفرق اللوني في عملية الترجيح. فالقيم الأصغر تعني أن المرشح أكثر صرامة في خصم البكسلات التي تختلف عن المركز.يُقرر
space_sigmaكيف تؤثر المسافة المكانية في عملية الترجيح. فالقيم الأصغر تعطي وزناً أكبر للبكسلات القريبة من المركز.
القيم الافتراضية (color_sigma=0.1 وspace_sigma=1.0) نقاط انطلاق معقولة، وضبطها عادةً مسألة تشغيل المرشح على إطار عينة والتعديل حتى تصبح الحواف حادة والمناطق الداخلية نظيفة.
المرشح الثنائي أغلى من median() وأغلى بكثير من mean()، لذا يجدر اللجوء إليه فقط حين يكون السلوك الحافظ للحواف هو ما يحتاجه التطبيق.
5.13.5. تحديد العتبة التكيفي¶
تحمل مرشحات المتوسط والوسيط والمنوال ونقطة المنتصف جميعها الزوج نفسه من المعاملات المسماة التي تحوّل خرجها إلى عتبة ثنائية:
تبدّل القيمة
threshold=Trueالمرشح إلى وضع تحديد العتبة.تُزيح القيمة
offset=Nحدّ القطع المحلي بمقدارNوحدة قبل المقارنة.
تُبنى الآلية مباشرةً على السلوك الاعتيادي للمرشح. فبدون threshold=True، يحسب المرشح قيمته الإحصائية على الجوار ويكتب تلك القيمة في بكسل الخرج. ومع threshold=True، يحسب المرشح القيمة الإحصائية نفسها، ثم يقارن بكسل المصدر في الموضع نفسه بالقيمة الإحصائية مضافاً إليها الإزاحة، ويكتب القيمة القصوى للصيغة إذا كان المصدر أكبر، وصفراً فيما عدا ذلك.
والنتيجة صورة ثنائية يتحرك فيها حدّ القطع مع السطوع المحلي عبر الإطار. فالمناطق الساطعة تحصل على حدّ قطع مرتفع، والمناطق المعتمة تحصل على حدّ قطع منخفض، وبكسل المقدمة الأكثر سطوعاً محلياً من جيرانه يُطابق سواء كان في منطقة ساطعة أم معتمة -- وهذا بالضبط هو السلوك الذي لا تستطيع عتبة عامة وحيدة إنتاجه على صورة غير متساوية الإضاءة.
img.mean(3, threshold=True, offset=5)
المعامل offset هو موضع تحكم التطبيق في مدى صرامة الاختبار. فإزاحة موجبة صغيرة تتطلب أن يكون بكسل المصدر أسطع بشكل قابل للقياس من جيرانه قبل أن يُحتسب مطابقاً، مما يكبح الإيجابيات الكاذبة الناتجة عن ضوضاء المستشعر على حساب إسقاط المقدمة الخافتة. وإزاحة سالبة صغيرة تلتقط المقدمة الخافتة على حساب السماح ببعض الضوضاء بالمرور. ويعتمد الاختيار على ما ستفعله بقية خط المعالجة بالخرج الثنائي.
في ظل الإضاءة غير المتساوية، لا تستطيع عتبة عامة وحيدة وصف المقدمة عند كل موضع. أما مرشح الجوار المُشغّل بـ threshold=True فيُنتج حدّ قطع يتحرك مع السطوع المحلي ويُصنف المقدمة بشكل صحيح عبر الإطار بأكمله.¶
تُشغّل عائلة المرشحات العتبة التكيفية، لذا فإن اختيار المرشح الصحيح يهم: استخدم mean() للحصول على أرخص عتبة تكيفية، وmedian() حين يحتوي الدخل على ضوضاء الملح والفلفل التي ينبغي للمرشح رفضها قبل حساب حدّ القطع المحلي.