5.24. Transformasi polar¶
Koordinat polar menamai setiap piksel berdasarkan sudut dari arah referensi dan jarak dari pusat yang dipilih, sebagai pengganti offset horizontal dan vertikal dari titik asal kiri atas. Representasi ini bermanfaat berkat satu identitas: rotasi terhadap pusat yang dipilih menjadi translasi sepanjang sumbu sudut, yang memungkinkan algoritma invarian-rotasi mencari ruang parameter yang jauh lebih sederhana dibandingkan langsung menggunakan rotasi. linpolar() dan logpolar() menjalankan re-proyeksi tersebut.
5.24.1. Dua metode¶
linpolar() menjalankan re-proyeksi Kartesius-ke-polar dengan sumbu jarak linear. Setiap kolom output berkorespondensi dengan sudut tetap di sekitar pusat; setiap baris output berkorespondensi dengan jarak tetap dari pusat.
img.linpolar()
logpolar() menjalankan re-proyeksi yang sama dengan sumbu jarak logaritmik. Penanganan sudut identik; yang berbeda adalah bahwa jarak tumbuh secara eksponensial ke bawah baris output, bukan secara linear. Perbedaan ini penting karena identitas geometris kedua yang diekspos koordinat polar: penskalaan sumber terhadap pusat yang dipilih menjadi translasi sepanjang sumbu jarak -- tetapi hanya ketika sumbu tersebut logaritmik. Dengan sumbu jarak linear, penskalaan meregangkan citra polar; dengan sumbu jarak log, penskalaan menggesernya sejumlah tetap.
img.logpolar()
Kedua metode menerima kata kunci x= dan y= yang menetapkan pusat re-proyeksi polar dalam koordinat piksel sumber, dengan default setengah lebar citra dan setengah tinggi citra masing-masing. Pilihan pusat sangat penting: transformasi polar di sekitar titik yang salah akan menghasilkan konten yang teracak sedemikian rupa sehingga merusak identitas rotasi/translasi.
Muka jam yang di-re-proyeksi oleh linpolar() dan logpolar(). Lingkaran konsentris dalam sumber menjadi garis horizontal dalam output; tanda menit berbentuk sudut menjadi garis vertikal berjarak merata sepanjang sumbu sudut. Varian log-polar mengompresi jarak radial.¶
5.24.2. Kapan menggunakan masing-masing¶
Pilihan antara linpolar() dan logpolar() adalah pilihan invariansi mana yang dibutuhkan aplikasi. Untuk invariansi rotasi saja -- mendeteksi bahwa adegan yang sama muncul dalam dua bingkai, yang kedua diputar dengan sudut yang tidak diketahui -- linpolar() sudah cukup: rotasi menjadi pergeseran horizontal dalam citra polar, dan pencocok hanya-translasi seperti find_displacement() memulihkan sudut sebagai besarnya pergeseran. Ketika invariansi skala juga penting -- bingkai kedua diputar dan diperbesar -- logpolar() mereduksi kedua ketidakdiketahuan menjadi translasi: horizontal untuk rotasi, vertikal untuk skala.
Itulah resep standar untuk tracker yang tahan terhadap perubahan rotasi dan skala: re-proyeksikan bingkai referensi dan setiap bingkai langsung ke log-polar di sekitar pusat yang sama, jalankan find_displacement() pada pasangan tersebut, dan baca kolom rotation dan scale dari hasilnya.
5.24.3. Meluruskan fitur melingkar¶
Penggunaan lain dari transformasi polar adalah meluruskan fitur yang secara alami melingkar dalam citra. Muka jam, dial pengukur, target inspeksi yang melingkar berdasarkan desain -- semuanya menjadi linear dalam proyeksi polar, yang merupakan bentuk yang paling mudah diproses oleh kebanyakan algoritma.
Gambar di atas menunjukkannya secara langsung: dua belas tanda menit pada muka jam, berjarak merata di sekitar keliling dalam Kartesius, menjadi dua belas garis vertikal berjarak merata dalam citra polar. Sebuah persegi panjang di sekitar salah satu tanda menit dalam citra polar mengidentifikasi posisi tanda menit tersebut tanpa memperhatikan ke arah mana muka jam diputar saat diambil. Pencocok template yang dijalankan di seluruh citra polar menemukan setiap tanda menit dalam satu kali proses.
5.24.4. Pemetaan terbalik¶
reverse=True menjalankan kebalikan dari proyeksi polar maju: diberikan citra polar, hasilkan citra Kartesius yang merupakan proyeksi polarnya. Aplikasi memanggil bentuk maju untuk menjalankan algoritma dalam koordinat polar, kemudian memanggil bentuk terbalik untuk memproyeksikan hasilnya kembali ke Kartesius untuk tahap hilir apa pun yang perlu melihatnya.
Penggunaan paling umum adalah memodifikasi citra polar dan memproyeksikan kembali: filter yang diterapkan pada citra polar -- penghalusan horizontal yang, dalam istilah polar, mengaburkan lintas sudut tetapi mempertahankan struktur radial -- menghasilkan hasil Kartesius yang telah dikaburkan secara angular, yang bukan sesuatu yang dapat dilakukan filter Kartesius secara langsung.