5.24. טרנספורמציות פולריות

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

5.24.1. שתי המתודות

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

img.linpolar()

logpolar() מבצעת את אותו היטל מחדש עם ציר מרחק לוגריתמי. הטיפול בזווית זהה; מה ששונה הוא שהמרחקים גדלים אקספוננציאלית במורד שורות הפלט במקום ליניארית. ההבדל חשוב בגלל הזהות הגאומטרית השנייה שקואורדינטות פולריות חושפות: שינוי קנה המידה של המקור סביב המרכז הנבחר הופך להזזה לאורך ציר המרחק – אך רק כאשר אותו ציר הוא לוגריתמי. עם ציר מרחק ליניארי, שינוי קנה המידה מותח את התמונה הפולרית; עם ציר מרחק לוגריתמי, שינוי קנה המידה מזיז אותה בכמות קבועה.

img.logpolar()

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

Three panels in a row. The leftmost is a Cartesian source image showing a clock face -- two concentric circles with twelve tick marks around the outer rim at multiples of 30 degrees, and a single hand pointing in one direction. The middle panel shows the linpolar re-projection of that source: a rectangular output image where the twelve tick marks appear as evenly spaced vertical strokes along the top row, the two concentric circles appear as two horizontal lines at different vertical positions, and the clock hand appears as a single vertical line at the position corresponding to its angle in the source. The rightmost panel shows the logpolar re-projection: the same angular distribution along the horizontal axis, but with the gap between the inner and outer circles compressed because the distance axis is logarithmic.

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

5.24.2. מתי לבחור בכל אחת

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

זהו המתכון הסטנדרטי למעקב עמיד בפני שינויי סיבוב וקנה מידה: בצע היטל מחדש של פריים הייחוס ושל כל פריים חי ללוג-פולרי סביב אותו מרכז, הרץ את find_displacement() על הזוג, וקרא את השדות rotation ו-scale מהתוצאה.

5.24.3. פתיחת מאפיינים מעגליים

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

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

5.24.4. המיפוי ההפוך

reverse=True מריץ את ההיפוך של ההיטל הפולרי הקדמי: בהינתן תמונה פולרית, הפק את התמונה הקרטזית שזהו ההיטל הפולרי שלה. היישום קורא לצורה הקדמית כדי להריץ אלגוריתם בקואורדינטות פולריות, ואז קורא לצורה ההפוכה כדי להטיל את התוצאה בחזרה לקרטזי עבור כל שלב במורד הזרם שצריך לראות אותה.

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