前回は直線を検出するハフ変換でした。今回はLogPolar(対数極座標)変換です。噂では人間の網膜のモデルに近いのだとか。知らんけど。その名の通り縦横のデカルト座標を極座標に変換するのですが、ちょいとひねりが効いており距離は対数とってます。どうも図形を回転したり拡大縮小したときに「不変」的なものを観察できる変換みたい。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
LogPolar(対数極座標)変換
まずは実感ということで、Helpページに書かれている例をちょっとアレンジしてみました。コードはこんな感じ。
x = imread(fullpath(getIPCVpath() + "/images/balloons.png")); y = imlogpolar(x); scf(); subplot(121); title('Original'); imshow(x); subplot(122); title('LogPolar'); imshow(y);
左オリジナルは「いつもの」風船画像で、右が対数極座標変換後の画像です。
右の画像は、縦軸phi(角度)、横軸p(距離)で、以下の式により左のx、yの点を変換したものっす。
-
- p = m*log(sqrt(x^2 + y^2))
- phi = atan(y/x)
なお、原点(0, 0)はオリジナル画像の中央にとられてます。また m はスケーリングのためのパラメータで変換関数に
y = imlogpolar(x,m);
のようにして与えることもできるもの。上記例では省略(デフォルト1のハズ)してます。
まあ、上の変換公式をみると右のような図形になるのはなんとなく分かるっちゃ分かるのですが、も少し老人にも分かり易い感じが欲しいです。
ことさらに人工的な図形に適用してみる
そこで老人は、お絵描きソフトでことさらな図形を描き、処理してみましたぞ。コードはこんな感じ。
xU = imread("Up.png"); xD = imread("Down.png"); xL = imread("Left.png"); xA = imread("Larger.png"); yU = imlogpolar(xU); yD = imlogpolar(xD); yL = imlogpolar(xL); yA = imlogpolar(xA); scf(); subplot(241); imshow(xU); subplot(242); imshow(xD); subplot(243); imshow(xL); subplot(244); imshow(xA); subplot(245); imshow(yU); subplot(246); imshow(yD); subplot(247); imshow(yL); subplot(248); imshow(yA);
上の画像が「オリジナル」のアーテイフィシャルな図形です。そして下のあるのが対数極座標変換の結果です。上をみると三角形が回転したりサイズが変わったりしているのですが、下みると似たパターンに帰着していることが見てとれます。こんなもんかい?