はじめに
ここでは、skimage.transformのswirlを用いた画像の非線形変換(渦巻き)について説明する。
コード
解説
モジュールのインポート
画像データの読み込み
ギムノカリキウム属 新天地(Gymnocalycium saglionis)の画像をplt.imread()で読み込む。グレースケール画像である必要はない。
スワール変換
まず、出力画像の座標(x,y)について考える。 中心の座標を(x0,y0)とすると、(x,y)は極座標で以下のようになる。
\begin{align}\begin{aligned}\theta = \arctan(y/x)\\\rho = \sqrt{(x – x_0)^2 + (y – y_0)^2},\end{aligned}\end{align}
これを以下の式で変換する。
\begin{align}\begin{aligned}r = \ln(2) \, \mathtt{radius} / 5\\\phi = \mathtt{rotation}\\s = \mathtt{strength}\\\theta’ = \phi + s \, e^{-\rho / r + \theta}\end{aligned}\end{align}
ここで、 strength
はスワール量のパラメータで、 radius
はスワールの範囲をピクセル単位で示し、 rotation
は回転角度を意味する。
結果の表示
図をImageGridにより表示する。ImageGridは下記で解説した。
[matplotlib] 19. mpl_toolkits.axes_grid1 の使い方(画像の表示)
axes_grid1のImageGridを用いて複数の画像を表示する方法
左のgrid[0]にオリジナル画像、右のgrid[1]に非線形渦巻き処理した画像を表示している。スワール変換した画像は、中心の生長点の辺りで渦を巻いている状態となっている。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)参考
Swirl — skimage 0.24.0 documentation
cocolog:@nifty
コメント