はじめに
ここではskimage.transformの PiecewiseAffineTransformと warp による画像の区分的アフィン変換について説明する。
コード
解説
モジュールのインポート
画像データの読み込み、形状の取得
画像を読み込み、形状を取得する。
局所的アフィン変換するための準備
2次元で等間隔に並んだ配列の生成
np.linspace()で作成した配列をmeshgridにより2次元に展開する。展開したそれぞれの配列を1次元化し、dstackにより連結した配列を作成する。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))により、imageにtformのアフィン変換を適用する。shapeで出力する画像のサイズを設定する。
画像の表示
tform.inverse(src)により逆変換が適用されるため、dstの形状のデータが画像に沿って表示される。
参考
Piecewise Affine Transformation — skimage 0.25.0 documentation
コメント