スワール#

画像スワールは、渦巻き効果を作り出す非線形画像変形です。この例では、skimageでのこの変換の実装と、基礎となるワープメカニズムについて説明します。

画像ワーピング#

画像に幾何変換を適用する場合、通常は逆マッピングを利用します。つまり、出力画像の各ピクセルに対して、入力における対応する位置を計算します。その理由は、もし反対の方法(各入力ピクセルを新しい出力位置にマッピングする)を実行すると、出力の一部のピクセルが空のままになる可能性があるためです。一方、各出力座標には、入力画像内(または外)に正確に1つの対応する位置があり、その位置が整数でなくても、補間を使用して対応する画像値を計算できます。

逆マッピングの実行#

skimageで幾何学的なワープを実行するには、skimage.transform.warp()関数に逆マッピングを提供するだけです。たとえば、画像を左に50ピクセルシフトしたい場合を考えます。このようなシフトの逆マッピングは次のようになります。

def shift_left(xy):
    xy[:, 0] += 50
    return xy

対応するワープの呼び出しは次のとおりです。

from skimage.transform import warp
warp(image, shift_left)

スワール変換#

出力画像の座標\((x, y)\)を考えます。スワール変換の逆マッピングでは、まず中心\((x_0, y_0)\)を基準にして、その極座標を計算します。

\[ \begin{align}\begin{aligned}\theta = \arctan((y-y0)/(x-x0))\\\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} \]

ここで、radiusはピクセル単位でのスワールの広がりを示し、rotationは回転角度を追加し、strengthはスワールの量を示すパラメータです。radiusから\(r\)への変換は、指定された半径内で変換が\(\approx 1/1000^{\mathsf{th}}\)まで減衰することを保証するためです。

plot swirl
import matplotlib.pyplot as plt

from skimage import data
from skimage.transform import swirl


image = data.checkerboard()
swirled = swirl(image, rotation=0, strength=10, radius=120)

fig, (ax0, ax1) = plt.subplots(
    nrows=1, ncols=2, figsize=(8, 3), sharex=True, sharey=True
)

ax0.imshow(image, cmap=plt.cm.gray)
ax0.axis('off')
ax1.imshow(swirled, cmap=plt.cm.gray)
ax1.axis('off')

plt.show()

スクリプトの合計実行時間: (0 分 0.132 秒)

Sphinx-Galleryによって生成されたギャラリー