Matplotlib によるアフィン変換

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Matplotlib を使って画像のアフィン変換を行う方法を示します。アフィン変換は画像の形状と向きを変えます。この実験では、transforms.Affine2D関数を使って画像の形状と向きを操作する方法を示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習します。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

ライブラリのインポートと画像の定義

最初のステップでは、必要なライブラリをインポートし、例で使用する画像を定義します。画像は 2 つのガウス関数の合成です。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.transforms as mtransforms

def get_image():
    delta = 0.25
    x = y = np.arange(-3.0, 3.0, delta)
    X, Y = np.meshgrid(x, y)
    Z1 = np.exp(-X**2 - Y**2)
    Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
    Z = (Z1 - Z2)
    return Z

画像をプロットする関数を作成する

このステップでは、画像、プロット軸、および変換を入力として受け取る関数を定義します。この関数は、指定された変換で画像をプロット軸に表示します。また、画像の意図された範囲を示すために、画像の周りに黄色の矩形を表示します。

def do_plot(ax, Z, transform):
    im = ax.imshow(Z, interpolation='none',
                   origin='lower',
                   extent=[-2, 4, -3, 2], clip_on=True)

    trans_data = transform + ax.transData
    im.set_transform(trans_data)

    ## display intended extent of the image
    x1, x2, y1, y2 = im.get_extent()
    ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "y--",
            transform=trans_data)
    ax.set_xlim(-5, 5)
    ax.set_ylim(-4, 4)

画像の回転を行う

このステップでは、rotate_deg関数を使って画像を回転させます。回転角度をrotate_deg関数の入力として渡します。回転させた画像を表示するためにdo_plot関数を使います。

## prepare image and figure
fig, ax1 = plt.subplots()
Z = get_image()

## image rotation
do_plot(ax1, Z, mtransforms.Affine2D().rotate_deg(30))

画像の歪みを行う

このステップでは、skew_deg関数を使って画像の歪みを行います。歪み角度をskew_deg関数の入力として渡します。歪んだ画像を表示するためにdo_plot関数を使います。

## prepare image and figure
fig, ax2 = plt.subplots()
Z = get_image()

## image skew
do_plot(ax2, Z, mtransforms.Affine2D().skew_deg(30, 15))

画像の拡大縮小と反射を行う

このステップでは、scale関数を使って画像の拡大縮小と反射を行います。拡大縮小と反射の係数をscale関数の入力として渡します。拡大縮小と反射された画像を表示するためにdo_plot関数を使います。

## prepare image and figure
fig, ax3 = plt.subplots()
Z = get_image()

## scale and reflection
do_plot(ax3, Z, mtransforms.Affine2D().scale(-1,.5))

複数の変換を行う

このステップでは、rotate_degskew_degscale、およびtranslate関数を使って画像に複数の変換を行います。変換パラメータをそれぞれの関数の入力として渡します。変換された画像を表示するためにdo_plot関数を使います。

## prepare image and figure
fig, ax4 = plt.subplots()
Z = get_image()

## everything and a translation
do_plot(ax4, Z, mtransforms.Affine2D().
        rotate_deg(30).skew_deg(30, 15).scale(-1,.5).translate(.5, -1))

まとめ

この実験では、Matplotlib を使って画像のアフィン変換を行う方法を示しました。画像の形状と向きを操作するためにtransforms.Affine2D関数を使用しました。画像の回転、歪み、拡大縮小、反射、および複数の変換を行いました。また、画像の意図された範囲で変換された画像をグラフの軸に表示しました。