- 1. פילוח וקווי מתאר
- 2. מצב היררכיה ואחזור
- 3. קירוב קווי מתאר ומציאת גוף הקמור שלהם
- 4. גבעול קמור
- 5. התאמת קווי המתאר לפי צורות
- 6. זיהוי צורות (מעגל, מלבן, משולש, ריבוע, כוכב)
- 7. איתור קווים
- 8. זיהוי כתמים
- 9. סינון הכוסות - ספירת מעגלים ואליפסות
במדריכים הקודמים השתמשנו ב- OpenCV לעיבוד תמונה בסיסי וביצענו כמה פעולות עריכת תמונה מראש. כידוע, OpenCV היא Open Source Commuter Vision Library אשר כוללת ממשקי C ++, Python ו- Java ותומכת ב- Windows, Linux, Mac OS, iOS ו- Android. כך שניתן להתקין אותו בקלות ב- Raspberry Pi עם פייתון וסביבת לינוקס. ו- Raspberry Pi עם OpenCV ומצלמה מחוברת יכולים לשמש ליצירת יישומי עיבוד תמונה רבים בזמן אמת כמו זיהוי פנים, נעילת פנים, מעקב אחר חפצים, זיהוי לוחית מספר רכב, מערכת אבטחה לבית וכו 'במדריך זה נלמד כיצד לעשות פילוח תמונות באמצעות OpenCV. הפעולות שאנחנו הולכים לבצע מפורטות להלן:
- פילוח וקווי מתאר
- מצב היררכיה ואחזור
- קירוב קווי מתאר ומציאת גוף הקמור שלהם
- קונקס האל
- מתאר תואם
- זיהוי צורות (מעגל, מלבן, משולש, ריבוע, כוכב)
- איתור קו
- זיהוי כתמים
- סינון הכמות - ספירת עיגולים ו אליפסות
1. פילוח וקווי מתאר
פילוח תמונות הוא תהליך שבו אנו מחלקים תמונות לאזורים שונים. ואילו קווי המתאר הם הקווים או הקימורים הרציפים שכובלים או מכסים את הגבול המלא של אובייקט בתמונה. וכאן נשתמש בטכניקת פילוח תמונות הנקראת קווי מתאר כדי לחלץ את חלקי התמונה.
גם קווי מתאר חשובים מאוד ב
- איתור אובייקטים
- ניתוח צורות
ויש להם תחום יישום רחב מאוד החל מניתוח התמונות בעולם האמיתי וכלה בניתוח דימוי רפואי כמו ב- MRI
בואו נדע ליישם קווי מתאר ב- opencv, על ידי חילוץ קווי מתאר של ריבועים.
cv2 יבוא יבוא numpy כפי NP
בואו נטען תמונה פשוטה עם 3 ריבועים שחורים
תמונה = cv2.imread ('squares.jpg') cv2.imshow ('תמונת קלט', תמונה) cv2.waitKey (0)
גווני אפור
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
מצא קצוות מסוככים
קצוות = cv2.Canny (אפור, 30,200) cv2.imshow ('קצוות מסוכנים ', קצוות) cv2.waitKey (0)
מציאת קווי מתאר
# השתמש בעותק של התמונה שלך, למשל - edged.copy (), מכיוון שמציאת קווי מתאר משנים את התמונה # עלינו להוסיף _ לפני קווי המתאר כארגומנט ריק עקב שדרוג גרסת OpenCV _, קווי מתאר, היררכיה = cv2.findContours (קצוות, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('קצוות מסורבלים לאחר מתאר', קצה) cv2.waitKey (0)
הדפסת קובץ המתאר כדי לדעת ממה מורכב קווי המתאר
הדפס (קווי מתאר) הדפס ('מספר קווי המתאר נמצאו =' + str (len (קווי המתאר)))
צייר את כל קווי המתאר
# שימוש -1 כפרמטר השלישי לציור כל קווי המתאר cv2.drawContours (תמונה, קווי מתאר, -1, (0,255,0), 3) cv2.imshow ('קווי מתאר, תמונה) cv2.waitKey (0) cv2. destroyAllWindows ()
תפוקת קונסולות -],],], …,],],]], dtype = int32), מַעֲרָך(],],
], …,
],],]], dtype = int32), מערך (],],], …,],],]], dtype = int32)]
מספר קווי המתאר שנמצאו = 3. אז מצאנו בסך הכל שלושה קווי מתאר.
כעת, בקוד שלעיל הדפסנו גם את קובץ המתאר באמצעות , קובץ זה מספר כיצד קווי מתאר אלה נראים, כפי שמודפסים בפלט המסוף מעל.
בפלט המסוף הנ"ל יש לנו מטריצה שנראית כמו קואורדינטות של נקודות x, y. OpenCV מאחסן קווי מתאר ברשימות רשימות. אנו יכולים פשוט להציג את פלט המסוף הנ"ל כדלקמן:
קונטור 1 קונטור 2 קונטור 3
], מערך (], מערך (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
כעת, כאשר אנו משתמשים בפונקציית האורך בקובץ המתאר, אנו מקבלים את האורך השווה ל -3, פירוש הדבר שהיו שלוש רשימות של רשימות בקובץ זה, כלומר שלושה קווי מתאר.
כעת, דמיין ש- CONTOUR 1 הוא האלמנט הראשון במערך זה ורשימה זו מכילה רשימה של כל הקואורדינטות וקואורדינטות אלו הן הנקודות לאורך קווי המתאר שראינו זה עתה, כתיבות המלבניות הירוקות.
ישנן שיטות שונות לאחסון הקואורדינטות הללו ואלה נקראות שיטות קירוב, בעצם שיטות קירוב הן משני סוגים
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE מאחסן את כל נקודת הגבול, אך איננו זקוקים בהכרח לכל נקודות הגבול, אם הנקודה יוצרת קו ישר, אנו זקוקים רק לנקודת ההתחלה ולנקודת הסיום בקו זה.
cv2.CHAIN_APPROX_SIMPLE במקום זאת מספק רק את נקודות ההתחלה והסיום של קווי המתאר התוחמים, התוצאה היא אחסון יעיל הרבה יותר של מידע קווי המתאר.
_, קווי מתאר, היררכיה = cv2.findContours (קצוות, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
בקוד הנ"ל cv2.RETR_EXTERNAL הוא מצב האחזור בעוד cv2.CHAIN_APPROX_NONE הוא
שיטת הקירוב.
אז למדנו על קווי מתאר ושיטת קירוב, עכשיו בואו נחקור מצב היררכיה ואחזור.
2. מצב היררכיה ואחזור
מצב אחזור מגדיר את ההיררכיה בקווי מתאר כמו קווי מתאר, או קווי מתאר חיצוניים או כל קווי המתאר.
כעת ישנם ארבעה מצבי אחזור הממוינים לפי סוגי ההיררכיה.
cv2.RETR_LIST - מאחזר את כל קווי המתאר.
cv2.RETR_EXTERNAL - מאחזר קווי מתאר חיצוניים או חיצוניים בלבד.
cv2.RETR_CCOMP - מאחזר הכל בהיררכיה דו-מפלסית.
cv2.RETR_TREE - מאחזר הכל בהיררכיה מלאה.
היררכיה נשמרת בפורמט הבא
בואו נמחיש את ההבדל בין שני מצבי האחזור הראשונים, cv2.RETR_LIST ו- cv2.RETR_EXTERNAL.
cv2 יבוא יבוא numpy כפי NP
בואו לטעון תמונה פשוטה עם 3 ריבועים שחורים
תמונה = cv2.imread ('מרובע סופגנייה.jpg') cv2.imshow ('תמונת קלט', תמונה) cv2.waitKey (0)
גווני אפור
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
מצא את Canny Edges
קצוות = cv2.Canny (אפור, 30,200) cv2.imshow ('קצוות מסוכנים ', קצוות) cv2.waitKey (0)
מציאת קווי מתאר
# השתמש בעותק של התמונה שלך, למשל - edged.copy (), מכיוון שמציאת קווי מתאר משנה את התמונה # עלינו להוסיף _, לפני קווי המתאר כארגומנט ריק עקב שדרוג גרסת ה- cv הפתוחה _, קווי המתאר, ההיררכיה = cv2.findContours (קצוות, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('קצוות מסורבלים לאחר מתאר', קצה) cv2.waitKey (0)
הדפסת קובץ המתאר כדי לדעת ממה מורכב קווי המתאר.
הדפס (קווי מתאר) הדפס ('מספר קווי המתאר נמצאו =' + str (len (קווי המתאר)))
צייר את כל קווי המתאר
# שימוש -1 כפרמטר השלישי לציור כל קווי המתאר cv2.drawContours (תמונה, קווי מתאר, -1, (0,255,0), 3) cv2.imshow ('קווי מתאר, תמונה) cv2.waitKey (0) cv2. להרוס AllWindows
cv2 יבוא יבוא numpy כפי NP
בואו לטעון תמונה פשוטה עם 3 ריבועים שחורים
תמונה = cv2.imread ('מרובע סופגנייה.jpg') cv2.imshow ('תמונת קלט', תמונה) cv2.waitKey (0)
גווני אפור
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
מצא קצוות מסוככים
קצוות = cv2.Canny (אפור, 30,200) cv2.imshow ('קצוות מסוכנים ', קצוות) cv2.waitKey (0)
מציאת קווי מתאר
# השתמש בעותק של התמונה שלך, למשל - edged.copy (), מכיוון שמציאת קווי מתאר משנה את התמונה # עלינו להוסיף _ לפני קווי המתאר כארגומנט ריק עקב שדרוג גרסת ה- cv הפתוחה _, קווי המתאר, ההיררכיה = cv2.findContours (קצוות, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('קצוות מסורבלים לאחר מתאר', קצה) cv2.waitKey (0)
הדפסת קובץ המתאר כדי לדעת ממה מורכב קווי המתאר.
הדפס (קווי מתאר) הדפס ('מספר קווי המתאר נמצאו =' + str (len (קווי המתאר)))
צייר את כל קווי המתאר
# שימוש -1 כפרמטר השלישי לציור כל קווי המתאר cv2.drawContours (תמונה, קווי מתאר, -1, (0,255,0), 3) cv2.imshow ('קווי מתאר, תמונה) cv2.waitKey (0) cv2. destroyAllWindows ()
כך שבאמצעות הדגמת הקודים לעיל יכולנו לראות בבירור את ההבדל בין cv2.RETR_LIST ל- cv2.RETR_EXTERNNAL , ב- cv2.RETR_EXTERNNAL רק קווי המתאר החיצוניים נלקחים בחשבון בזמן שמתעלמים מהקווי המתאר הפנימיים.
בעוד ב- cv2.RETR_LIST לוקחים בחשבון גם קווי מתאר פנימיים.
3. קירוב קווי מתאר ומציאת גוף הקמור שלהם
בקווי מתאר מקורבים, צורת קונטור משוערת על פני צורת קונטור אחרת, שאולי לא דומה הרבה לצורת המתאר הראשונה.
עבור קירוב אנו משתמשים approxPolyDP פונקציה של OpenCV אשר כמוסבר להלן
cv2.approxPolyDP (מתאר, דיוק קירוב, סגור)
פרמטרים:
- קונטור - הוא קו המתאר האישי שאנו רוצים לקבוע.
- דיוק קירוב - פרמטר חשוב בקביעת דיוק הקירוב, ערך קטן נותן קירוב מדויק, ערכים גדולים נותנים מידע גנרי יותר. כלל אגודל טוב הוא פחות מ -5% מהיקף המתאר.
- סגור - ערך בוליאני הקובע אם קו המתאר המשוער יכול להיות פתוח או סגור.
בואו ננסה לערוך דמות פשוטה של בית
לייבא numpy כפי NP cv2 יבוא
טען את התמונה ושמור עותק
תמונה = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('תמונה מקורית', orig_image) cv2.waitKey (0)
גווני אפור ובינארי את התמונה
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (אפור, 127,255, cv2.THRESH_BINARY_INV)
מצא קווי מתאר
_, קווי מתאר, היררכיה = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
חזרו דרך כל קו מתאר וחישבו את מלבן התוחם שלהם
עבור c בקווי המתאר: x, y, w, h = cv2.boundingRect (c) cv2. מלבן (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('גבול ישר', orig_image) cv2.waitKey (0)
חזרו דרך כל קו מתאר וחישבו את קו המתאר הקירוב
עבור c בקווי מתאר:
# חשב דיוק כאחוז מהדיוק בהיקף המתאר = 0.03 * cv2.arcLength (c, True) כ = cv2.approxPolyDP (c, precision , True) cv2.drawContours (תמונה,, 0, (0,255,0), 2) cv2.imshow ('בערך polyDP', תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
4. גבעול קמור
גוף קמור הוא בעצם הקצוות החיצוניים, המיוצגים על ידי ציור קווים מעל דמות נתונה.
זה יכול להיות המצולע הקטן ביותר שיכול להתאים לאובייקט עצמו.
ייבוא cv2 ייבא מטומטם כתמונת np = cv2.imread ('star.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) cv2.imshow ('תמונה מקורית', תמונה) cv2.waitKey (0)
סף את התמונה
ret, thresh = cv2.threshold (אפור, 176,255,0)
מצא קווי מתאר
_, קווי מתאר, היררכיה = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
מיין את קווי המתאר לפי אזור ואז הסר את קו המתאר הגדול ביותר
n = len (קווי מתאר) -1 קווי מתאר = ממוינים (קווי מתאר, מפתח = cv2.contourArea, הפוך = False)
חזרו דרך קווי המתאר וציירו גוף קמור
עבור c בקווי מתאר:
גוף = cv2.convexHull (c) cv2.drawContours (תמונה,, 0, (0,255,0), 2) cv2.imshow ('גוף קמור', תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
5. התאמת קווי המתאר לפי צורות
cv2.matchShapes (תבנית מתאר, שיטת מתאר, פרמטר שיטה)
פלט - ערך התאמה (ערך נמוך יותר פירושו התאמה קרובה יותר)
תבנית קונטור - זהו קו המתאר שלנו שאנו מנסים למצוא בתמונה חדשה.
קו מתאר - קו המתאר האישי שאליו אנו בודקים.
שיטה - סוג התאמת קווי המתאר (1,2,3).
פרמטר שיטה - השאר לבד כ- 0.0 (לא מנוצל ב- python opencv)
cv2 יבוא יבוא numpy כפי NP
טען את תבנית הצורה או את תמונת ההתייחסות
תבנית = cv2.imread ('star.jpg', 0) cv2.imshow ('תבנית', תבנית) cv2.waitKey (0)
טען את תמונת היעד בצורות שאנו מנסים להתאים
target = cv2.imread ('shapestomatch.jpg') אפור = cv2.cvtColor (יעד, cv2.COLOR_BGR2GRAY)
סף תחילה את שתי התמונות לפני השימוש ב- cv2.findContours
ret, thresh1 = cv2.threshold (תבנית, 127,255,0) ret, thresh2 = cv2.threshold (אפור, 127,255,0)
מצא קווי מתאר בתבנית
_, קווי מתאר, הירארה = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # עלינו למיין את קווי המתאר לפי שטח כדי שנוכל להסיר את קווי המתאר הגדולים ביותר שהם
מתאר תמונה
sorted_contours = מיון (קווי מתאר, מפתח = cv2.contourArea, הפוך = True) # אנו מחלצים את קווי המתאר השניים בגודלם אשר יהיו קווי המתאר של התבנית שלנו tempelate_contour = קווי המתאר # לחלץ את קווי המתאר מתמונת היעד השנייה _, קווי מתאר, היררכיה = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) עבור ג בקווי מתאר: #iterate דרך כל הגובה cv2.matchShape תמונה ושימוש היעד להשוות את הצורה קונטור המשחק = cv2.matchShapes (tempelate_contour, ג, 1,0.0) הדפסה ("התאמה") # אם ערך ההתאמה קטן מ- 0.15 אם ההתאמה <0.16: קרוב_קונטור = c אחר: קרוב_קונטור = cv2.drawContours (יעד,, - 1, (0,255,0), 3) cv2.imshow ('פלט',יַעַד) cv2.waitKey (0) cv2.destroyAllWindows ()
תפוקת קונסולה -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
ישנן שלוש שיטות שונות עם פונקציה שונה במתמטיקה, אנו יכולים להתנסות בכל שיטה על ידי החלפת ערכי השיטה cv2.matchShapes (tempelate_contour, c, 1, 0.0) המשתנים בין 1,2 ל- 3, עבור כל ערך תקבלו התאמה שונה ערכים בפלט המסוף.
6. זיהוי צורות (מעגל, מלבן, משולש, ריבוע, כוכב)
OpenCV יכול לשמש גם לזיהוי סוגים שונים של צורות באופן אוטומטי מהתמונה. על ידי שימוש בקוד למטה נוכל לזהות עיגול, מלבן, משולש, ריבוע וכוכבים מהתמונה.
cv2 יבוא יבוא numpy כפי NP
טען ואז תמונות בקנה מידה אפור
תמונה = cv2.imread ('shapes.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) cv2.imshow ('זיהוי צורות', תמונה) cv2.waitKey (0) ret, thresh = cv2. סף (אפור 127,255,1)
חלץ קווי מתאר
_, קווי מתאר, היררכיה = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
עבור cnt בקווי המתאר:
קבל מצולעים משוערים בערך = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True) אם len (כ) == 3: shape_name = "משולש" cv2.drawContours (תמונה,, 0, (0,255, 0), - 1)
מצא מרכז מתאר כדי להציב טקסט במרכז
M = cv2. רגעים (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (תמונה, שם צורה, (cx-50, cy), cv2. FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (בערך) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2. רגעים (cnt) cx = int (M / M) cy = int (M /M)
בדוק אם המצולע הארבעה צדדי הוא מרובע או מלבן
# cv2.boundingRect להחזיר את הרוחב והגובה השמאלי בפיקסלים, החל מהפינה העליונה # שמאלה, עבור ריבוע זה יהיה בערך זהה אם שרירי הבטן (wh) <= 3: shape_name = "square" # מצא את מרכז המתאר כדי למקם טקסט מרכז cv2.drawContours (תמונה,, 0, (0,125,255), - 1) cv2.putText (תמונה, שם צורה, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) אחר: shape_name = "Reactangle" # מצא מרכז קווי מתאר כדי להציב טקסט במרכז cv2.drawContours (תמונה,, 0, (0,0,255), - 1) M = cv2. רגעים (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (תמונה, שם צורה, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (כ) == 10: צורת שם = 'כוכב' cv2.drawContours (תמונה,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (תמונה, שם צורה, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (בערך)> = 15: shape_name = 'מעגל' cv2.drawContours (תמונה,, 0, (0,255,255), -1) M = cv2. רגעים (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (תמונה, שם צורה, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('זיהוי צורות', תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
7. איתור קווים
איתור קווים הוא מושג חשוב מאוד ב- OpenCV, ויש לו שימוש מבטיח בעולם האמיתי. מכוניות אוטונומיות משתמשות באלגוריתמים לזיהוי קווים לזיהוי נתיבים ודרכים.
בזיהוי קו נעסוק בשני אלגוריתמים,
- אלגוריתם קו הוג
- אלגוריתם קו קו Hough פרובליסטי.
אולי זכרת את הייצוג של הקו ממתמטיקה בתיכון עם המשוואה, y = mx + c.
עם זאת, ב- OpenCV קו מיוצג בדרך אחרת
המשוואה מעל ρ = xcosӨ + ysincosӨ היא ייצוג ה- OpenCV של הקו, כאשר ρ הוא המרחק המאונך של הקו ממוצא ו- Ө היא הזווית שנוצרת על ידי הנורמה של קו זה למקור (נמדדת ברדיאנים, שבה רדיאנים 1pi / 180 = מעלה אחת).
פונקציית OpenCV לזיהוי קו ניתנת כ-
cv2.HoughLines (תמונה בינארית, דיוק ρ, Ө דיוק, סף), כאשר הסף הוא הצבעה מינימלית כדי שהוא ייחשב לקו.
עכשיו בואו לזהות קווים לתמונת תיבה בעזרת פונקציית קו Hough של opencv.
ייבוא cv2 יבוא numpy כפי NP תמונה = cv2.imread ('box.jpg')
גווני אפור ושוליים משומרים
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) קצוות = cv2.Canny (אפור, 100,170, apertureSize = 3)
הפעל קווים של Hough תוך שימוש ברמת דיוק של פיקסל אחד
# דיוק תטא של (np.pi / 180) שהוא 1 מעלה סף קו מוגדר ל- 240 (מספר נקודות על הקו) קווים = cv2. קו קווים (קצוות, 1, np.pi / 180, 240) # אנו חוזרים דרך כל שורה והמיר לפורמט # הנדרש על ידי cv2.lines (כלומר דורש נקודות סיום) עבור i בטווח (0, len (שורות)): עבור rho, תטא בשורות: a = np.cos (תטא) b = np.sin (תטא) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (תמונה, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('שורות הוג', תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
בואו נחזור על זיהוי קו עם אלגוריתם אחר של קו Hough הסתברותי.
הרעיון העומד מאחורי קו Hough ההסתברותי הוא לקחת תת קבוצה אקראית של נקודות המספיקות לזיהוי קו.
פונקציית OpenCV עבור קו Hough הסתברותי מיוצגת כ- cv2.HoughLinesP (תמונה בינארית, דיוק ρ, Ө דיוק, סף, אורך קו מינימלי, פער קו מקסימלי)
עכשיו בואו לזהות קווי תיבות בעזרת קווי Hough הסתברותיים.
cv2 יבוא יבוא numpy כפי NP
גווני אפור ושוליים מסותתים
תמונה = cv2.imread ('box.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) קצוות = cv2.Canny (אפור, 50,150, apertureSize = 3) # שוב אנו משתמשים באותם דיוקי rho ותטא # עם זאת, אנו מציינים הצבעה מינימלית (נק 'לאורך הקו) של 100 # ואורך קו מינימלי של 5 פיקסלים ורווח מקסימלי בין השורות של 10 פיקסלים קווים = cv2.HoughLinesP (קצוות, 1, np.pi / 180,100,100,10) עבור i בטווח (0, len (שורות)): עבור x1, y1, x2, y2 בשורות: cv2.line (תמונה, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('קווי Hough פרובליסטיים', תמונה) cv2.waitKey (0) cv2.destroyAllWindows
8. זיהוי כתמים
ניתן לתאר כתמים כקבוצה של פיקסלים מחוברים שכולם חולקים נכס משותף. השיטה לשימוש בגלאי כתמים OpenCV מתוארת באמצעות תרשים זרימה זה.
לציור נקודות המפתח אנו משתמשים ב- cv2.drawKeypoints שלוקח את הטיעונים הבאים.
cv2.drawKeypoints (תמונת קלט, מקשי מקש, array_output_array, צבע, דגלים)
היכן שבדגלים יכול להיות
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
ו ריק כאן הוא פחות או יותר כלום אבל אחד על ידי מטריקס אחד אפסים
עכשיו בואו לבצע את איתור הכמות על תמונה של חמניות, כאשר הכוכבים יהיו החלקים המרכזיים של הפרח כפי שהם נפוצים בין כל הפרחים.
ייבוא cv2 יבוא numpy כפי NP תמונה = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
הגדר גלאי עם פרמטרי ברירת מחדל
גלאי = cv2.SimpleBlobDetector_create ()
לזהות כתמים
נקודות מפתח = גלאי. איתור (תמונה)
צייר כתמים שזוהו כעיגולים אדומים
# cv2. DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS וודא כי גודל הגודל של המעגל תואם לגודל של blob blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2.DRAW_S)
הראה מקשי מקשים
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
למרות שהקוד עובד בסדר, אך חלק מהכתמים מתפספסים בגלל גדלים לא אחידים של הפרחים מכיוון שהפרחים מלפנים גדולים בהשוואה לפרחים בסוף.
9. סינון הכוסות - ספירת מעגלים ואליפסות
אנו יכולים להשתמש בפרמטרים לסינון כתמים על פי צורתם, גודלם וצבעם. לשימוש בפרמטרים עם גלאי כתמים אנו משתמשים בפונקציה של OpenCV
cv2.SimpleBlobDetector_Params ()
נראה את סינון הכמות על ידי בעיקר ארבעת הפרמטרים הבאים:
אֵזוֹר
params.filterByArea = נכון / לא נכון params.minArea = פיקסלים params.maxArea = פיקסלים
מעגליות
params.filterByCircularity = נכון / לא נכון params.minCircularity = 1 מושלם, 0 הפוך
קמורה - שטח כתם / אזור גוף קמור
params.filterByConvexity = נכון / לא נכון params.minConvexity = שטח
אִינֶרצִיָה
params.filterByInertia = נכון / שקר params.minInertiaRatio = 0.01
בואו ננסה לסנן כתמים לפי הפרמטרים שהוזכרו לעיל
ייבא cv2 ייבא טשטוש כתמונת np = cv2.imread ('blobs.jpg') cv2.imshow ('תמונה מקורית', תמונה) cv2.waitKey (0)
אתחל את הגלאי באמצעות פרמטרי ברירת מחדל
גלאי = cv2.SimpleBlobDetector_create ()
לזהות כתמים
נקודות מפתח = גלאי. איתור (תמונה)
צייר כתמים על התמונה שלנו כעיגולים אדומים
ריק = np.zeros ((1,1)) כתמים = cv2.drawKeypoints (תמונה, keypoints, ריק, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "אין הכולל של כתמים" + str (len ( מקשים)) cv2.putText (כתמים, טקסט, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
הצג תמונה עם מקשי מקש כתמים
cv2.imshow ('blob באמצעות פרמטרי ברירת מחדל', blobs) cv2.waitKey (0)
הגדר את פרמטרי הסינון שלנו
#initialize הגדרת פרמטר באמצעות cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
הגדר פרמטרים לסינון שטח
params.filterByArea = params.minArea אמיתי = 100
הגדר פרמטרים לסינון מעגליות
params.filterByCircularity = params.minCircularity אמיתי = 0.9
הגדר פרמטר לסינון קמור
params.filterByConvexity = params.minConvexity שקרי = 0.2
הגדר פרמטר סינון אינרציה
params.filterByInertia = params.minInertiaRatio אמיתי = 0.01
צור גלאי עם פרמטר
גלאי = cv2.SimpleBlobDetector_create (params)
לזהות כתמים
נקודות מפתח = גלאי. איתור (תמונה)
צייר כתמים על התמונות כעיגולים אדומים
ריק = np.zeros ((1,1)) כתמים = cv2.drawKeypoints (תמונה, keypoints, ריק, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "אין הכולל של כתמים עגולים" + str (len ( מקשים)) cv2.putText (כתמים, טקסט, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
הראה כתמים
cv2.imshow ('סינון כתמים מעגליים', כתמים) cv2.waitKey (0) cv2.destroyAllWindows ()
אז ככה אפשר לעשות פילוח תמונות בפייתון-OpenCV. כדי להמעיט בערך הראייה במחשבים וב- OpenCV, עברו על מאמרים קודמים (תחילת העבודה עם פייתון OpenCV ותמונות מניפולציות בפייתון OpenCV ותוכלו להפוך משהו מגניב עם Vision Computer.