Einführung
In diesem Lab wird gezeigt, wie das RangeSlider-Widget in Matplotlib verwendet werden kann, um die Schwellwertbildung eines Bildes zu steuern. Das Ziel der Schwellwertbildung ist es, ein Graustufenbild in ein binäres Bild umzuwandeln, bei dem die Pixel entweder schwarz oder weiß sind. Dies ist nützlich bei der Bildsegmentierung, wenn wir bestimmte Merkmale aus dem Bild extrahieren möchten.
Tipps für die VM
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.
Ein falsches Bild generieren
Zunächst werden wir ein falsches Graustufenbild mit dem Zufallsmodul von NumPy generieren. Wir werden den Seed setzen, um sicherzustellen, dass die Ergebnisse reproduzierbar sind.
np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)
Zeige das Bild und seinen Histogramm an
Als nächstes werden wir das Bild mit der imshow-Funktion von Matplotlib und dessen Histogramm mit hist anzeigen. Wir werden eine Figur mit zwei Teilplots erstellen, einen für das Bild und einen für das Histogramm.
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)
im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histogram of pixel intensities')
Erzeuge den RangeSlider
Wir werden nun das RangeSlider-Widget erstellen, mit dem wir den Schwellwert des Bildes anpassen können. Wir werden eine neue Achse für den Slider erstellen und sie zur Figur hinzufügen.
slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())
Füge vertikale Linien zum Histogramm hinzu
Um den Effekt der Schwellwertbildung leichter zu erkennen, werden wir vertikale Linien zum Histogramm hinzufügen, um die aktuellen Schwellwerte anzuzeigen. Wir werden zwei Linien für die untere und die obere Schwellenwerte erstellen.
lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')
Erstelle eine Callback-Funktion für den Slider
Wir werden eine Callback-Funktion erstellen, die jedes Mal aufgerufen wird, wenn der Benutzer die Schwellwerte mit dem Slider ändert. Die Funktion wird die Farbkarte des Bildes und die Positionen der vertikalen Linien auf dem Histogramm aktualisieren.
def update(val):
## Der Wert, der an eine Callback-Funktion von RangeSlider übergeben wird,
## wird ein Tupel von (min, max) sein
## Aktualisiere die Farbkarte des Bildes
im.norm.vmin = val[0]
im.norm.vmax = val[1]
## Aktualisiere die Position der vertikalen Linien
lower_limit_line.set_xdata([val[0], val[0]])
upper_limit_line.set_xdata([val[1], val[1]])
## Zeichne die Figur erneut, um sicherzustellen, dass sie aktualisiert wird
fig.canvas.draw_idle()
slider.on_changed(update)
Zeige die Figur an
Schließlich werden wir die Figur mit dem Bild und dem Slider anzeigen.
plt.show()
Zusammenfassung
In diesem Lab haben wir gezeigt, wie man das RangeSlider-Widget in Matplotlib verwendet, um die Schwellwertbildung eines Bildes zu steuern. Wir haben gezeigt, wie man ein gefälschtes Graustufenbild erstellt, es und dessen Histogramm anzeigt, einen Slider zum Anpassen der Schwellwerte erstellt und das Bild und das Histogramm basierend auf den Sliderwerten aktualisiert. Diese Technik kann für die Bildsegmentierung und andere Anwendungen verwendet werden, bei denen wir bestimmte Merkmale aus einem Bild extrahieren müssen.