注記
最後まで移動して、完全な例コードをダウンロードします。または、Binderを介してブラウザでこの例を実行します。
幾何変換の使用#
この例では、画像処理のコンテキストにおける幾何変換の使用方法を示します。
import math
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage import transform
基本#
いくつかの異なる幾何変換の種類がサポートされています:相似、アフィン、射影、多項式。利用可能な変換の種類に関するチュートリアルについては、ホモグラフィの種類を参照してください。
幾何変換は、明示的なパラメータ(例:スケール、シア、回転、平行移動)または変換行列を使用して作成できます。
まず、明示的なパラメータを使用して変換を作成します。
tform = transform.SimilarityTransform(scale=1, rotation=math.pi / 2, translation=(0, 1))
print(tform.params)
[[ 6.123234e-17 -1.000000e+00 0.000000e+00]
[ 1.000000e+00 6.123234e-17 1.000000e+00]
[ 0.000000e+00 0.000000e+00 1.000000e+00]]
あるいは、変換行列自体によって変換を定義することもできます。
matrix = tform.params.copy()
matrix[1, 2] = 2
tform2 = transform.SimilarityTransform(matrix)
これらの変換オブジェクトは、ソースとデスティネーションの座標系間の順変換と逆変換を適用するために使用できます。
[[6.123234e-17 3.000000e+00]]
[[ 0.000000e+00 -6.123234e-17]]
画像ワープ#
幾何変換は、画像のワープにも使用できます。
text = data.text()
tform = transform.SimilarityTransform(
scale=1, rotation=math.pi / 4, translation=(text.shape[0] / 2, -100)
)
rotated = transform.warp(text, tform)
back_rotated = transform.warp(rotated, tform.inverse)
fig, ax = plt.subplots(nrows=3)
ax[0].imshow(text, cmap=plt.cm.gray)
ax[1].imshow(rotated, cmap=plt.cm.gray)
ax[2].imshow(back_rotated, cmap=plt.cm.gray)
for a in ax:
a.axis('off')
plt.tight_layout()

パラメータ推定#
上記の基本機能に加えて、最小二乗法を使用して幾何変換のパラメータを推定することもできます。
これは、2つの画像に制御点または対応点のセットがある画像レジストレーションや整流などに使用できます。
正面からではなく、ある角度から撮影された写真にある文字を認識したいとしましょう。平面の紙面の場合、最も単純なケースでは文字は射影的に歪んでいます。単純なマッチングアルゴリズムでは、このようなシンボルをマッチングすることはできません。この問題に対する1つの解決策は、歪みを除去するように画像をワープし、その後マッチングアルゴリズムを適用することです。
text = data.text()
src = np.array([[0, 0], [0, 50], [300, 50], [300, 0]])
dst = np.array([[155, 15], [65, 40], [260, 130], [360, 95]])
tform3 = transform.ProjectiveTransform()
tform3.estimate(src, dst)
warped = transform.warp(text, tform3, output_shape=(50, 300))
fig, ax = plt.subplots(nrows=2, figsize=(8, 3))
ax[0].imshow(text, cmap=plt.cm.gray)
ax[0].plot(dst[:, 0], dst[:, 1], '.r')
ax[1].imshow(warped, cmap=plt.cm.gray)
for a in ax:
a.axis('off')
plt.tight_layout()
plt.show()

上記の推定は、点の位置の正確な知識と、それらの対応の正確な選択に依存しています。点の位置に不確実性が関連付けられている場合、重み付けを提供して、結果の変換が最も高い重み付けを持つ点への正確な適合を優先するようにすることができます。RANSACアルゴリズムと呼ばれる代替アプローチは、対応点が完全に正確ではない場合に役立ちます。RANSACを使用したロバストなマッチングチュートリアルで、scikit-imageでこのアプローチを使用する方法の詳細な説明を参照してください。
スクリプトの総実行時間:(0分0.763秒)