- 1. טרנספורמציות דימוי - טרנספורמציה של זיקה ולא של זיקה
- 2. תרגומי תמונות - העברת תמונה מעלה, מטה, שמאלה וימינה
- 3. סיבוב תמונה - סיבוב התמונה
- 4. שינוי גודל, שינוי גודל ואינטרפולציה
- 5. פירמידות תמונה - דרך נוספת לשינוי גודל
- 6. חיתוך - גזירת אזור התמונה הרצוי
- 7. פעולות חשבון להבהרה ולהכהת תמונות
בשנת ההדרכה הקודמת, למדנו על OpenCV וערכנו כמה תמונה בסיסית עיבוד באמצעות אותו כמו קנה מידה אפורה, רוויית צבעים, היסטוגרמה, מרחבי צבע, מרכיב RGB וכו ', כמסופר בספר ההדרכה הקודמת, OpenCV היא ספריית חזון Commuter קוד פתוח אשר יש ממשקי C ++, Python ו- Java ותומכים ב- Windows, Linux, Mac OS, iOS ו- Android. כך שניתן להתקין אותו בקלות ב- Raspberry Pi עם פייתון וסביבת לינוקס. ו- Raspberry Pi עם OpenCV ומצלמה מחוברת יכולים לשמש ליצירת יישומי עיבוד תמונה רבים בזמן אמת כמו זיהוי פנים, נעילת פנים, מעקב אחר אובייקטים, זיהוי לוחית מספר רכב, מערכת אבטחה לבית וכו '
במדריך זה אנו הולכים לראות כיצד אנו מתכוונים לתפעל את התמונה באמצעות OpenCV. כאן נלמד להחיל את הפונקציה הבאה על תמונה באמצעות OpenCV:
- טרנספורמציות תמונה - טרנספורמציה של זיקה ולא של זיקה
- תרגומי תמונות - העברת תמונה למעלה, למטה, שמאלה וימינה
- סיבוב תמונה - סיבוב התמונה
- שינוי גודל, שינוי גודל ואינטרפולציה
- פירמידות תמונה - דרך נוספת לשינוי גודל
- חיתוך - גזירת אזור התמונה הרצוי
- פעולות חשבון להבהרה ולהכהת תמונות
1. טרנספורמציות דימוי - טרנספורמציה של זיקה ולא של זיקה
טרנספורמציות הן עיוותים גיאומטריים שנחקקו על תמונה, עיוותים ודאי שאין כאן טעויות אלא סוג תיקון לתיקון נושאי הפרספקטיבה הנובעים מנקודת התמונה. ישנם שני סוגים של תמורות תמונה - Affine ו- Non-Affine
טרנספורמציות זיקה הן משלושה סוגים של שינוי גודל, סיבוב ותרגום, הדבר החשוב בתמורות זיקה הוא שקווים מקבילים לפני ואחרי טרנספורמציות תמונה.
טרנספורמציות שאינן שייכות או טרנספורמציות השלכתית אינן שומרות על מקבילות, אורך או זווית, אך עם זאת היא שומרת על הקולינריות וההיארעות, קולינאריות פירושה ששתי הנקודות מונחות על אותו קו ישר.
טרנספורמציות שאינן קשורות לשכיחות נפוצות מאוד בראיית המחשב והן נוצרות מזוויות מצלמה שונות. טרנספורמציות שאינן קשורות או השלכה נקראות גם הומוגרפיה.
2. תרגומי תמונות - העברת תמונה מעלה, מטה, שמאלה וימינה
תרגום תמונות מעביר את התמונה מעלה, מטה, שמאלה וימינה ואפילו באלכסון אם אנו מיישמים תרגום x ו- y בו זמנית.
כעת לצורך ביצוע תרגומי תמונות אנו משתמשים בפונקציית warpAffine של opencv, cv2.warpAffine משמש ליישום תרגומים אלה אך לשם כך אנו זקוקים למטריצת תרגום.
מטריצת תרגום, T = 1 0 Tx
0 1 ty
T X, T y הם הכיוונים בהם משתנה התמונה.
שבו ה- T X עובר לאורך ציר ה- X (אופקי)
T Y מוסט לאורך ציר Y (אנכי)
# זוהי טרנספורמציה אפינית שפשוט משמרת את המיקום של תמונה # אנו משתמשים ב- cv2.warpAffine כדי ליישם את השינויים האלה. ייבא cv2 ייבא סתום כמו np image = cv2.imread ('input.jpg') # אחסן את הגובה והרוחב של גובה התמונה , רוחב = image.shape הדפסה (image.shape) quater_height, quater_width = גובה / 4, רוחב / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (תמונה, T, (רוחב, גובה)) הדפס (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' תרגום ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
פלט קונסולה - (183, 275) - גובה ורוחב
- מטריצת T
]
3. סיבוב תמונה - סיבוב התמונה
סיבוב התמונה הוא סיבוב תמונה סביב נקודה או נקודה במרכז התמונה, בדיוק כמו שהנקודה המסתובבת פועלת כמו ציר.
כמו בתרגום יש לנו מטריצה T, ככל הנראה בסיבוב יש לנו מטריצה M
מטריצת סיבוב, M מטריצה = Cosθ -Sinθ
Sinθ Cosθ
כאשר ה- θ היא זווית הסיבוב, נמדדת בכיוון נגד כיוון השעון.
כמו כן, יש לציין דבר אחד ש- OpenCV מאפשר לך למכור ולסובב תמונה בו זמנית באמצעות הפונקציה cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, זווית סיבוב, קנה מידה)
אנו עדיין משתמשים בפונקציית warpAffine של opencv כדי לקבל את סיבוב התמונה, אך במקום מטריקס תרגום כמו במקרה הקודם כאן אנו משתמשים במטריצת הסיבוב.
ייבא cv2 ייבא מטומטם כתמונת np = cv2.imread ('input.jpg') גובה, רוחב = תמונה. צורה # חלק את הגובה והרוחב ב -2 כדי לסובב את התמונה סביב הסיבוב שלה במרכז_מטריקס = cv2.getRotationMatrix2D ((רוחב / 2, גובה / 2), 90,1) rotated_image = cv2.warpAffine (תמונה, rotation_matrix, (רוחב, גובה)) cv2.imshow ('תמונה מקורית', תמונה) cv2.waitKey (0) cv2.imshow ('תמונה מסובבת ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
כעת התמונה מסתובבת ב 90 מעלות, היא נחתכת בגלל גודל הבד, מכיוון שגודל הבד נשאר זהה אך בגלל גודל הסיבוב התמונה אינה מתאימה לגודל הבד. ניתן לכוונן אותו על ידי הגדרת גורם קנה המידה לשלילי, אך הוא מאפשר רקע שחור מאחורי התמונה.
אז אתה יכול להגדיר את הגובה והרוחב של התמונה על ידי צפייה או ניחוש שלה או שיש שיטה אחרת לסיבוב התמונה היא על ידי שינוע שלה, אבל זה היה מסובב את התמונה בכפולות של 90 מעלות נגד כיוון השעון.
4. שינוי גודל, שינוי גודל ואינטרפולציה
קנה המידה ושינוי הגודל הם טרנספורמציות זיקיות, שינוי גודל התמונה הוא מה שעשינו די הרבה זמן ועסקנו גם באינטרפולציה, כמו כשאתה משנה את גודל התמונה לגודל גדול יותר בו אנו מרחיבים את הפיקסלים, יש כמה פערים ב פיקסלים וכאן נכנס אינטרפולציה.
זה יכול להתרחש בהגדלת גודל התמונה מקטן לגדול יותר או בהקטנת גודל התמונה מגדול לקטן.
מבחינה טכנית, אינטרפולציה היא שיטה לבניית נקודות נתונים חדשות (פיקסלים), בתוך קבוצה נפרדת של נקודות נתונים ידועות.
ישנם סוגים שונים של שיטות אינטרפולציה ב- OpenCV כמו
cv2.INTER_AREA - טוב לכיווץ או דגימה למטה
cv2.INTER_NEAREST - המהיר ביותר
cv2.LINEAR - טוב להתקרבות או לדגימה גבוהה יותר (ברירת מחדל)
cv2.CUBIC - טוב יותר
cv2.INTER_LANCZOS4 - הכי טוב
שינוי גודל # קל מאוד באמצעות הפונקציה cv2.resize, הטיעונים שלה הם # cv2.resize (תמונה, dsize (גודל תמונה פלט), x_scale, y_scale, interpolation) ייבוא cv2 ייבוא numpy כמו np image = cv2.imread ('קלט. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # בואו נהפוך את התמונה ל 3/4 לגודל התמונה המקורי כלומר מתרחבת עד 75% image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) # מאחר ואינטרפולציה לינארית היא שיטת ברירת המחדל עבור cv פתוח איננו צריכים ליישם אותה כפונקציה. cv2.imshow ('interpolation scaling_linear', image_scaled) cv2.waitKey (0) # בואו להכפיל את גודל התמונה שלנו img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # בואו נעשה את הגודל לפי הממדים המדויקים image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact image_resize ) cv2.waitKey (0) cv2.destroyAllWindows ()
5. פירמידות תמונה - דרך נוספת לשינוי גודל
תמונת פירמידה מתייחסת לשדרוג (הגדלת תמונות) או צמצום בהורדה (תמונות מכווצות).
זו פשוט דרך שונה של שינוי גודל המאפשרת לנו לשנות גודל בקלות ובמהירות, תוך הקטנת גודל הגודל והרוחב של התמונה החדשה בחצי.
זה שימושי בעת ביצוע גלאי עצמים שמגדלים את התמונות בכל פעם שהוא מחפש אובייקט.
ייבא תמונה cv2 = cv2.imread ('input.jpg') קטן יותר = cv2.pyrDown (תמונה) גדול יותר = cv2.pyrUp (קטן יותר) cv2.imshow ('מקורי', תמונה) cv2.waitKey (0) cv2.imshow ('קטן יותר', קטן יותר) cv2.waitKey (0) cv2.imshow ('גדול יותר', גדול יותר) cv2.waitKey (0) cv2.destroyAllWindows ()
בתמונה גדולה יותר תבחין כי עדיין בגודל זהה של התמונה המקורית היא מטושטשת מעט מכיוון שהיא מומרת מתמונה קטנה יותר לתמונה גדולה יותר ישירות. אבל אם נפרש אותה איכות התמונה משתפרת בהשוואה לקודמתה מכיוון שאינטרפולציה מעריכה את הפיקסלים תוך מילוי הרווחים כאשר התמונה מוגדלת.
כעת פועל אותו קוד אך עם אינטרפולציה מעוקבת נותן איכות טובה יותר של תמונה גדולה. בתמונות למטה מוצגת ההשוואה בין תמונה מקורית, גרסה מוגדלת של תמונה, תמונה קטנה יותר וגרסה מעוקבת מעוקבת של תמונה קטנה יותר.
ייבא תמונה cv2 = cv2.imread ('input.jpg') קטן יותר = cv2.pyrDown (תמונה) גדול יותר = cv2.pyrUp (קטן יותר) cv2.imshow ('מקורי', תמונה) cv2.waitKey (0) cv2.imshow ('קטן יותר', קטן יותר) cv2.waitKey (0) cv2.imshow ('גדול יותר', גדול יותר) cv2.waitKey (0) # מגדיל את האיכות של תמונה גדולה יותר שהומרו מתמונה קטנה יותר באמצעות אינטרפולציה מעוקבת img_double = cv2.resize (קטן יותר, ללא, fx = 2, fy = 2, אינטרפולציה = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
הערה: אם אתה רוצה ליצור עותקים מרובים קטנים של תמונות הולכים ומצטמקים בגודל או עותקים גדולים מרובים של תמונות ברציפות גדלו בגודל, אז אנחנו יכולים להשתמש עבור לולאות או תוך לולאות השמירה בתוך pyrDown או pyrUp פונקציה.
6. חיתוך - גזירת אזור התמונה הרצוי
חיתוך תמונות מתייחס לחילוץ קטע של תמונה.
ל- OpenCV באופן ישיר אין פונקציית חיתוך, אך ניתן לעשות זאת בקלות על ידי קהות באמצעות הקוד שלמטה
חתוך = תמונה
אנו מכניסים את מערך התמונה ובאמצעות כלי אינדקס או שיטה לאטום, אנו מגדירים שורת התחלה לשורה סופית ומתחילים בעמודה לסוף בעמודה המופרדת בפסיק המוציא את המלבן אותו אנו רוצים לחתוך כדי לקבל את התמונה.
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('input.jpg') גובה, רוחב = image.shape # בואו נקבל את קואורדינטות הפיקסלים ההתחלתיות (משמאל למעלה למלבן החיתוך) start_row, start_col = int (גובה *.25), int (רוחב *.25) # בואו נקבל קואורדינטות פיקסל סיום (למטה מימין) end_row, end_col = int (גובה *.75), int (רוחב *.75) # פשוט השתמשו באינדקס כדי לחתוך את המלבן שאנו רוצים לחתוך = תמונה cv2.imshow ("תמונה מקורית", תמונה) cv2.waitKey (0) cv2.imshow ("תמונה חתוכה", חתוך) cv2.waitKey (0) cv2.destroyAllWindows ()
שים לב שאתה יכול להשתמש בערכי פיקסל ישירות במקום start_col או start_row , הם רק ניתנים כדי לקבל את הזיהוי הקל עבור המשתמש.
7. פעולות חשבון להבהרה ולהכהת תמונות
פעולות חשבון ב- OpenCV בעצם הן הוספה או חיסור של מטריצות לתמונה, הוספת או חיסור של מטריצות משפיעה על הגדלת או הפחתת הבהירות.
אז כדי להוסיף או לחסר מטריצות עלינו ליצור אותן ולהשתמט יש פונקציה הנקראת np.ones שנותנת מטריצות בגודל זהה לזה של התמונה שלנו.
ייבא cv2 ייבא numpy כמו np image = cv2.imread ('input.jpg') # צור מטריצה של אחת, ואז הכפל אותה בסולם של 100 ' # np.ones נותן מטריצה באותו ממד של התמונה שלנו עם כל הערכים הם 100 במקרה זה M = np.ones (image.shape, dtype = "uint8") * 100 # אנו משתמשים בזה כדי להוסיף מטריצה זו M לתמונה שלנו # שימו לב לעליית הבהירות שנוספה = cv2.add (תמונה, M) cv2.imshow ("נוסף", הוסיף) cv2.waitKey (0) # כמו כן אנו יכולים גם להפחית # שימו לב לירידה בהירות מופחתת = cv2.subtract (תמונה, M) cv2.imshow ("מופחת", מופחת) cv2.waitKey (0) cv2.destroyAllWindows ()
כך ניתן להשתמש ב- OpenCV ליישום פעולות עיבוד תמונה רבות ושונות על התמונה. נמשיך בפונקציות אחרות של מניפולציה של תמונות במדריך הבא.