5.24. 極座標変換

極座標では、各ピクセルを左上の原点からの水平・垂直方向のオフセットではなく、基準方向からの角度と選択した中心からの距離で表します。この表現が有用なのは次の性質によります。すなわち、選択した中心まわりの回転が角度軸方向の平行移動になる ため、回転不変なアルゴリズムは回転を直接扱うよりもはるかに単純なパラメータ空間を探索できるのです。linpolar()logpolar() がこの再投影を実行します。

5.24.1. 2 つのメソッド

linpolar()線形 の距離軸を用いて直交座標から極座標への再投影を実行します。出力の各列は中心まわりの一定の角度に対応し、出力の各行は中心からの一定の距離に対応します。

img.linpolar()

logpolar() は同じ再投影を 対数 の距離軸を用いて実行します。角度の扱いは同一ですが、距離が出力の行を下るにつれて線形ではなく指数的に増加する点が異なります。この違いが重要なのは、極座標が明らかにする 2 つ目の幾何学的性質によります。すなわち、選択した中心まわりのスケーリングが距離軸方向の平行移動になる のですが、これはその軸が対数である場合に限られます。線形の距離軸では、スケーリングは極座標画像を引き伸ばします。対数の距離軸では、スケーリングは画像を一定量だけシフトさせます。

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() のどちらを選ぶかは、アプリケーションがどの不変性を必要とするかの選択です。回転不変性 だけが必要な場合、つまり 2 つのフレームに同じシーンが現れ、2 つ目が未知の角度で回転していることを検出する場合には、linpolar() で十分です。回転は極座標画像における水平方向のシフトになり、find_displacement() のような平行移動のみのマッチャーがそのシフト量として角度を復元します。スケール不変性 も重要な場合、つまり 2 つ目のフレームが回転 かつ ズームされている場合には、logpolar() が両方の未知数を平行移動に集約します。回転は水平方向、スケールは垂直方向です。

これが、回転やスケールの変化に対して頑健なトラッカーの標準的な手順です。基準フレームと各ライブフレームを同じ中心まわりで対数極座標に再投影し、その対に対して find_displacement() を実行し、結果から rotation フィールドと scale フィールドを読み取ります。

5.24.3. 円形の特徴のアンラップ

極座標変換のもう 1 つの用途は、画像内で本来円形である特徴を アンラップ することです。時計の文字盤、計器のダイヤル、設計上円形である検査対象など、これらはすべて極座標投影では 線形 になり、これはほとんどのアルゴリズムが扱いやすいと感じる形です。

上の図がそれを直接示しています。時計の文字盤上の 12 個の目盛りは、直交座標では円周に沿って等間隔に並んでいますが、極座標画像では 12 本の等間隔の縦線になります。極座標画像内のいずれか 1 つの目盛りを囲む長方形は、撮影時に時計の文字盤がどの方向に回転していたかに関係なく、その目盛りの位置を特定します。極座標画像全体に対してテンプレートマッチャーを実行すると、1 回のパスで すべての 目盛りが見つかります。

5.24.4. 逆マッピング

reverse=True は前方の極座標投影の逆を実行します。すなわち、極座標画像が与えられると、その極座標投影がその画像となるような直交座標画像を生成します。アプリケーションは前方の形式を呼び出して極座標でアルゴリズムを実行し、その後逆の形式を呼び出して、結果を見る必要がある後続のステージのために結果を直交座標に投影し戻します。

最も一般的な用途は、極座標画像を 変更 して投影し戻すことです。極座標画像に適用されたフィルタ、つまり極座標の観点では角度方向にぼかしつつ半径方向の構造を保持する水平方向の平滑化は、角度方向に ぼかされた直交座標の結果を生成しますが、これは直交座標のフィルタが直接行えることではありません。