Matplotlib 아핀 변환

Beginner

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

소개

이 랩에서는 Matplotlib 을 사용하여 이미지의 아핀 변환 (affine transformation) 을 수행하는 방법을 보여줍니다. 아핀 변환은 이미지의 모양과 방향을 변경합니다. 이 랩에서는 transforms.Affine2D 함수를 사용하여 이미지의 모양과 방향을 조작하는 방법을 보여줍니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접근하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중에 문제가 발생하면 Labby 에게 문의하십시오. 세션 후에 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.

라이브러리 임포트 및 이미지 정의

첫 번째 단계에서는 필요한 라이브러리를 임포트하고 예제에 사용될 이미지를 정의합니다. 이미지는 두 개의 가우시안 함수 (Gaussian function) 의 조합입니다.

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

이미지를 플롯하는 함수 생성

이 단계에서는 이미지, 플롯 축 (plot axis), 그리고 변환 (transformation) 을 입력으로 받는 함수를 정의합니다. 이 함수는 지정된 변환을 사용하여 플롯 축에 이미지를 표시합니다. 또한, 이미지의 의도된 범위를 보여주기 위해 이미지 주변에 노란색 사각형을 표시합니다.

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_deg, skew_deg, scale, 및 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 을 사용하여 이미지의 아핀 변환 (affine transformation) 을 수행하는 방법을 시연했습니다. transforms.Affine2D 함수를 사용하여 이미지의 모양과 방향을 조작했습니다. 이미지의 회전, 기울이기 (skew), 크기 조정, 반사 및 다중 변환을 수행했습니다. 또한 변환된 이미지를 이미지의 의도된 범위와 함께 플롯 축에 표시했습니다.