Антиалиасинг изображений в Matplotlib

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве вы узнаете, как сглаживать края изображения с использованием Matplotlib в Python. Антиалиасинг - это техника, используемая для сглаживания зубчатых краев и уменьшения искажений в изображениях. В этом руководстве мы сгенерируем изображение размером 450x450 пикселей с различной частотой содержания с использованием Matplotlib. Затем мы уменьшим разрешение изображения от 450 пикселей до 125 или 250 пикселей, чтобы показать, как антиалиасинг может быть использован для уменьшения эффекта Моира, возникающего при уменьшении разрешения высокочастотных данных.

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

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

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

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

Генерация изображения

Во - первых, нам нужно сгенерировать изображение размером 450x450 пикселей с различной частотой содержания с использованием NumPy.

import matplotlib.pyplot as plt
import numpy as np

N = 450
x = np.arange(N) / N - 0.5
y = np.arange(N) / N - 0.5
aa = np.ones((N, N))
aa[::2, :] = -1

X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
f0 = 5
k = 100
a = np.sin(np.pi * 2 * (f0 * R + k * R**2 / 2))
a[:int(N / 2), :][R[:int(N / 2), :] < 0.4] = -1
a[:int(N / 2), :][R[:int(N / 2), :] < 0.3] = 1
aa[:, int(N / 3):] = a[:, int(N / 3):]
a = aa

Десэмплирование изображения с использованием интерполяции "nearest"

Теперь мы уменьшим разрешение изображения от 450 пикселей до 125 или 250 пикселей с использованием интерполяции "nearest". Это покажет, как высокочастотные данные при уменьшении разрешения могут вызывать эффект Моира.

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()

Десэмплирование изображения с использованием интерполяции "antialiased"

Далее мы уменьшим разрешение изображения от 450 пикселей до 125 или 250 пикселей с использованием интерполяции "antialiased". Это покажет, как антиалиасинг может быть использован для уменьшения эффекта Моира, вызываемого уменьшением разрешения высокочастотных данных.

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()

Пересэмплирование изображения с использованием интерполяции "nearest"

Теперь мы увеличим разрешение изображения от 500 пикселей до 530 пикселей для отображения с использованием интерполяции "nearest". Это покажет, как эффект Моира может по-прежнему возникать при увеличении разрешения изображения, если коэффициент увеличения разрешения не является целым числом.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='nearest', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='nearest'")
plt.show()

Пересэмплирование изображения с использованием интерполяции "antialiased"

Наконец, мы увеличим разрешение изображения от 500 пикселей до 530 пикселей для отображения с использованием интерполяции "antialiased". Это покажет, как использование более качественных алгоритмов антиалиасинга может уменьшить эффект Моира.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='antialiased', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='antialiased'")
plt.show()

Резюме

В этом уроке мы узнали, как использовать Matplotlib для антиалиасинга изображения, чтобы уменьшить эффект Моира, вызываемый уменьшением разрешения высокочастотных данных. Мы сгенерировали изображение размером 450x450 пикселей с различным содержанием частоты и уменьшили разрешение изображения от 450 пикселей до 125 или 250 пикселей с использованием интерполяции "nearest" и "antialiased". Мы также показали, как увеличение разрешения изображения с использованием интерполяции "nearest" по-прежнему может привести к эффекту Моира, но использование более качественных алгоритмов антиалиасинга может уменьшить эти эффекты.