OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold()

מבוא

סף היא טכניקה פשוטה ויעילה לביצוע פילוח בסיסי בתמונה, ולבצע בינאריות (להפוך אותה לתמונה בינארית) כאשר פיקסלים הם או 0 or 1 (אוֹ 255 אם אתה משתמש במספרים שלמים כדי לייצג אותם).

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

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

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

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

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

עבור יישומים עדינים יותר הדורשים הקשר, עדיף לך להשתמש בטכניקות מתקדמות יותר, כולל למידה עמוקה, שהניעה את ההתקדמות האחרונה בראייה ממוחשבת.

סף אדפטיבי עם OpenCV

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

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

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

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

בואו נסתכל על התוצאה:

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

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

השמיים cv2.adaptiveThreshold() השיטה מאפשרת לנו לעשות בדיוק את זה:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

השמיים adaptive_method יכול להיות cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, שם C הוא הטיעון האחרון שהגדרת. שתי השיטות הללו מחשבות את הסף לפי השכנים של הפיקסל המדובר, כאשר block_size מכתיב את מספר השכנים שיש להתחשב בהם (שטח השכונה).

ADAPTIVE_THRESH_MEAN_C לוקח את הממוצע של השכנים ומפחית Cתוך ADAPTIVE_THRESH_GAUSSIAN_C לוקח את הסכום המשוקלל של גאוס של השכנים ומפחית C.

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

זה גם מאפשר לך להגדיר אסטרטגיית בינאריזציה, אך מוגבל ל THRESH_BINARY ו THRESH_BINARY_INV, ושינוי ביניהם יחליף למעשה מה זה "רקע" ומה זה "חזית".

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


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

זה מביא לתמונה הרבה יותר ברורה:

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הערה: השמיים block_size הארגומנט חייב להיות מספר לא אחיד.

באותו אופן, אנו יכולים ליישם סף גאוסי:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

מה שגם מייצר תמונה משביעת רצון בסופו של דבר:

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

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

מגבלות של סף אדפטיבי

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

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

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

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

סיכום

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

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

הולך רחוק יותר - למידה עמוקה מעשית לראייה ממוחשבת

האופי הסקרן שלך גורם לך לרצות ללכת רחוק יותר? אנו ממליצים לבדוק את שלנו קורס: "למידה עמוקה מעשית עבור ראייה ממוחשבת עם Python".

OpenCV Adaptive Thresholding ב-Python עם cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

עוד קורס ראיית מחשב?

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

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

מה יש בפנים?

  • העקרונות הראשונים של חזון וכיצד ניתן ללמד מחשבים "לראות"
  • משימות ויישומים שונים של ראייה ממוחשבת
  • כלי המקצוע שיקלו עליכם את העבודה
  • מציאת, יצירה וניצול של מערכי נתונים עבור ראייה ממוחשבת
  • התיאוריה והיישום של רשתות עצביות קונבולוציונליות
  • טיפול בהסטת תחום, התרחשות משותפת והטיות אחרות במערך נתונים
  • העבר למידה וניצול זמן ההדרכה ומשאבי החישוב של אחרים לטובתך
  • בנייה והדרכה של סיווג סרטן שד חדיש
  • כיצד ליישם מנה בריאה של ספקנות על רעיונות מיינסטרים ולהבין את ההשלכות של טכניקות מאומצות באופן נרחב
  • הדמיית "מרחב הקונספט" של ConvNet באמצעות t-SNE ו-PCA
  • תיאורי מקרה של האופן שבו חברות משתמשות בטכניקות ראייה ממוחשבת כדי להשיג תוצאות טובות יותר
  • הערכת מודל נכונה, הדמיית מרחב סמוי וזיהוי תשומת הלב של המודל
  • ביצוע מחקר תחום, עיבוד מערכי נתונים משלך והקמת בדיקות מודל
  • ארכיטקטורות חדשניות, התקדמות רעיונות, מה מייחד אותם וכיצד ליישם אותם
  • KerasCV – ספריית WIP ליצירת צינורות ודגמים מתקדמים
  • כיצד לנתח ולקרוא מאמרים וליישם אותם בעצמך
  • בחירת דגמים בהתאם ליישום שלך
  • יצירת צינור למידת מכונה מקצה לקצה
  • נוף ואינטואיציה על זיהוי אובייקטים עם R-CNN מהירים יותר, RetinaNets, SSDs ו-YOLO
  • מופע ופילוח סמנטי
  • זיהוי אובייקטים בזמן אמת עם YOLOv5
  • הכשרת גלאי אובייקטים של YOLOv5
  • עבודה עם רובוטריקים באמצעות KerasNLP (ספריית WIP בעלת חוזק בתעשייה)
  • שילוב רובוטריקים עם ConvNets ליצירת כיתובים של תמונות
  • חלום עמוק
  • אופטימיזציה של מודל Deep Learning לראייה ממוחשבת

בול זמן:

עוד מ Stackabuse