5.15. פעולות מורפולוגיות¶
פעולות מורפולוגיות עובדות על תמונות בינאריות – המסכות שיוצאות מסיפוף ומזיהוי קצוות. כל פעולה צועדת על אותו סוג של שכנות מחליקה שמסנני ההחלקה משתמשים בה, אך השאלה שהיא שואלת בכל מיקום היא כן/לא: האם כל פיקסל בשכנות דלוק, האם כל פיקסל בשכנות דלוק, איך נראית תבנית הדלוק/כבוי? התשובות מגדילות אזורים, מכווצות אותם, וחותכות מחדש את גבולותיהם בדרכים שמסנן ממוצע אינו יכול.
מורפולוגיה היא מה שבא בין מסכה בינארית התחלתית – הפלט של סיפוף, זיהוי קצוות, או מסווג אחר כלשהו – לבין המסכה הבינארית הנקייה ששאר הצנרת יכולה להשתמש בה. פלט סף גולמי בדרך כלל מכיל פיקסלי רעש מבודדים פזורים באזורי קדמה אמיתיים, חורים קטנים שנקדחו באזורים שאחרת היו מוצקים, וגבולות משוננים שבהם הסף נחתך קרוב לקצה של עצם. מורפולוגיה מסירה את הפגמים הללו.
5.15.1. ארבע הפעולות הקלאסיות¶
שתי פעולות בסיסיות, ושתי הרכבות שלהן, מרכיבות את ארגז הכלים המורפולוגי:
dilate() מגדיל כל אזור קדמה. הכלל הוא: כל פיקסל שיש לו לפחות שכן קדמה אחד בחלון (2 * size + 1) שלו הופך לקדמה. האפקט הנראה הוא שאזורי הקדמה גדלים ב-size פיקסלים בכל כיוון, וחורים בתוכם מתכווצים (או נעלמים) באותה מידה.
erode() עושה את ההפך. כל פיקסל שאין לו כל שכן בחלון שלו בקדמה הופך לרקע. אזורי הקדמה מתכווצים ב-size פיקסלים בכל כיוון, פיקסלי קדמה מבודדים (שאין להם שכני קדמה) נעלמים לחלוטין, וחיבורים קטנים בין אזורים גדולים יותר נחתכים.
ארבע הפעולות המורפולוגיות הקלאסיות מוחלות על אזור בינארי רועש. Erode מכווץ; dilate מגדיל; open הוא erode ולאחריו dilate (מסיר רעש); close הוא dilate ולאחריו erode (ממלא חורים).¶
open() הוא erode ולאחריו dilate. מהתמונה המכווצת הוסר כל פיקסל רעש מבודד, אך היא גם כווצה ב-size פיקסלים בכל כיוון. ביצוע dilate באותו גודל אחרי ה-erode משחזר את אזורי הקדמה האמיתיים בערך לגבולותיהם המקוריים תוך השארת הרעש מסולק. ההרכבה היא מה שהופך את open לפעולת ”הסרת הרעש“ התקנית במורפולוגיה הקלאסית: פיקסלי קדמה מבודדים נעלמים, אזורים אמיתיים חוזרים ללא פגע.
close() הוא תמונת המראה – dilate ולאחריו erode. ה-dilate ממלא חורים קטנים בתוך אזורי קדמה ומחבר אזורים שמופרדים על ידי מרווחים קטנים; ה-erode מכווץ את התוצאה בחזרה לגבול החיצוני המקורי שלה תוך השארת הפנים שמולאו מוצקים. close היא פעולת ”מילוי המרווחים הקטנים“ התקנית.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
לפרמטר size אותה משמעות כמו במסנני הבהירות: size=1 משמעו שכנות של 3 על 3, size=2 משמעו 5 על 5, וכן הלאה. גדלים גדולים יותר משמעם ניקוי אגרסיבי יותר – ועלות גבוהה יותר לכל פיקסל.
5.15.2. Top-hat ו-black-hat¶
שתי הרכבות נוספות כדאיות להכרה כי הן מחלצות בדיוק את המאפיינים ש-open ו-close מסירים:
top_hat() מחזיר את ההפרש בין התמונה המקורית לבין הגרסה הפתוחה שלה – פיקסלי הקדמה ש-open היה מסיר. זוהי פשוטו כמשמעו מסכה של פיקסלי הרעש, אזורי הקדמה הקטנים המבודדים, מבני הקדמה הדקים שפעולת ה-open לא יכלה לשמר. שימושי לחילוץ מאפייני קדמה קטנים כאשר מאפיינים אלה הם הדבר שהיישום מתעניין בו, במקום להסיר אותם.
black_hat() מחזיר את ההפרש בין הגרסה הסגורה של התמונה לבין המקור – פיקסלי הרקע ש-close היה ממלא. זוהי מסכה של החורים הקטנים בתוך אזורי קדמה, המרווחים הצרים בין אזורים שפעולת ה-close הייתה מגשרת עליהם.
שתיהן נדרשות פחות בשכיחות מארבע הפעולות הבסיסיות, אך כדאי לזכור את התבנית – כאשר יישום צריך לחלץ מאפיינים קטנים או דקים שמעבר הניקוי התקני מסיר, ה-top-hat וה-black-hat הם הדרך הטבעית להחזירם.
5.15.3. מצב סף¶
ארבע הפעולות המורפולוגיות הבסיסיות מקבלות כולן מילת מפתח threshold שלמה שמרככת את בדיקת הדלוק/כבוי בכל מיקום. בלעדיה, הפעולות מתנהגות כפי שהתיאורים לעיל אמרו: erode() דורש שכל שכן יהיה דלוק, dilate() דורש לפחות אחד. כאשר threshold מוגדר, כל פעולה סובלת מספר זה של שכנים שמצביעים בכיוון השני. עבור erode, threshold הוא מספר שכני הרקע שלפיקסל מותר שיהיו ועדיין לשרוד: threshold=4 משאיר כל פיקסל עם לפחות ארבעה משמונת שכניו דלוקים (בחלון 3 על 3 לפיקסל המרכז יש שמונה שכנים), כך שהוא אינו שוחק באגרסיביות. עבור dilate, threshold הוא מספר שכני הקדמה שלפיקסל רקע צריך שיהיו לפני שהוא נדלק: threshold=2 דורש לפחות שלושה שכני קדמה במקום אחד, כך שהוא גדל באגרסיביות פחותה.
צורת הסף שימושית לכיוונון האגרסיביות של מעבר מורפולוגי מבלי לשנות את גודל החלון שלו, מה שהיה משנה גם את קנה המידה של המאפיינים שעליהם הוא פועל. רוב היישומים נשארים עם התנהגות ברירת המחדל; צורת הסף קיימת למקרים שבהם ברירת המחדל היא פשוט מעט יותר מדי או מעט פחות מדי.