[scikit-image] 24. 画像の非線形変換(渦巻き模様:transform.swirl)

python

はじめに

scikit-imageのtransformモジュールにある「swirl」関数を使用すると、画像に渦巻き効果を適用することができます。この非線形変換により、画像が中心点を軸に回転したような渦巻き模様に変換されます。この記事では、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 の使い方(画像の表示)
Matplotlib の拡張モジュール mpl_toolkits.axes_grid1 を使って複数画像を効率的に表示する方法を解説。ImageGrid による整然としたレイアウト、スケールバー・カラーバーの追加など、科学計算や画像処理に役立つ可視化テクニックを紹介しています。

左のgrid[0]にオリジナル画像、右のgrid[1]に非線形渦巻き処理した画像を表示しています。スワール変換した画像は、中心の生長点の辺りで渦を巻いている状態となっています。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

scikit-imageのtransform.swirl関数を使用することで、画像に渦巻き効果を簡単に適用できることがわかりました。strength、radius、rotationなどのパラメータを調整することで、様々な渦巻き効果を実現できます。この非線形変換は、アート作品の作成や画像処理の学習教材として活用できるでしょう。

参考

Swirl — skimage 0.25.2 documentation
http://areole.cocolog-nifty.com/blog/2017/04/4-e58d.html

コメント