5.14. החלקת גאוס וקצוות

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

5.14.1. מסנן גאוס

gaussian() הוא בן הדוד המשוקלל-למרכז של mean(). שניהם מחשבים ממוצע על פני השכנוּת של כל פיקסל, אך משקלי הגאוס אינם אחידים: פיקסלים קרובים יותר למרכז השכנוּת נספרים יותר, פיקסלים בקצה השכנוּת נספרים פחות, כאשר המשקלים עוקבים אחר עקומת הפעמון המוכרת שמעניקה למסנן את שמו.

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

img.gaussian(1)    # 3x3 Gaussian -- a clean light blur
img.gaussian(2)    # 5x5 Gaussian -- stronger smoothing

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

5.14.2. מיסוך לא-חד (unsharp masking)

עותק מטושטש-גאוס של תמונה הוא חומר הגלם שטכניקת המיסוך הלא-חד משתמשת בו לחידוד קלאסי. הגדרת unsharp=True במסנן מחליפה אותו מ“הפק את התמונה המטושטשת“ אל ”החסר את התמונה המטושטשת מהמקור והוסף את ההפרש בחזרה למקור“ – האפקט הוא שקצוות בתדר גבוה מוגברים יחסית לפנים חלקים.

img.gaussian(1, unsharp=True)

הפרמטרים האופציונליים mul ו-add מתאימים בקנה מידה את עוצמת התוצאה הלא-חדה; ברירות המחדל (mul=1.0, add=0.0) הן חידוד מתון שאינו מגזים ברעש החיישן.

5.14.3. מסנן הלפלסיאן

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

img.laplacian(1)   # 3x3 Laplacian -- edge response

אותם פרמטרים כמו gaussian זמינים. sharpen=True מפיק תמונה מחודדת (הלפלסיאן מוסף בחזרה למקור במקום מוחזר בנפרד). mul ו-add מתאימים בקנה מידה את התגובה.

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

5.14.4. מתודת find_edges

find_edges() מריץ צינור זיהוי-קצוות שלם ולא רק מסנן תגובת-קצה. הוא פועל על תמונות בגווני אפור, והתוצאה היא תמונה בינארית שהפיקסלים שאינם אפס בה מסמנים את המיקומים שבהם לקלט יש את סוג שינוי הבהירות שאמור להיחשב כקצה.

המתודה מקבלת פרמטר edge_type שבוחר בין שני אלגוריתמים:

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

EDGE_CANNY מריץ את מזהה הקצוות Canny – האלגוריתם הרב-שלבי הקלאסי. הוא מחשב את גרדיאנט הבהירות, מדכא כל תגובה שאינה מקסימום לאורך כיוון הגרדיאנט (כך שכל קצה הוא בעובי פיקסל אחד), ומחיל סף היסטרזיס (כך שקצה החזק במקום אחד מותווה גם היכן שהוא דועך בין לבין). התוצאה היא קבוצה נקייה, דקה ומחוברת של פיקסלי קצה מהסוג שכל אלגוריתם קלאסי מבוסס-קצוות רוצה.

הפרמטר threshold הוא טופל בן שני איברים (low, high). עבור EDGE_CANNY, הערך הגבוה הוא נקודת החיתוך שמעליה פיקסל הוא בוודאי קצה, והערך הנמוך הוא נקודת החיתוך שמעליה פיקסל הוא קצה רק אם הוא מחובר לקצה ודאי. עבור EDGE_SIMPLE, רק הערך הגבוה חשוב; הוא נקודת החיתוך היחידה שמעליה פיקסל נחשב כקצה. ברירת המחדל של (100, 200) היא נקודת התחלה שכדאי לכוונן עבור הסצנה הספציפית.

img.gaussian(1)                                   # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))

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

5.14.5. סף אדפטיבי על הגאוס

כמו המסננים הסטטיסטיים, gaussian() מקבל את צמד מילות המפתח threshold=True / offset=N עבור סף אדפטיבי. ההתנהגות זהה לזו שב-mean(): הסטטיסטי של הגאוס בכל מיקום הופך לנקודת החיתוך המקומית, ופיקסל המקור מושווה לסטטיסטי בתוספת ההיסט כדי להפיק תוצאה בינארית.

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