5.8. מילוי שיטפון (flood fill) וגליפי זיהוי

הפרימיטיבים הגאומטריים בתחילת חלק זה מציבים סימונים במיקומים שהיישום כבר מכיר. הרכבת תמונות מניחה תמונה אחת על גבי אחרת. קבוצה קטנה אחרונה של מתודות ציור עושה משהו שונה: היא מציבה סימונים שצורתם תלויה במה שכבר נמצא בתמונה, או במה שאלגוריתם קודם כלשהו מצא בה.

5.8.1. מילוי שיטפון (flood fill)

flood_fill() מתחיל מפיקסל יחיד – הזרע (seed) – וצומח החוצה, צובע כל פיקסל שדומה מספיק לזרע ומחובר אליו דרך שרשרת של פיקסלים דומים אחרים. התוצאה היא אזור ממולא שגבולו נקבע על ידי התמונה עצמה, לא על ידי דבר שהועבר לקריאה.

הצורה הפשוטה ביותר מקבלת את קואורדינטת הזרע וצבע למילוי:

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() מקבל או מתאר נקודת מפתח (descriptor) שהוחזר על ידי מחלץ מאפיינים, או רשימה פשוטה של שלשות (x, y, rotation), ומצייר גליף קטן בכל נקודה. הגליף נושא גם את המיקום וגם את הכיוון: מעגל סביב הנקודה בתוספת קו היוצא מהמרכז המציין את הסיבוב. ההמחשה הזו בקריאה אחת היא הדרך הקלה ביותר לוודא שמחלץ נקודות מפתח מחזיר את הכיוונים שהיישום מצפה להם.

draw_detection() מקבל שישייה (rx, ry, rw, rh, cx, cy) – המלבן התוחם בתוספת מרכז מסה המדווח בנפרד – ומצייר את שניהם בבת אחת: מלבן סביב התיבה התוחמת, צלב במרכז המסה, ואופציונלית תווית טקסט בפינת המלבן. הצורה תואמת את מה שזיהוי רשת נוירונים או עוקב תבניות מדווח בדרך כלל, שבו מרכז המסה הוא מיקום מדויק יותר מכפי שמרכז התיבה התוחמת היה נותן.

שתי מתודות הגליף הן שכבות נוחות מעל הפרימיטיבים הגאומטריים בתחילת חלק זה. יישום יכול תמיד לשחזר את אותה המחשה על ידי קריאה ל-draw_rectangle(), draw_circle(), draw_cross(), ו-draw_string() ישירות; מתודות הגליף פשוט חוסכות את ניהול הספרים עבור הדפוסים שצצים שוב ושוב.

עם הפרימיטיבים הגאומטריים עבור גאומטריה ידועה, הרכבת תמונות עבור שכבות על, מילוי שיטפון עבור אזורים הנגזרים מהתמונה, וגליפי הזיהוי עבור דפוסי ההמחשה הסטנדרטיים, ערכת כלי הציור מושלמת. לכל דבר שיישום צריך כדי להפוך את פלט האלגוריתם לגלוי יש מתודה על המשטח שמציבה אותו שם.