5.24. การแปลงพิกัดเชิงขั้ว

พิกัดเชิงขั้วระบุตำแหน่งของแต่ละพิกเซลด้วยมุมจากทิศทางอ้างอิงและระยะห่างจากจุดศูนย์กลางที่เลือก แทนที่จะใช้ค่าออฟเซตแนวนอนและแนวตั้งจากจุดกำเนิดที่มุมบนซ้าย การนำเสนอรูปแบบนี้มีประโยชน์อย่างมากจากคุณสมบัติหนึ่ง: การหมุนรอบจุดศูนย์กลางที่เลือกกลายเป็นการเลื่อนตามแกนมุม ซึ่งช่วยให้อัลกอริทึมที่ไม่แปรเปลี่ยนตามการหมุนค้นหาพื้นที่พารามิเตอร์ที่ง่ายกว่าการค้นหาการหมุนโดยตรงมาก linpolar() และ logpolar() ดำเนินการฉายภาพใหม่

5.24.1. สองวิธี

linpolar() ดำเนินการฉายภาพจาก Cartesian ไปยังพิกัดเชิงขั้วโดยใช้แกนระยะทาง เชิงเส้น แต่ละคอลัมน์ของภาพเอาต์พุตสอดคล้องกับมุมคงที่รอบจุดศูนย์กลาง แต่ละแถวสอดคล้องกับระยะห่างคงที่จากจุดศูนย์กลาง

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() วงกลมซ้อนกันในแหล่งที่มากลายเป็นเส้นแนวนอนในเอาต์พุต เครื่องหมายมุมกลายเป็นเส้นตั้งที่มีระยะห่างเท่ากันตามแกนมุม รูปแบบ 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 ไม่สามารถทำได้โดยตรง