注記
フルサンプルコードをダウンロードするには、最後に移動してください。または、Binder経由でブラウザでこの例を実行するには
スワール#
画像スワールは、渦巻き効果を作り出す非線形画像変形です。この例では、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)\)を基準にして、その極座標を計算します。
次に、それらを次のように変換します。
ここで、radius
はピクセル単位でのスワールの広がりを示し、rotation
は回転角度を追加し、strength
はスワールの量を示すパラメータです。radius
から\(r\)への変換は、指定された半径内で変換が\(\approx 1/1000^{\mathsf{th}}\)まで減衰することを保証するためです。

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 秒)