Bildschwellwertbildung mit RangeSlider

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 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.