5.24. การแปลงพิกัดเชิงขั้ว¶
พิกัดเชิงขั้วระบุตำแหน่งของแต่ละพิกเซลด้วยมุมจากทิศทางอ้างอิงและระยะห่างจากจุดศูนย์กลางที่เลือก แทนที่จะใช้ค่าออฟเซตแนวนอนและแนวตั้งจากจุดกำเนิดที่มุมบนซ้าย การนำเสนอรูปแบบนี้มีประโยชน์อย่างมากจากคุณสมบัติหนึ่ง: การหมุนรอบจุดศูนย์กลางที่เลือกกลายเป็นการเลื่อนตามแกนมุม ซึ่งช่วยให้อัลกอริทึมที่ไม่แปรเปลี่ยนตามการหมุนค้นหาพื้นที่พารามิเตอร์ที่ง่ายกว่าการค้นหาการหมุนโดยตรงมาก linpolar() และ logpolar() ดำเนินการฉายภาพใหม่
5.24.1. สองวิธี¶
linpolar() ดำเนินการฉายภาพจาก Cartesian ไปยังพิกัดเชิงขั้วโดยใช้แกนระยะทาง เชิงเส้น แต่ละคอลัมน์ของภาพเอาต์พุตสอดคล้องกับมุมคงที่รอบจุดศูนย์กลาง แต่ละแถวสอดคล้องกับระยะห่างคงที่จากจุดศูนย์กลาง
img.linpolar()
logpolar() ดำเนินการฉายภาพเดียวกันโดยใช้แกนระยะทาง ลอการิทึม การจัดการมุมเหมือนกัน สิ่งที่แตกต่างคือระยะทางจะเพิ่มขึ้นแบบเอกซ์โพเนนเชียลตามแถวของเอาต์พุตแทนที่จะเป็นเชิงเส้น ความแตกต่างนี้มีความสำคัญเพราะพิกัดเชิงขั้วเปิดเผยคุณสมบัติทางเรขาคณิตที่สอง: การปรับขนาดแหล่งที่มารอบจุดศูนย์กลางที่เลือกกลายเป็นการเลื่อนตามแกนระยะทาง -- แต่เฉพาะเมื่อแกนนั้นเป็นลอการิทึมเท่านั้น หากใช้แกนระยะทางเชิงเส้น การปรับขนาดจะยืดภาพพิกัดเชิงขั้ว แต่หากใช้แกนระยะทางแบบล็อก การปรับขนาดจะเลื่อนมันเป็นปริมาณคงที่
img.logpolar()
ทั้งสองวิธีรับคีย์เวิร์ด x= และ y= เพื่อกำหนดจุดศูนย์กลางของการฉายภาพเชิงขั้วในพิกัดพิกเซลของแหล่งที่มา โดยค่าเริ่มต้นคือครึ่งหนึ่งของความกว้างภาพและครึ่งหนึ่งของความสูงภาพตามลำดับ การเลือกจุดศูนย์กลางมีความสำคัญ: การแปลงพิกัดเชิงขั้วที่จุดที่ไม่ถูกต้องจะทำให้เนื้อหาสับสนในลักษณะที่ทำลายคุณสมบัติการหมุน/การแปล
หน้าปัดนาฬิกาที่ฉายภาพใหม่โดย linpolar() และ logpolar() วงกลมซ้อนกันในแหล่งที่มากลายเป็นเส้นแนวนอนในเอาต์พุต เครื่องหมายมุมกลายเป็นเส้นตั้งที่มีระยะห่างเท่ากันตามแกนมุม รูปแบบ log-polar จะบีบอัดการเว้นระยะรัศมี¶
5.24.2. เมื่อใดควรใช้แต่ละวิธี¶
การเลือกระหว่าง linpolar() และ logpolar() คือการเลือกว่าแอปพลิเคชันต้องการความไม่แปรเปลี่ยนแบบใด สำหรับ ความไม่แปรเปลี่ยนต่อการหมุน เพียงอย่างเดียว -- ตรวจสอบว่าฉากเดียวกันปรากฏในสองเฟรม โดยเฟรมที่สองหมุนด้วยมุมที่ไม่ทราบค่า -- linpolar() เพียงพอ: การหมุนกลายเป็นการเลื่อนในแนวนอนในภาพพิกัดเชิงขั้ว และตัวจับคู่แบบเลื่อนอย่าง find_displacement() จะกู้คืนมุมเป็นขนาดของการเลื่อน เมื่อ ความไม่แปรเปลี่ยนต่อขนาด ก็มีความสำคัญ -- เฟรมที่สองหมุน และ ซูม -- logpolar() จะย่อค่าที่ไม่ทราบทั้งสองให้เป็นการเลื่อน: แนวนอนสำหรับการหมุน แนวตั้งสำหรับขนาด
นั่นคือสูตรมาตรฐานสำหรับตัวติดตามที่ทนทานต่อการเปลี่ยนแปลงการหมุนและขนาด: ฉายภาพเฟรมอ้างอิงและแต่ละเฟรมสดใหม่ไปยัง log-polar รอบจุดศูนย์กลางเดียวกัน รัน find_displacement() บนคู่นั้น และอ่านฟิลด์ rotation และ scale จากผลลัพธ์
5.24.3. การคลี่คลายลักษณะเด่นวงกลม¶
การใช้งานอีกอย่างหนึ่งของการแปลงพิกัดเชิงขั้วคือ การคลี่คลาย ลักษณะเด่นที่เป็นวงกลมในภาพตามธรรมชาติ หน้าปัดนาฬิกา หน้าปัดมาตรวัด เป้าหมายการตรวจสอบที่ออกแบบมาให้เป็นวงกลม -- ทั้งหมดนี้กลายเป็น เชิงเส้น ในการฉายพิกัดเชิงขั้ว ซึ่งเป็นรูปแบบที่อัลกอริทึมส่วนใหญ่ทำงานได้ง่ายกว่า
รูปภาพด้านบนแสดงให้เห็นโดยตรง: เครื่องหมายสิบสองตำแหน่งบนหน้าปัดนาฬิกา ที่มีระยะห่างเท่ากันรอบเส้นรอบวงใน Cartesian กลายเป็นเส้นตั้งสิบสองเส้นที่มีระยะห่างเท่ากันในภาพพิกัดเชิงขั้ว กรอบสี่เหลี่ยมรอบเครื่องหมายใดๆ ในภาพพิกัดเชิงขั้วจะระบุตำแหน่งของเครื่องหมายนั้นโดยไม่คำนึงว่าหน้าปัดนาฬิกาถูกหมุนอย่างไรเมื่อถ่ายภาพ ตัวจับคู่แม่แบบที่รันข้ามภาพพิกัดเชิงขั้วจะพบ ทุก เครื่องหมายในครั้งเดียว
5.24.4. การแมปผกผัน¶
reverse=True ดำเนินการผกผันของการฉายภาพพิกัดเชิงขั้วไปข้างหน้า: รับภาพพิกัดเชิงขั้ว แล้วสร้างภาพ Cartesian ที่การฉายภาพเชิงขั้วของมันคือภาพนั้น แอปพลิเคชันเรียกรูปแบบไปข้างหน้าเพื่อรันอัลกอริทึมในพิกัดเชิงขั้ว จากนั้นเรียกรูปแบบผกผันเพื่อฉายภาพผลลัพธ์กลับเป็น Cartesian สำหรับขั้นตอนดาวน์สตรีมที่ต้องการเห็นมัน
การใช้งานที่พบบ่อยที่สุดคือ การปรับเปลี่ยน ภาพพิกัดเชิงขั้วและฉายภาพกลับ: ฟิลเตอร์ที่ใช้กับภาพพิกัดเชิงขั้ว -- การทำให้เรียบในแนวนอนที่ในเชิงขั้วหมายถึงการเบลอข้ามมุมแต่รักษาโครงสร้างรัศมี -- จะสร้างผลลัพธ์ Cartesian ที่ถูกเบลอ ตามมุม ซึ่งเป็นสิ่งที่ฟิลเตอร์ Cartesian ไม่สามารถทำได้โดยตรง