5.24. Polartransformationen¶
Polarkoordinaten benennen jeden Pixel durch einen Winkel von einer Bezugsrichtung und einen Abstand von einem gewählten Zentrum, anstelle der horizontalen und vertikalen Versätze vom Ursprung oben links. Diese Darstellung verdient ihren Platz durch eine Identität: Rotation um das gewählte Zentrum wird zu einer Translation entlang der Winkelachse, wodurch ein rotationsinvarianter Algorithmus einen weit einfacheren Parameterraum durchsuchen kann als Rotationen direkt. linpolar() und logpolar() führen die Reprojektion durch.
5.24.1. Die beiden Methoden¶
linpolar() führt die kartesisch-nach-polar-Reprojektion mit einer linearen Abstandsachse durch. Jede Ausgabespalte entspricht einem festen Winkel um das Zentrum; jede Ausgabezeile entspricht einem festen Abstand vom Zentrum.
img.linpolar()
logpolar() führt dieselbe Reprojektion mit einer logarithmischen Abstandsachse durch. Die Behandlung des Winkels ist identisch; der Unterschied besteht darin, dass die Abstände entlang der Zeilen der Ausgabe exponentiell statt linear wachsen. Dieser Unterschied ist wichtig wegen der zweiten geometrischen Identität, die Polarkoordinaten offenlegen: die Skalierung der Quelle um das gewählte Zentrum wird zu einer Translation entlang der Abstandsachse – aber nur, wenn diese Achse logarithmisch ist. Bei einer linearen Abstandsachse dehnt die Skalierung das Polarbild; bei einer logarithmischen Abstandsachse verschiebt sie es um einen festen Betrag.
img.logpolar()
Beide Methoden nehmen die Schlüsselwörter x= und y= entgegen, die das Zentrum der Polar-Reprojektion in Quellpixelkoordinaten festlegen und standardmäßig die halbe Bildbreite bzw. die halbe Bildhöhe verwenden. Die Wahl des Zentrums ist wichtig: Eine Polartransformation um den falschen Punkt führt dazu, dass der Inhalt auf eine Weise durcheinandergebracht wird, die die Rotations-/Translations-Identität zerstört.
Ein durch linpolar() und logpolar() reprojiziertes Ziffernblatt. Konzentrische Kreise in der Quelle werden zu horizontalen Linien in der Ausgabe; Winkel-Strichmarken werden zu gleichmäßig verteilten vertikalen Linien entlang der Winkelachse. Die log-polar-Variante komprimiert den radialen Abstand.¶
5.24.2. Wann man welche wählt¶
Die Wahl zwischen linpolar() und logpolar() ist die Wahl, welche Invarianz die Anwendung benötigt. Für Rotationsinvarianz allein – das Erkennen, dass dieselbe Szene in zwei Einzelbildern auftritt, das zweite um einen unbekannten Winkel gedreht – genügt linpolar(): Die Rotation wird zu einer horizontalen Verschiebung im Polarbild, und ein reiner Translations-Matcher wie find_displacement() ermittelt den Winkel aus der Größe der Verschiebung. Wenn auch die Skalierungsinvarianz wichtig ist – das zweite Einzelbild ist gedreht und gezoomt –, reduziert logpolar() beide Unbekannten auf Translationen: horizontal für die Rotation, vertikal für die Skalierung.
Das ist das Standardrezept für einen Tracker, der gegenüber Rotations- und Skalierungsänderungen robust ist: Reprojiziere das Referenz-Einzelbild und jedes Live-Einzelbild um dasselbe Zentrum nach Log-Polar, führe find_displacement() auf dem Paar aus und lies die Felder rotation und scale aus dem Ergebnis ab.
5.24.3. Kreisförmige Merkmale aufrollen¶
Eine weitere Verwendung der Polartransformationen ist das Aufrollen von Merkmalen, die im Bild von Natur aus kreisförmig sind. Ein Ziffernblatt, ein Messzifferblatt, ein Prüfziel, das konstruktionsbedingt kreisförmig ist – sie alle werden in der Polarprojektion linear, was die Form ist, mit der die meisten Algorithmen leichter arbeiten können.
Die obige Abbildung zeigt es direkt: Die zwölf Strichmarken auf einem Ziffernblatt, kartesisch gleichmäßig über den Umfang verteilt, werden zu zwölf gleichmäßig verteilten vertikalen Linien im Polarbild. Ein Rechteck um eine beliebige Strichmarke im Polarbild identifiziert die Position dieser Strichmarke unabhängig davon, in welche Richtung das Ziffernblatt bei der Aufnahme gedreht war. Ein über das Polarbild laufender Template-Matcher findet jede Strichmarke in einem einzigen Durchgang.
5.24.4. Die inverse Abbildung¶
reverse=True führt die Umkehrung der vorwärtsgerichteten Polarprojektion durch: Gegeben ein Polarbild, erzeugt es das kartesische Bild, dessen Polarprojektion es ist. Die Anwendung ruft die Vorwärtsform auf, um einen Algorithmus in Polarkoordinaten auszuführen, und ruft dann die Umkehrform auf, um das Ergebnis zurück ins Kartesische zu projizieren, für welche nachgelagerte Stufe es auch immer benötigt wird.
Die häufigste Verwendung ist das Modifizieren eines Polarbilds und das Zurückprojizieren: Ein auf das Polarbild angewandter Filter – eine horizontale Glättung, die in Polarbegriffen über Winkel hinweg verwischt, aber die radiale Struktur erhält – erzeugt ein kartesisches Ergebnis, das winkelmäßig verwischt wurde, was ein kartesischer Filter nicht direkt leisten kann.