5.8. التعبئة بالفيضان ورموز الكشف¶
البدائيات الهندسية في بداية هذا القسم تضع علامات في مواضع يعرفها التطبيق مسبقًا. وتركيب الصور يضع صورة فوق أخرى. وتؤدي مجموعة أخيرة صغيرة من دوال الرسم شيئًا مختلفًا: فهي تضع علامات يعتمد شكلها على ما هو موجود بالفعل في الصورة، أو ما عثرت عليه خوارزمية سابقة فيها.
5.8.1. التعبئة بالفيضان¶
تبدأ الدالة flood_fill() من بكسل واحد -- البذرة -- وتنمو نحو الخارج، فتطلي كل بكسل مشابه بما يكفي للبذرة ومتصل بها عبر سلسلة من البكسلات المشابهة الأخرى. والنتيجة منطقة معبّأة تتحدد حدودها بالصورة نفسها، لا بأي شيء مُمرّر إلى الاستدعاء.
يأخذ الشكل الأبسط إحداثي البذرة ولونًا للتعبئة به:
img.flood_fill(x=160, y=120, color=(0, 255, 0))
يتحكم وسيطا عتبة في مدى عدوانية نمو التعبئة. تحدد seed_threshold (كسر معياري من 0.0 إلى 1.0) مدى الاختلاف المسموح به للبكسل عن قيمة البذرة الأصلية مع بقائه مشمولًا. وتحدد floating_threshold مدى اختلافه عن كل جار مشمول بالفعل. وتعمل العتبتان معًا: تتيح قيمة floating_threshold سخية للتعبئة أن تتبع تدرجًا عبر الصورة، بينما تمنعها قيمة seed_threshold ضيقة من الابتعاد كثيرًا عن قيمة البذرة حتى على امتداد ذلك التدرج.
تُحسّن بضعة أعلام النتيجة أكثر:
invert=Trueيطلي كل بكسل لا يطابق -- متمم المنطقة المطابقة -- بدلًا من البكسلات المطابقة نفسها.clear_background=Trueيصفّر كل بكسل خارج منطقة التعبئة. مفيد لاستخراج منطقة التعبئة وحدها كقناع.للكلمة المفتاحية
maskمعناها المعتاد: تُترك البكسلات المعطّلة في القناع وشأنها بغض النظر عمّا إذا كانت التعبئة ستصل إليها لولا ذلك.
تكون التعبئة بالفيضان أكثر فائدة في نمطين. الأول هو تصوير ما عثر عليه كاشف منطقة ما، بتعبئة المنطقة المكتشفة بلون مميز ليبرز في مقابل بقية الإطار. والثاني هو استخراج المنطقة نفسها، بدمج clear_background=True مع بذرة معروفة داخل المنطقة وقراءة الصورة الناتجة كقناع للعمليات اللاحقة.
5.8.2. رسم نتائج الكشف¶
كثيرًا ما تعيد خوارزميات معالجة الصور كائنات نتائج تحمل موضعًا وبنية إضافية معًا: نقطة مفتاحية باتجاه، أو كشف وجه بمركز ثقل متميز عن مربع إحاطته، أو علامة AprilTag بأربع نقاط زاوية. ورسم تلك جيدًا -- برمز يلتقط البنية، لا مجرد مربع إحاطة -- نمط متكرر بما يكفي ليكشف الموديول عن مساعدتين له.
تأخذ الدالة draw_keypoints() إما واصف نقطة مفتاحية يعيده مستخرج ميزات، أو قائمة بسيطة من الثلاثيات (x, y, rotation)، وترسم رمزًا صغيرًا عند كل نقطة. ويحمل الرمز الموضع والاتجاه معًا: دائرة حول النقطة بالإضافة إلى خط خارج من المركز يشير إلى الدوران. وذلك التصوير باستدعاء واحد هو أسهل طريقة للتحقق المنطقي من أن مستخرج النقاط المفتاحية يعيد الاتجاهات التي يتوقعها التطبيق.
تأخذ الدالة draw_detection() سداسية (rx, ry, rw, rh, cx, cy) -- المستطيل المحيط بالإضافة إلى مركز ثقل مُبلّغ عنه بشكل منفصل -- وترسم كليهما دفعة واحدة: مستطيلًا حول مربع الإحاطة، وصليبًا عند مركز الثقل، واختياريًا تسمية نصية عند زاوية المستطيل. ويطابق هذا الشكل ما يُبلّغ عنه عادة كشف شبكة عصبية أو متعقّب قالب، حيث يكون مركز الثقل موضعًا أدق مما قد يمنحه مركز مربع الإحاطة.
كلتا دالتي الرمز طبقتان للتسهيل فوق البدائيات الهندسية في بداية هذا القسم. ويستطيع التطبيق دائمًا إعادة إنتاج التصوير نفسه باستدعاء draw_rectangle() وdraw_circle() وdraw_cross() وdraw_string() مباشرة؛ ودالتا الرمز توفّران فقط أعمال المسك للأنماط التي تظهر مرارًا وتكرارًا.
مع البدائيات الهندسية للهندسة المعروفة، وتركيب الصور للطبقات الفوقية، والتعبئة بالفيضان للمناطق المشتقة من الصورة، ورموز الكشف لأنماط التصوير المعيارية، تكتمل مجموعة أدوات الرسم. فكل ما يحتاج التطبيق إلى جعل مخرجات الخوارزمية مرئية له دالة على الواجهة تضعه هناك.