10. 画像の幾何変換#

10.1. 画像の切り抜き、サイズ変更、および再スケーリング#

画像はNumPy配列であるため(画像のためのNumPyの入門セクションで説明されているように)、画像の切り抜きは単純なスライス操作で行うことができます。以下では、宇宙飛行士画像の左上隅に対応する100x100の正方形を切り抜きます。この操作はすべてのカラーチャネルに対して実行されることに注意してください(カラーディメンションは最後の3番目のディメンションです)。

>>> import skimage as ski
>>> img = ski.data.astronaut()
>>> top_left = img[:100, :100]

画像の形状を変更するために、skimage.colorは、再スケーリング、サイズ変更、およびダウンスケールで説明されているいくつかの関数を提供します。


from skimage import data, color
from skimage.transform import rescale, resize, downscale_local_mean

image = color.rgb2gray(data.astronaut())

image_rescaled = rescale(image, 0.25, anti_aliasing=False)
image_resized = resize(
    image, (image.shape[0] // 4, image.shape[1] // 4), anti_aliasing=True
)
image_downscaled = downscale_local_mean(image, (4, 3))

../_images/sphx_glr_plot_rescale_001.png

10.2. 射影変換(ホモグラフィ)#

ホモグラフィは、点の整列を保持するユークリッド空間の変換です。ホモグラフィの特定のケースは、平行性(アフィン変換)、形状(類似変換)、または距離(ユークリッド変換)などのより多くのプロパティの保存に対応します。scikit-imageで利用可能なさまざまなタイプのホモグラフィは、ホモグラフィの種類で紹介されています。

射影変換は、明示的なパラメータ(例:スケール、せん断、回転、平行移動)を使用して作成できます。

import numpy as np
import skimage as ski

tform = ski.transform.EuclideanTransform(
   rotation=np.pi / 12.,
   translation = (100, -20)
   )

または完全な変換行列

matrix = np.array([[np.cos(np.pi/12), -np.sin(np.pi/12), 100],
                   [np.sin(np.pi/12), np.cos(np.pi/12), -20],
                   [0, 0, 1]])
tform = ski.transform.EuclideanTransform(matrix)

変換の変換行列は、そのtform.params属性として使用できます。変換は、@行列乗算演算子を使用して行列を乗算することで構成できます。

変換行列は、同次座標を使用します。これは、ユークリッド幾何学で使用されるデカルト座標をより一般的な射影幾何学に拡張したものです。特に、無限遠の点を有限の座標で表現できます。

変換は、skimage.transform.warp()を使用して画像に適用できます。

img = ski.util.img_as_float(ski.data.chelsea())
tf_img = ski.transform.warp(img, tform.inverse)
../_images/sphx_glr_plot_transform_types_001.png

skimage.transformのさまざまな変換には、2つの点のセット(ソースと宛先)から変換のパラメータを推定するためのestimateメソッドがあります。幾何変換の使用チュートリアルで説明されているように。

text = ski.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 = ski.transform.ProjectiveTransform()
tform3.estimate(src, dst)
warped = ski.transform.warp(text, tform3, output_shape=(50, 300))
../_images/sphx_glr_plot_geometric_002.png

estimateメソッドは、ソースと最適化の間の距離を最小限に抑えるために最小二乗法を使用します。ソースポイントと宛先ポイントは、手動で決定することも、skimage.featureで利用可能なさまざまな特徴検出方法を使用して決定することもできます。次に例を示します。

また、変換パラメータを推定する前に、skimage.feature.match_descriptors()を使用してポイントをマッチングします。ただし、誤ったマッチングが頻繁に行われるため、RANSACを使用したロバストなマッチングで説明されているように、外れ値に対するロバスト性を向上させるために、RANSACアルゴリズム(単純な最小二乗法最適化の代わりに)を使用することをお勧めします。

../_images/sphx_glr_plot_matching_001.png

変換推定のアプリケーションを示す例は次のとおりです。

estimateメソッドは、ポイントベースです。つまり、ソース画像と宛先画像からの一連のポイントのみを使用します。平行移動(シフト)を推定するために、フーリエ空間の相互相関に基づく、すべてのピクセルを使用するフルフィールドメソッドを使用することも可能です。このメソッドは、skimage.registration.phase_cross_correlation()によって実装されており、画像登録チュートリアルで説明されています。

../_images/sphx_glr_plot_register_translation_001.png

登録のための極座標および対数極座標変換の使用チュートリアルでは、最初にログ極座標変換を使用することにより、回転を推定するためのこのフルフィールド法のバリアントについて説明します。