5.12. מעבר סף בינארי¶
הרבה צינורות עיבוד תמונה מסתכמים בשאלה לגבי כל פיקסל: האם בהירות זו נמצאת בטווח שמשמעו ”קדמה“? האם צבע זה קרוב מספיק לאדום כדי להיות הסמן שהיישום עוקב אחריו? האם פיקסל זה הוא חלק מקבוצת המועמדים שהשלב הבא של הצינור צריך לבחון? מעבר סף היא הפעולה שהופכת את השאלות הללו לתשובה בינארית בכל מיקום – דלוק אם הפיקסל תואם, כבוי אם לא – ומצמצמת את כל התמונה למסכה ששאר הצינור יכול לעבוד מולה.
5.12.1. השיטה binary¶
השיטה binary() מריצה את הסיווג הזה על פני כל פיקסל בקריאה אחת. היא מקבלת רשימה של טווחי סף – התנאים שפיקסל יכול לתאום כדי להיחשב כ“דלוק“ – וכותבת מחדש את התמונה כך שכל פיקסל שתאם לפחות אחד מהטווחים נקבע לערך המרבי של הפורמט, וכל פיקסל שלא תאם נקבע לאפס. התוצאה היא המסכה הבינארית ששאר הצינור יכול להשתמש בה ישירות.
בצורה הפשוטה ביותר, רשימת הסף מכילה טווח אחד והקריאה מחזירה מסכה של פיקסלים באותו טווח:
img.binary([(120, 255)])
צורת הרשימה היא מה שהופך את binary לעוצמתית. צינור שרוצה לעקוב אחר שני סמנים צבעוניים, או טווח בהירות בתוספת שיא רוויה מבודד, מעביר את שני הטווחים באותה רשימה ומקבל מסכת פלט יחידה המכסה את כל ההתאמות.
מעבר סף הופך תמונה בעלת ערכים רציפים למסכה בינארית: כל פיקסל בתוך טווח הסף הופך לערך המרבי של הפורמט, כל פיקסל מחוצה לו הופך לאפס.¶
5.12.2. ה-tuple של גווני האפור¶
עבור תמונה בגווני אפור, כל ערך ברשימת הסף הוא tuple בן שני איברים (lo, hi) המתאר טווח בהירות כולל. פיקסלים בערכים בין lo ל-hi (כולל) תואמים; כל דבר מחוץ לטווח זה אינו תואם. הדפוסים הטבעיים פשוטים:
(0, 60)תואם פיקסלים כהים – כל דבר משחור ועד אפור עמוק.(180, 255)תואם פיקסלים בהירים – כל דבר מאפור בהיר ועד לבן.(100, 160)תואם פיקסלים אפורים-בינוניים – רצועה במרכז טווח הבהירות.
סדר שני הערכים בתוך tuple אינו משנה; השיטה מחליפה ביניהם פנימית אם lo גדול מ-hi, כך ש-(60, 0) עובד באופן זהה ל-(0, 60).
5.12.3. ה-tuple של LAB עבור צבע¶
עבור תמונת RGB565, כל ערך הוא tuple בן שישה איברים (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) המתאר טווח כולל במרחב הצבע LAB ולא ישירות באדום, ירוק וכחול. הספים הם L (בהירות), A (ציר כרומטי ירוק-עד-אדום), ו-B (ציר כרומטי כחול-עד-צהוב), כל אחד מושווה מול ערך הפיקסל באותו ערוץ.
הסיבה למעבר דרך LAB ולא למעבר סף ישיר על RGB היא התכונה שסביבה תוכנן מרחב הצבע LAB: LAB מפריד בהירות מכרומה. שני פיקסלים שמראים את אותו צבע אך בבהירויות שונות מסתיימים בערכי L שונים אך בערכי A ו-B דומים בקירוב. הפרדה זו מאפשרת לטווחי הסף לתאר צבע לפי מיקומו על צירי A ו-B ולהשאיר את טווח ה-L פתוח לרווחה כדי לקבל צבע זה בכל בהירות מצל ועד הדגשה. סף מבוסס-RGB אינו יכול לעשות זאת – כל שינוי בתאורה מזיז את כל שלושת ערכי ה-R, G, B בבת אחת, ועוקב הבנוי על ספי RGB מתמוטט בפעם הראשונה שעננה חולפת על פני השמש.
הדפוס המעשי: בחר את טווחי A ו-B המתארים את הצבע שהיישום עוקב אחריו, והשאר את טווח ה-L רחב – לעיתים קרובות (0, 100) כדי לקבל כל בהירות – אלא אם היישום רוצה ספציפית לעבור סף על בהירות בנוסף לצבע.
עבור tuples עם פחות משישה ערכים, הרכיבים החסרים מקבלים כברירת מחדל טווח מרבי (ללא אילוץ על אותו ציר). tuple בן שני איברים (l_lo, l_hi) ברשימת סף של RGB565 מבצע אפוא מעבר סף על בהירות בלבד ותואם כל צבע.
הערה
לטווח L פתוח-לרווחה באמת יש מלכוד בקצה התחתון. ככל שהבהירות יורדת לעבר אפס כל צבע מתכנס לעבר שחור, כשערכי A ו-B קורסים לעבר אפס ונשלטים על ידי רעש – כך שפיקסלים כהים יכולים להיסחף לתוך טווחי A ו-B ולהיות נעקבים כצבע המטרה. אם אזורים שחורים של הסצנה מאירים כהתאמות, העלה את l_lo עד שייפלו החוצה.
5.12.4. דגלים¶
שלושה ארגומנטים של מילות מפתח שולטים בפלט:
invert=Trueהופך את התוצאה. כל פיקסל שהיה תואם הופך לאפס, וכל פיקסל שהיה אפס הופך לערך המרבי. שימושי כאשר הדרך הטבעית לתאר את הקדמה היא לפי מה שהיא אינה.zero=Trueמשנה את אופן הפעולה: פיקסלים תואמים מאופסים ופיקסלים לא-תואמים שומרים על ערכיהם המקוריים. השתמש בזה כאשר המטרה היא למחוק את הפיקסלים התואמים מהתמונה במקום לצמצם את התמונה למסכה בינארית שלהם.to_bitmap=Trueמחזיר את התוצאה כתמונתBINARYבמקום לדרוס את הפורמט הקיים של המקור. התוצאה של ביט-אחד-לפיקסל היא מה שארגומנטי מסכה מאוחרים מקבלים ישירות, וההמרה לעיתים קרובות חוסכת את לחץ הזיכרון של נשיאת מסכה בפורמט מלא.
מסכה ו-ROI עוקבים אחר אותה מוסכמה כשאר המשטח: מלבן roi מתחם את הפעולה לתת-אזור, תמונת mask מתחמת אותה לדפוס שרירותי של מיקומים.
5.12.5. במקום כברירת מחדל¶
כמו הפעולות האריתמטיות, binary רץ במקום כברירת מחדל: הפיקסלים של תמונת המקור נדרסים בפלט הבינארי, והערכים המקוריים נעלמים לאחר הקריאה. הצורה to_bitmap=True היא החלופה כאשר יש לשמר את המקור והפלט אמור להיות תמונת BINARY שהוקצתה מחדש. הצורה copy=True מתקבלת גם היא עבור תוצאה באותו פורמט בחוצץ חדש.