יום שלישי, 28 בינואר 2014

מציאת עיגולים בתמונה

רבים מכירים את התמרת Hough המשמשת לצורך מציאת קוים ישרים בתמונה, ואשר ממומשת ב-Image Processing Toolbox באמצעות הפקודה Hough.
כידוע, ההתמרה הזו הורחבה לפני עשרות שנים כך שתוכל לשמש לצורך מציאת צורות שרירותיות שונות, לאו דווקא קוים ישרים, אלא למשל עיגולים.
לפני כשנתיים, בגרסת R2012a, נוספו ל-Image Processing Toolbox שתי פקודות המשמשות למציאת עיגולים בתמונה (imfindcircles) ולציור העיגולים אשר נמצאו (viscircles).
ננסה למצוא את העיגולים בתמונה הבאה ולהציגם (ניתן ללחוץ עליה כדי להגדילה):


בתמונה יש עיגולים במימדים שונים, ועל מנת לקבל תחושה לגבי טווח הקטרים שלהם, ניתן להיעזר בפקודה imdistline:
הפקודה מביאה להופעת סרגל מדידה הניתן להזזה ומתיחה/כיווץ (ראו על המטבע של חצי השקל), ובעזרת הכלי ניתן להסיק כי קוטר העיגול הגדול ביותר בתמונה (מטבע של חצי שקל) הוא כ-410 פיקסלים, כלומר – רדיוס העיגול הגדול הגדול ביותר הוא כ-205 פיקסלים. באופן דומה, רדיוס העיגול הקטן ביותר (מטבע של שקל) הינו כ-130 פיקסלים.
למרבה הצער, הפעלת הפקודה imfindcircles על התמונה תוך שימוש בתחום רדיוסים זה  אינה מניבה רשימה של מרכזי עיגולים ורדיוסים שלהם:
שתי סיבות לתוצאה העגומה הנ"ל. האחת הינה שברירת המחדל של הפקודה היא לחפש עיגולים אשר בהירים יותר מהרקע, וזה לא המצב בתמונה הנ"ל, ועל כן יש לשנות פרמטר בשם ObjectPolarity. אולם, מבדיקה, גם שינוי פרמטר זה אינו מספיק, ויש לשלוט על פרמטר נוסף בשם Sensitivity, הקשור למידת ה"מתירנות" של גלאי העיגולים (עד כמה הוא מוכן "לעגל פינות" ולהכריז על אובייקט מסויים כעיגול). הפרמטר מקבל ערכים בין 0 ל-1, וברירת המחדל שלו היא 0.85, ועל כן נגדיל את הערך הזה.
ניתן לראות כי הפקודה החזירה ארבעה מרכזים של עיגולים, ורדיוסים תואמים. על מנת לוודא שאכן מדובר במטבעות אשר בתמונה, ניתן להשתמש בפקודה viscircles כדי לצייר עיגולים סביב אותם מרכזים, ברדיוסים המתאימים, והנה התוצאה:
לשתי הפקודות, imfindcircles ו-viscircles פרמטרים נוספים שכדאי להכיר, ועל כן מומלץ להיעזר בתיעוד שלהן. לחצו לתיעוד של  imfindcircles ולתיעוד של viscircles .