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

OpenCV Thresholding ב-Python עם cv2.threshold()

מבוא

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

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

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

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

כל אלה יושמו בצורה נוחה ב-OpenCV כ:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

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

עכשיו, אפילו עם השיטות ה"נאיביות" - כמה ניתן ליישם היוריסטיות למציאת ספים טובים, ואלה כוללים את שיטת Otsu ושיטת המשולש:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

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

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

סף פשוט עם OpenCV

הסף ב-Python API של OpenCV נעשה באמצעות cv2.threshold() שיטה - שמקבלת תמונה (מערך NumPy, מיוצג במספרים שלמים), את הסף, הערך המקסימלי ושיטת הסף (איך threshold ו maximum_value משומשים):

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

קוד ההחזרה הוא רק הסף שהוחל:

print(f"Threshold: {ret}") 

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

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

בואו נתווה את התוצאה! חלונות OpenCV יכולים להיות מעט קפדניים, אז נשרטט את התמונה המקורית, התמונה המטושטשת והתוצאות באמצעות Matplotlib:

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

שיטות סף

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

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARY ו THRESH_BINARY_INV הם הפוכים זה לזה, ובינאריים תמונה ביניהם 0 ו 255, הקצאתן לרקע ולחזית בהתאמה, ולהיפך.

THRESH_TRUNC בינאריזה את התמונה בין threshold ו 255.

THRESH_TOZERO ו THRESH_TOZERO_INV לבינארי בין 0 וערך הפיקסל הנוכחי (src(x, y)). בואו נסתכל על התמונות שהתקבלו:

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

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

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

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

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

סף אוטומטי/אופטימלי עם OpenCV

OpenCV משתמשת בשתי שיטות חיפוש סף גלובליות יעילות – השיטה של ​​Otsu ושיטת המשולש.

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

OpenCV Thresholding ב-Python עם cv2.threshold() PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.
אשראי תמונה: https://scipy-lectures.org/

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

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

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

שני אלה מניחים תמונה בגווני אפור, ולכן נצטרך להמיר את תמונת הקלט לאפור באמצעות cv2.cvtColor():

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

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

בואו נעבור על התמונה בשתי השיטות ונתאר את התוצאות:

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

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

כאן, שיטת המשולש עולה על השיטה של ​​אוטסו, מכיוון שהתמונה אינה דו-מודאלית:

import numpy as np

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

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

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

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

מגבלות של סף OpenCV

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

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

סיכום

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

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

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

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

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

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

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

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

מה יש בפנים?

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

בול זמן:

עוד מ Stackabuse