Аффинное преобразование в Matplotlib

Beginner

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

Введение

В этом практическом занятии показано, как использовать Matplotlib для выполнения аффинного преобразования изображения. Аффинные преобразования изменяют форму и ориентацию изображения. В этом практическом занятии показано, как использовать функцию transforms.Affine2D для манипулирования формой и ориентацией изображения.

Советы по использованию ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем библиотеки и определяем изображение

В первом шаге мы импортируем необходимые библиотеки и определяем изображение, которое будет использоваться в примере. Изображение представляет собой комбинацию двух гауссовых функций.

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_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 для выполнения аффинного преобразования изображения. Мы использовали функцию transforms.Affine2D для манипуляции с формой и ориентацией изображения. Мы выполнили вращение, сдвиг, масштабирование, отражение и несколько преобразований изображения. Мы также отобразили преобразованное изображение на оси графика с заданным размером изображения.