Matplotlib-Bild-Entzerrung

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Tutorial wird Ihnen der Prozess der Entzerrung eines Bildes mit Matplotlib in Python vermittelt. Entzerrung ist eine Technik, die verwendet wird, um stumpfe Kanten zu glätten und Verzerrungen in Bildern zu reduzieren. In diesem Tutorial werden wir mit Matplotlib ein 450x450-Pixel-Bild mit unterschiedlicher Frequenzgenerierung erstellen. Anschließend werden wir das Bild von 450 Datenpunkten auf entweder 125 oder 250 Pixel unterabtasten, um zu demonstrieren, wie Entzerrung verwendet werden kann, um die Moiré-Muster zu reduzieren, die durch die Unterabtastung von Hochfrequenzdaten verursacht werden.

Tipps für virtuelle Maschinen

Nachdem der virtuelle Computer gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby um Hilfe bitten. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie sofort beheben.

Bild generieren

Zunächst müssen wir mit NumPy ein 450x450-Pixel-Bild mit unterschiedlicher Frequenzgenerierung erstellen.

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

Bild mit 'nearest' Interpolation unterabtasten

Nun werden wir das Bild von 450 Datenpunkten auf 125 oder 250 Pixel unterabtasten, indem wir 'nearest' Interpolation verwenden. Dies wird demonstrieren, wie die Unterabtastung von Hochfrequenzdaten Moiré-Muster verursachen kann.

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()

Bild mit 'antialiased' Interpolation unterabtasten

Als nächstes werden wir das Bild von 450 Datenpunkten auf 125 oder 250 Pixel unterabtasten, indem wir 'antialiased' Interpolation verwenden. Dies wird demonstrieren, wie Entzerrung verwendet werden kann, um die durch die Unterabtastung von Hochfrequenzdaten verursachten Moiré-Muster zu reduzieren.

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()

Bild mit 'nearest' Interpolation aufvergrößern

Jetzt werden wir das Bild von 500 Datenpunkten auf 530 gerenderte Pixel mit 'nearest' Interpolation aufvergrößern. Dies wird demonstrieren, dass Moiré-Muster auch bei der Aufvergrößerung des Bildes auftreten können, wenn der Aufvergrößerungsfaktor keine ganze Zahl ist.

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()

Bild mit 'antialiased' Interpolation aufvergrößern

Schließlich werden wir das Bild von 500 Datenpunkten auf 530 gerenderte Pixel mit 'antialiased' Interpolation aufvergrößern. Dies wird demonstrieren, wie die Verwendung besserer Entzerrungsalgorithmen die Moiré-Muster reduzieren kann.

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()

Zusammenfassung

In diesem Tutorial haben wir gelernt, wie man Matplotlib verwendet, um ein Bild zu entzerren, um die durch die Unterabtastung von Hochfrequenzdaten verursachten Moiré-Muster zu reduzieren. Wir haben ein 450x450-Pixel-Bild mit unterschiedlichem Frequenzgehalt generiert und das Bild von 450 Datenpunkten auf entweder 125 Pixel oder 250 Pixel mit 'nearest' und 'antialiased' Interpolation unterabgetastet. Wir haben auch gezeigt, dass das Aufvergrößern eines Bildes mit 'nearest' Interpolation immer noch zu Moiré-Mustern führen kann, aber die Verwendung besserer Entzerrungsalgorithmen diese Effekte reduzieren kann.