- מהן תמונות?
- איך המחשב מאחסן תמונות
- מדוע קשה למכונה לזהות תמונות
- יישום ושימושים ב- OpenCV
- התקנת OpenCV עם Python ו- Anaconda
- פתיחה ושמירה של תמונות ב- OpenCV
- תמונה בקנה מידה אפור ב- OpenCV
- מרחבי צבע
- חקר רכיבים בודדים של תמונת RGB
- המרת תמונה לרכיב RGB בודד
- ייצוג ההיסטוגרמה של התמונה
- ציור תמונות וצורות באמצעות OpenCV
אמנות היא דרך לראות, והם אומרים לראות זה להאמין, אבל ההיפך הוא הנכון, האמונה היא לראות וזה באמת קשה לדמיין לחיות בעולם הזה בלי מתנת הראייה - העיניים שלנו, כמה נפלא זה להיות תינוק כשעינינו פשוט נפתחות אנו רואים את העולם והתחלנו להכיר ולראות את העולם סביבנו אך ככל שחולף הזמן, אותה חוויה נפלאה הופכת לחוויה שגרתית. אך ככל שאנו מתקדמים עם הטכנולוגיה אנו נמצאים על סף שבו המכונות גם מסוגלות לראות ולהבין אותה. נכון לעכשיו, זה לא נראה מדע בדיוני אם אתה פשוט פותח את הטלפון שלך עם הפנים שלך, אבל סיפור התפתחות חזון המכונה מתוארך כבר למעלה מ -20 שנה.
הצעד הרשמי הראשוני בתחום זה הוחזר בשנת 1999 ביוזמת אינטל, כאשר כל המחקרים שנעשו שיתפו פעולה במסגרת OPEN CV (ראיית מחשב קוד פתוח), שנכתב במקור ב- C ++, עם המהדורה העיקרית הראשונה 1.0 1.0 בשנת 2006 שנייה. בשנת 2009, השלישי בשנת 2015 והרביעי רק עכשיו בשנת 2018. כעת יש ל- OpenCV ממשקי C ++, Python ו- Java ותומכים ב- Windows, Linux, Mac OS, iOS ו- Android. כך שניתן להתקין אותו בקלות ב- Raspberry Pi עם פייתון וסביבת לינוקס. ו- Raspberry Pi עם OpenCV ומצלמה מחוברת יכולים לשמש ליצירת יישומי עיבוד תמונה רבים בזמן אמת כמו זיהוי פנים, נעילת פנים, מעקב אחר אובייקטים, זיהוי לוחית מספר רכב, מערכת אבטחה לבית וכו '.
לפני שנלמד ללמוד עיבוד תמונה באמצעות openCV חשוב לדעת מהן תמונות וכיצד בני האדם והמכונות תופסים את התמונות הללו.
מהן תמונות?
תמונות הן ייצוג דו מימדי של ספקטרום האור הגלוי. וספקטרום האור הגלוי הוא רק חלק מהספקטרום האלקטרומגנטי השוכן שם בין ספקטרום אינפרא אדום לאולטרה סגול.
כיצד נוצרות תמונות: - כאשר אור מחזיר עצם אל סרט, חיישן או על רשתית.
כך עובדות העיניים שלנו, באמצעות מחסום כדי לחסום את נקודת האורות ביותר שמשאירה פתח קטן שדרכו האור יכול לעבור זה נקרא כצמצם, והוא יוצר תמונה ממוקדת בהרבה ומהווה מודל עובד למצלמת חור סיכה, אבל יש בעיה במצלמת חור עם סיכה, שאותה כמות אור תיכנס לצמצם, שלא יכול היה להתאים לסרט או לתמונה שנוצרה. אנחנו גם לא יכולים לקבל תמונה ממוקדת, כדי למקד את התמונה שאנחנו צריך להעביר סרט קדימה ואחורה, אבל זה בעייתי במצבים רבים.
לחלופין נוכל לפתור בעיה זו באמצעות עדשות, היא מאפשרת לנו לשלוט על גודל הצמצם, ובצילום זה המכונה f Stop, בדרך כלל נמוך יותר הערך של f Stop עדיף בצילום.
גודל הצמצם מאפשר לנו גם להיכנס לעומק שדה נחמד שנקרא בוקה בצילום, זה מאפשר לנו לקבל רקע מטושטש בזמן שאנחנו מתמקדים בתמונה.
איך המחשב מאחסן תמונות
אולי שמעתם על פורמטים שונים של תמונות כמו.png,.jpgG וכו 'כל אלה הם ייצוג דיגיטלי של העולם האנלוגי שלנו, מחשבים עושים זאת על ידי תרגום התמונה לקוד דיגיטלי לאחסון ואז פירוש הקובץ חזרה לתמונה עבור לְהַצִיג. אך ביסודות הם משתמשים בפלטפורמה משותפת לאחסון התמונות, וזה נכון לגבי ה- openCV.
OpenCV משתמש כברירת מחדל בצבעי RGB (אדום, ירוק וכחול) עבור תמונותיו, כאשר כל קואורדינטות פיקסל (x, y) מכילות 3 ערכים הנעים לעוצמות בצורת 8 סיביות כלומר (0-255, 2 8).
ערבוב עוצמות שונות של כל צבע נותן לנו את הספקטרום המלא, לכן בציור או באמנות נחשבים שלושת הצבעים הללו כצבעי יסוד וכל האחרים כמשניים, מכיוון שרוב הצבעים המשניים יכולים להיווצר על ידי צבעי יסוד. כמו לצהוב, יש לנו את הערכים הבאים: אדום - 255; ירוק - 255; כחול - 0.
כעת התמונות נשמרות במערכים רב מימדיים. בתכנות, מערך הוא סדרת אוסף של אובייקטים. וכאן אנו עוסקים בשלושה סוגים של מערכים 1D, 2D ו- 3D כאשר 'D' מייצג ממדי.
תמונות צבעוניות נשמרות במערכים תלת ממדיים, כאשר המידות השלישיות מייצגות את צבעי ה- RGB (אותם נראה בהמשך), וביחד הם יוצרים עוצמות שונות של פיקסלים לתמונה, ואילו התמונות בשחור-לבן מאוחסנות במערכים דו-ממדיים כמו כן ישנם שני סוגים של תמונות בשחור לבן תמונות בגווני אפור ותמונות בינאריות.
תמונות בגווני אפור נוצרות מגווני האפור של מערך דו מימדי, ואילו התמונות הבינאריות הן פיקסלים של שחור או לבן.
מדוע קשה למכונה לזהות תמונות
ראיית מחשב היא משימה מאתגרת בפני עצמה, אתה יכול לעצמך לדמיין כמה קשה לתת למכונה תחושה של חזון, זיהוי והזדהות. הגורמים הבאים נמצאים שם שהופכים את ראיית המחשב לקשה כל כך.
- מגבלות חיישן מצלמה ועדשות
- תצוגת נקודת מבט
- שינוי תאורה
- דֵרוּג
- חסימות
- וריאציות של סוג אובייקט
- תמונות דו משמעיות / אשליות אופטיות
יישום ושימושים ב- OpenCV
למרות הקושי, לראיית המחשב יש סיפורי הצלחה רבים
- ניווט רובוטי - מכוניות בנהיגה עצמית
- זיהוי פנים וזיהוי פנים
- חיפוש תמונות במנוע חיפוש
- קריאת לוחית רישוי
- זיהוי כתב יד
- מסנני Snapchat ופנים
- זיהוי אובייקט
- מעקב אחר כדור ושחקן בספורט
- ועוד רבים!
התקנת OpenCV עם Python ו- Anaconda
OpenCV כתוב ב- C ++, אבל קשה מאוד ליישם אותו עם C ++ ולכן אנו בוחרים ליישם אותו עם שפה ברמה גבוהה כ- Python, וגם ישנם יתרונות נוספים ביישום OpenCV עם Python מכיוון ש- Python היא אחת השפות הקלות ביותר למתחילים זה גם חזק מאוד עבור מדעי נתונים ויישומי למידת מכונה וגם מאחסן תמונות במערכים קהים מה שמאפשר לנו לבצע פעולות חזקות מאוד למדי.
תכנות בסיסי שימושי עם חשיפה למתמטיקה ברמת התיכון, מצלמת רשת, פייתון 2.7 או 3.6 (עדיפה על חבילת אנקונדה).
שלב 1. הורד והתקן את חבילת Anaconda Python
עבור אל: https://www.anaconda.com/download ובחר בהתאם למזג האוויר של המחשב שלך את חלונותיו, לינוקס או מק, ותוכל לבחור בגרסת פיתון 2.7 או פייתון 3.7 עבור מערכות 64 סיביות או מערכות 32 סיביות, אך כעת ימים רוב המערכת היא 64 סיביות.
הפצת אנקונדה של פיתון מגיעה יחד עם סטודיו Spyder, מחברות jupyter ו- anaconda prompt, מה שהופך את הפיתון לסופר ידידותי לשימוש. היינו משתמשים בסטודיו ספיידר לצורך ביצוע הדוגמאות.
הבחירה בין פיתון 2.7 או 3.7 היא ניטרלית לחלוטין, אך עם זאת, לדוגמאות אנו משתמשים בפייתון 3.7 מכיוון שזה העתיד של הפיתון וישתלט על פיתון 2.7 בצורה 2020, גם רוב הספריות מפותחות בשמירה על פיתון 3.7. ההיבט העתידי של הפיתון בראש. כמו כן הוא נותן את התוצאות הצפויות על פעולות מתמטיות בסיסיות כגון (2/5 = 2.5), ואילו הפיתון 2.7 יעריך אותו ל 2. כמו כן, מטפלים בהדפסה כפונקציה בפייתון 3.7 (הדפס ("שלום")), אז זה נותן מעשי למתכנתים.
שלב 2. יצירת פלטפורמה וירטואלית עם OpenCV
אנו הולכים להתקין את OpenCV על ידי יצירת פלטפורמה וירטואלית עבור spyder באמצעות הפקודה של אנקונדה וקובץ YML שהועלה לכאן.
עם קבצי ה- YML נתקין את כל החבילות והספריות הדרושות, אך עם זאת אם ברצונך להתקין חבילות נוספות תוכל להתקין בקלות באמצעות אנקונדה הנחיה, על ידי הפעלת הפקודה של אותה חבילה.
עבור לסמל החיפוש של Windows ומצא את מסוף הפקודה של אנקונדה, תוכל למצוא אותו בתוך תיקיית האנקונדה שהתקנת זה עתה.
אז אתה צריך למצוא את קובץ ה- YML שהורדת, ומכאן יש לך שתי אפשרויות לשנות את הספריה של המסוף שלך למיקום שבו קובץ ה- YML שלך הורד או להעתיק את קובץ ה- YML שלך לספרייה שבה רוב האינקונדה שלך מותקן. במקרים זה יהיה בתוך C: \ drive, לאחר העתקת קובץ YML למיקום שצוין, הפעל את הפקודה הבאה בהנחייתך
conda env ליצור –f virtual_platform_windows.yml
מכיוון שהמערכת שלי פועלת על חלונות קובץ ה- YML והפקודה תואמים לחלונות, אולם ניתן לשנות בהתאם למערכת שלך על ידי החלפת חלונות ב- Linux או Mac בהתאמה.
הערה: - אם מיצוי החבילה נותן שגיאה ניתן להתקין pytorch ו numpy הראשון ולאחר מכן הפעל את הפקודה הנ"ל.
עכשיו מצא את הנווט אנקונדה ויהיה תפריט נפתח של "יישומים ב- ___" ומשם בחר בסביבה וירטואלית ואז משם אתה צריך להפעיל את סטודיו Spyder.
וזהו, אתה מוכן להתחיל!
פתיחה ושמירה של תמונות ב- OpenCV
כאן אנו מסבירים כמה פקודות בסיסיות וטרמינולוגיה לשימוש בפייתון ב- OpenCV. נלמד על שלוש פונקציות בסיסיות ב- OpenCV imread, imshow ו- imwrite.
# הערות בפיתון ניתנות על ידי סמל #
ייבא opencv בפייתון לפי פקודה
ייבא cv2
טען תמונה באמצעות 'imread' המציין את הנתיב לתמונה
תמונה = cv2.imread ('input.jpg')
עכשיו התמונה הזו נטענת ומאוחסנת בפיתון כמשתנה ששמנו בשם תמונה
כעת כדי להציג את משתנה התמונה שלנו, אנו משתמשים ב- 'imshow' והפרמטר הראשון לפונקציית imshow הוא הכותרת המוצגת בחלון התמונה, ויש להזין אותה ב- ('') כדי לייצג את השם כמחרוזת
cv2.imshow ('שלום עולם', תמונה)
מקש המתנה מאפשר לנו להזין מידע כאשר חלון התמונה פתוח, על ידי השארתו ריקה הוא רק ממתין ללחיצה על מקש כלשהו לפני שממשיך, על ידי הצבת מספרים (למעט 0), אנו יכולים לציין עיכוב למשך הזמן שתשמור על החלון פתוח (זמן באלפיות השנייה כאן).
cv2.waitKey ()
'destroyAllWindows' סוגר את כל החלונות הפתוחים, אי הצבתו תגרום לתוכנית שלך להיתקע.
cv2.destroyAllWindows ()
, בשביל זה נשתמש ב- numpy, numpy היא ספרייה לתכנות פיתון להוספת תמיכה למערכים ולמטריצות רב מימדיות.
ייבא cv2 #importing numpy יבוא numpy כתמונת np = cv2.imread ('input.jpg') cv2.imshow ('שלום_עולם', תמונה) פונקציית #shape מאוד שימושית כשאנחנו מסתכלים על ממדים של מערך, זה מחזיר ציצית המעניקה מימד של הדפסת תמונה (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
פלט קונסולה - (183, 275, 3), שני הממדים של התמונה הם 183 פיקסלים בגובה ו -275 פיקסלים ברוחב ו- 3 פירושו שיש שלושה רכיבים נוספים (R, G, B) שהופכים את התמונה הזו (היא מראה שהתמונות הצבעוניות מאוחסנות במערכים תלת מימדיים).
הדפס ('גובה התמונה:', (תמונה.צורה, 'פיקסלים')) הדפס ('רוחב התמונה:', (תמונה.צורה, 'פיקסלים'))
פלט קונסולה - גובה התמונה: (183, 'פיקסלים')
רוחב התמונה: (275, 'פיקסלים')
שמירת התמונה הערוכה ב- OpenCV
אנו משתמשים ב- 'imwrite' כדי לציין את שם הקובץ ואת התמונה שיש לשמור.
cv2.imwrite ('output.jpg', תמונה) cv2.imwrite ('output.png', תמונה)
טיעון ראשון הוא שם הקובץ אותו אנו רוצים לשמור, {לקרוא או לשמור את הקובץ בו אנו משתמשים ('') כדי לציין אותו כמחרוזת} והארגומנט השני הוא שם הקובץ.
OpenCV מאפשר לשמור את התמונה בפורמטים שונים.
תמונה בקנה מידה אפור ב- OpenCV
Greyscaling הוא תהליך שבו דימוי מומר מתקופת צבע מלא גוונים של אפור (שחור ולבן)
ב- opencv, פונקציות רבות מאדידות את צבע התמונות לפני העיבוד. זה נעשה מכיוון שהוא מפשט את התמונה, מתנהג כמעט כהפחתת רעש ומגדיל את זמן העיבוד מכיוון שיש פחות מידע בתמונה (שכן תמונות בגווני אפור נשמרות במערכים דו ממדיים).
ייבא cv2 # טען את תמונת הקלט שלנו = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # אנו משתמשים ב- cvtcolor, כדי להמיר אפור גריי_אימג '= cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) cv2.imshow ('גווני אפור', תמונה אפור) cv2.waitKey () cv2.destroyALLWindows ()
דרך פשוטה יותר להמיר תמונה לגווני אפור היא פשוט להוסיף את הארגומנט 0 בפונקציה imread בצד לשם התמונה
ייבא cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('גווני אפור', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('input.jpg') הדפס (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('גווני אפור', אפור תמונה) הדפס (אפור תמונה.צורה ) cv2.waitKey () cv2.destroyALLWindows ()
פלט קונסולה: - (183, 275, 3) - לתמונה צבעונית
(183, 275) - לתמונה בגווני אפור
מכאן שהוא מראה בבירור שהתמונות הצבעוניות מיוצגות על ידי מערכים תלת מימדיים, ואילו התמונות בקנה מידה אפור על ידי מערכים דו מימדיים.
מרחבי צבע
חללי צבע הם אופן שמירת התמונות. RGB, HSV, CMYK הם מרחבי הצבעים השונים, אלה רק דרכים פשוטות לייצג צבע.
RGB - אדום, ירוק וכחול.
HSV - גוון, רוויה וערך.
וזה CMYK הוא נפוץ דיו למדפסות.
שטח צבעים RGB או BGR
שטח הצבעים המוגדר כברירת מחדל של OpenCV הוא RGB. RGB הוא מודל צבע תוסף המייצר צבעים על ידי שילוב צבעים כחולים, ירוקים ואדומים בעוצמות / בהירות שונות. ב- OpenCV אנו משתמשים בעומק צבע של 8 סיביות.
- אדום (0-255)
- כחול (0-255)
- ירוק (0-255)
עם זאת OpenCV למעשה מאחסן צבע בפורמט BGR.
עובדה מהנה: - אנו משתמשים בסדר BGR במחשבים בשל האופן שבו שמורים מספרים שלמים של 32 סיביות לא חתומים בזיכרון, אך זה עדיין מאוחסן כ- RGB. המספר השלם המייצג צבע למשל: - 0X00BBGGRR יישמר כ- 0XRRGGBB.
שטח צבע HSVHSV (גוון, רוויה וערך / בהירות) הוא מרחב צבע המנסה לייצג צבעים שבני האדם תופסים אותו. הוא מאחסן מידע צבעוני בייצוג גלילי של נקודות צבע RGB.
גוון - ערך צבע (0-179)
רוויה - תוססת צבע (0-255)
ערך - בהירות או עוצמה (0-255)
פורמט שטח צבע HSV שימושי בפילוח צבעים. ב- RGB, סינון של צבע ספציפי אינו קל, אולם HSV מקל על הגדרת טווחי צבע לסינון צבע ספציפי כפי שאנו תופסים אותם.
גוון מייצג את הצבע ב- HSV, ערך הגוון נע בין 0 - 180 ולא 360 ולכן הוא לא משלים את המעגל המלא ולכן הוא ממופה אחרת מהסטנדרט.
מסנני טווח צבעים
- אדום - (165-15)
- ירוק - (45-75)
- כחול - (90-120)
כידוע התמונות המאוחסנות בחלל צבעים RGB (אדום, ירוק וכחול) וכך OpenCV מראה לנו את אותו הדבר, אך הדבר הראשון שיש לזכור לגבי פורמט ה- RGB של opencv הוא שהוא למעשה BGR ואנחנו יכולים לדעת זאת על ידי הסתכלות על צורת תמונה.
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('input.jpg') ערך B, G, R עבור הדפסה ראשונה של 0,0 פיקסל B, G, R = הדפסת תמונה (B, G, R) (תמונה. צורה ) # עכשיו אם אנו מיישמים זאת על תמונה בגווני אפור אפור_ימג = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY) הדפסה (אפור_אמיג.צורה) # אפור_ערך פיקסל תמונה להדפסה של 10,50 פיקסלים (אפור_אימג)
פלט קונסולה: הדפסה (B, G, R) - 6 11 10
הדפס (image.shape) - (183, 275, 3)
הדפס (אפור_צורה) - (183, 275)
69. הדפס (אפור_אימג) - 69
עכשיו יש רק שני ממדים בתמונה בקנה מידה אפור, מכיוון שאנחנו זוכרים שתמונת הצבע מאוחסנת בתלת מימד, והמימד השלישי הוא (R, G, B) ואילו בקנה מידה אפור קיימים רק שני ממדים, שכן (R, G, B) נעדר ולמיקום פיקסל מסוים אנו מקבלים רק ערך בודד ואילו בתמונה צבעונית קיבלנו שלושה ערכים.
מרחב צבעים שימושי נוסף הוא HSV
ייבא תמונה cv2 = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (תמונה, cv2.COLOR_BGR2HSV) cv2.imshow ('תמונת HSV', hsv_image) cv2.imshow ('ערוץ גוון', hsv_image) cv2. imshow ('ערוץ רוויה', hsv_image) cv2.imshow ('ערוץ ערך', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
לאחר הפעלת הקוד ניתן לראות את ארבע התמונות אשר שלוש מהן מהערוצים הבודדים ואחת משולבת בתמונת HSV.
תמונת ערוץ הגוון כהה למדי מכיוון שערכה משתנה רק בין 0 ל -180.
כמו כן, שים לב כי פונקציית imshow מנסה להראות לך את תמונת RGB או BGR, אך המרת HSV חופפת אותה.
כמו כן, ערוץ הערך יהיה דומה לאפור התמונה בשל בהירותו.
חקר רכיבים בודדים של תמונת RGB
ייבא תמונה cv2 = cv2.imread ('input.jpg') # פונקציית הפיצול של opencv מפצלת את התמונה לכל אינדקס צבע B, G, R = cv2.split (תמונה) cv2.imshow ("אדום", R) cv2.imshow ("ירוק", G) cv2.imshow ("כחול", B) # יצירת התמונה המקורית על ידי מיזוג רכיבי הצבע הבודדים מוזג = cv2.merge () cv2.imshow ("מוזג", מוזג) # הגברת הצבע הכחול מוזג = cv2.merge () cv2.imshow ("מוזג עם הגברה כחולה", מוזג) # מייצג את הצורה של רכיבי צבע בודדים. # הפלט יהיה דו-ממדי בלבד אשר יהיה גובה ורוחב, מכיוון שהאלמנט השלישי של רכיב RGB מיוצג באופן אינדיבידואלי הדפסה (B. צורה) .צורה) הדפס (G. צורה) cv2.waitKey (0) cv2.destroyAllWindows ()
פלט קונסולה: # ממדים של תמונה מפונקציית הצורה
(183, 275)
(183, 275)
(183, 275)
המרת תמונה לרכיב RGB בודד
בקוד למטה יצרנו מטריצה של אפסים עם ממדי התמונה HxW, אפס מחזיר מערך מלא באפסים אך עם אותם מידות.
פונקציית צורה מאוד שימושית כאשר אנו בוחנים את ממד התמונה, וכאן עשינו חיתוך של פונקציית הצורה הזו. אז הצורה תתפוס הכל עד לנקודות המיועדות כלומר עד לנקודות ייעודיות שניות שיהיו גובה ורוחב התמונה כשלישית מייצג רכיב RGB של תמונה ואיננו זקוקים לה כאן.
ייבא cv2 ייבא מטומטם כתמונת np = cv2.imread ('input.jpg') B, G, R = cv2.split (תמונה) אפסים = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("אדום", cv2.merge ()) cv2.imshow ("ירוק", cv2.merge ()) cv2.imshow ("כחול", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
ייצוג ההיסטוגרמה של התמונה
ייצוג היסטוגרמה של תמונה הוא שיטת הדמיית רכיבי התמונות.
הקוד הבא מאפשר לך לנתח את התמונה באמצעות היסטוגרמת הצבעים של רכיבי הצבע המשולבים והנפרדים שלה.
ייבא cv2 ייבא מטומטם כמו np # עלינו לייבא matplotlib כדי ליצור עלילות היסטוגרמה ייבא matplotlib.pyplot כתמונת plt = cv2.imread ('input.jpg') היסטוגרמה = cv2.calcHist (,, אף אחד,,) # אנו מתכננים a היסטוגרמה, ראבל () משטח את מערך התמונות שלנו plt.hist (image.ravel (), 256,) plt.show ( ) # צופה בערוצי צבע נפרדים color = ('b', 'g', 'r') # אנו יודעים להפריד את הצבע ולשרטט כל אחד מהם בהיסטוגרמה עבור i, col בספירה (צבע): histogram2 = cv2.calcHist (,, אף אחד,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
בואו נבין את פונקציית calcHist עם כל אחד מהפרמטרים האישיים שלה
cv2.calcHist (תמונות, ערוצים, מסכה, גודל גודל , טווחים)
תמונות: זו תמונת המקור של סוג uint 8 או float 32. היא צריכה להינתן בסוגריים מרובעים, כלומר "", המציינים גם את מערך הרמה השנייה שלה מכיוון שתמונה עבור opencv היא נתונים בצורת מערך.
ערוצים: הוא ניתן גם בסוגריים מרובעים. זהו אינדקס הערוץ שעבורו אנו משנים היסטוגרמה, למשל אם קלט הוא תמונה בגווני אפור הערך שלו הוא עבור תמונות צבעוניות שתוכל לעבור, או לחישוב היסטוגרמה של ערוץ כחול, ירוק ואדום בהתאמה.
מסכה: מסכת תמונה. כדי למצוא את ההיסטוגרמה של התמונה המלאה, היא ניתנת כ"אין ". אך אם ברצונך למצוא את ההיסטוגרמה של אזור מסוים של התמונה, עליך ליצור תמונת מסכה לשם כך ולתת אותה כמסיכה.
גודל גודל: זה מייצג את ספירת ה- BIN שלנו. נדרש לתת בסוגריים מרובעים לקנה מידה מלא שאנו עוברים.
טווחים: זה הטווח שלנו, בדרך כלל
ציור תמונות וצורות באמצעות OpenCV
להלן מספר דוגמאות לשרטוט קווים, מלבן, מצולע, מעגל וכו 'ב- OpenCV.
ייבא cv2 ייבא מטומטם כ- np # יצירת תמונה מרובעת שחורה = np.zeros ((512,512,3), np.uint8) # אנו יכולים ליצור זאת גם בשחור-לבן, אולם לא יהיו שינויים image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("מלבן שחור (צבע)", תמונה) cv2.imshow ("מלבן שחור (שחור-לבן)", image_bw)
קַו
# צור קו מעל ריבוע שחור # cv2.line (תמונה, קואורדינטות התחלה, קואורדינטות סיום, צבע, עובי) # ציור קו אלכסוני בעובי 5 פיקסלים image = np.zeros ((512,512,3), np.uint8) cv2.line (תמונה, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("קו כחול", תמונה)
מַלבֵּן
# צור מלבן על פני ריבוע שחור # cv2. מלבן (תמונה, קואורדינטות התחלה, קואורדינטות סיום, צבע, עובי) # ציור מלבן בעובי 5 פיקסלים image = np.zeros ((512,512,3), np.uint8) cv2 מלבן (תמונה, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("מלבן", תמונה)
מעגל# יצירה של עיגול מעל ריבוע שחור # cv2.circle (תמונה, מרכז, רדיוס, צבע, מילוי) image = np. zero ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("מעגל", תמונה)
מְצוּלָע# יצירת תמונת מצולע = np.zeros ((512,512,3), np.uint8) #lets מגדירים ארבע נקודות pts = np.array (,,,], np.int32) #lets מעצבים מחדש את הנקודות שלנו בצורה הנדרשת על ידי קווים מרובים נק = pts.reshape ((- 1,1,2)) cv2.polylines (תמונה,, נכון, (0,255,255), 3) cv2.imshow ("פוליגון", תמונה)
טֶקסט# הצבת טקסט באמצעות opencv # cv2.putText (תמונה, 'טקסט לתצוגה', נקודת ההתחלה השמאלית של bootom, גופן, גודל גופן, צבע, עובי) תמונה = np.zeros ((512,512,3), np.uint8) cv2. putText (תמונה, "שלום עולם", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("שלום עולם", תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
ראיית המחשבים ו- OpenCV הם נושאים עצומים מאוד לסיקור, אך מדריך זה יכול להיות נקודת התחלה טובה ללמוד OpenCV ועיבוד תמונה.