[scikit-image] 28. 区分的アフィン変換(skimage.transform.PiecewiseAffineTransformとwarp)

python

はじめに

区分的アフィン変換(Piecewise Affine Transform)は、画像の一部分ごとに異なるアフィン変換を適用する手法です。これにより、画像全体に均一な変換を行うのではなく、局所的に異なる変形を加えることができます。

PiecewiseAffineTransformとは

scikit-imageライブラリのskimage.transform.PiecewiseAffineTransformは、ソース点と目標点の対応関係に基づいて画像を変形させる機能を提供します。この変換は以下のステップで行われます:

  • 各三角形内でアフィン変換を個別に適用
  • ソース点と対応する目標点のセットを定義
  • 点の集合をDelaunay三角形分割で三角形メッシュに分割

コード

解説

モジュールのインポート

画像データの読み込み、形状の取得

画像を読み込み、形状を取得します。

局所的アフィン変換するための準備

2次元で等間隔に並んだ配列の生成

np.linspace()で作成した配列を、meshgridを使って2次元に展開します。展開した各配列を1次元化し、dstackで連結した配列を作成します。この連結配列は(1, 200, 2)の形状になるため、[0]を使って(200, 2)の形状に変換しています。

配列にsin波を印加する

dst_rowsは、src_rows.flatのデータをsin波の形状に変形し、横方向に引き伸ばした配列です。一方、dst_colsはsrc_cols.flatと同一のデータを保持します。

局所的アフィン変換の適用

tformはPiecewiseAffineTransform()オブジェクトで、tform.estimate(src, dst)メソッドでは、srcが変換前の座標配列、dstが変換後の目標座標配列を表します。変換が成功した場合、tform.estimate(src, dst)はTrueを返します。

画像への局所的アフィン変換の適用

warp(image, tform, output_shape=(out_rows, out_cols))関数を使用して、画像にtformで定義されたアフィン変換を適用します。output_shapeパラメータで、出力画像のサイズを指定できます。

画像の表示

tform.inverse(src)によって逆変換が適用されるため、dstの形状のデータが画像に沿って正確に表示されます。

まとめ

scikit-imageのPiecewiseAffineTransformwarp関数を組み合わせることで、画像に局所的な変形を加えることができます。この技術は単なる視覚効果だけでなく、画像補正や特殊効果、コンピュータビジョンの前処理など、様々な場面で活用できます。

変換の制御点を工夫することで、創造的で多様な画像変形効果を実現できるため、デジタルアートや画像処理アプリケーションの開発に役立ちます。

参考

Piecewise Affine Transformation — skimage 0.25.2 documentation

コメント