Es ist schön, das Funktionsdiagramm mit matplotlib auf einem Jupyter-Notebook zu zeichnen, aber es ist ärgerlich, den Wert zu ändern und jedes Mal, wenn Sie versuchen, einen Fehler zu machen, Strg + Eingabetaste zu drücken. Es ist üblich, Wertänderungen in Ergebnissen mit dem reaktiven (alten?) - ähnlichen Trend, der heutzutage beliebt ist, dynamisch widerspiegeln zu wollen. Als ich danach suchte, schien es, dass eine Bibliothek namens ipywidgets für das Jupiter-Notebook entwickelt wurde, also entschied ich mich, sie zu verwenden.
https://github.com/ipython/ipywidgets
Es scheint auch interaktives Verhalten durch UI-Komponenten wie sogenannte Schieberegler und Textfelder zu ermöglichen.
Ich habe es in der folgenden Umgebung versucht.
Erstellen Sie zunächst eine virtuelle Umgebung mit venv. Wenn Sie eine virtuelle Person oder eine Bash-Person sind, lesen Sie diese bitte entsprechend.
$ python3 -m venv ipywidgets_env
$ source ipywidgets_env/bin/activate.fish #Für Fische
Installieren Sie jupyter normal.
(ipywidgets_env) $ pip install jupyter
Bestätigen Sie leicht, dass ipywidgets als Abhängigkeit zusammengekommen sind. Wenn es nicht existiert, habe ich das Gefühl, dass ich es einfach mit "pip install" einfügen kann.
(ipywidgets_env) $ pip list | grep ipywidgets
ipywidgets (5.2.2)
Führen Sie außerdem den folgenden Befehl für jupyter aus, um die Zeichnungserweiterungsfunktion zu aktivieren.
(ipywidgets_env) $ jupyter nbextension enable --py widgetsnbextension --sys-prefix
Jetzt, da die Umgebung zum Testen von ipywidgets bereit ist, werde ich es auf einem Jupyter-Notebook versuchen.
(ipywidgets_env) $ jupyter notebook
Erstellen Sie nach dem Start ein neues Notizbuch im geöffneten Browser und schreiben Sie eine Funktion, die das Berechnungsergebnis "a * x + b" in eine neue Zelle zurückgibt.
def f(x, a, b):
return a * x + b
Um die Parameter in dieser Funktion mit der UI-Komponente des Schiebereglers zu bedienen, setzen Sie die obige Funktion "f" und den Wertebereich der Parameter "x", "a", "b" auf die Funktion "interagieren", wie unten gezeigt. Ich werde es dir geben.
from ipywidgets import interact
interact(f, x=(-10,10, 1), a=(-10,10, 1), b=(-10,10, 1))
Das Ausführungsergebnis im Browser lautet wie folgt.
Auf dem Bildschirm erschien ein Schieberegler. Spielen Sie mit den Knöpfen herum.
Anfangs war "x = 0, a = 0, b = 0" und das Ergebnis war "0". Wenn Sie jedoch "x = 10, a = 4, b = -10" setzen, wird dies sofort als "30" im Ergebnis wiedergegeben Wird angezeigt. Auf diese Weise konnten wir die dynamische Reflexion des Wertes durch ipywigdets bestätigen.
Als kleine Anwendung möchte ich versuchen, die Binärisierungsschwelle, die eine Standardbildverarbeitung ist, im Ergebnis wiederzugeben, während ich sie selbst betreibe. Ich benutze mein eigenes Symbolbild.
Vorerst werde ich Pillow verwenden, ein Bildverarbeitungswerkzeug in Python. Wenn Sie es bereits installiert haben, müssen Sie den folgenden Befehl nicht ausführen.
(ipywidgets_env) $ pip install Pillow
Importieren Sie zunächst Pillow und laden Sie das 255-Gradationsbild von Greske in die globale Variable "img".
from PIL import Image
img = Image.open('picture.jpeg').convert('L')
@interact
def binarize(th: (0, 255, 1)):
return img.point(lambda p: 255 if p > th else 0)
Sie können ipywidgets auch verwenden, indem Sie eine Funktion "binarize" definieren, die dynamisch von ipywidgets betrieben wird, eine Funktion erstellen, die das Bild nach der Binärisierung durch die Schwellenwertvariable "th" zurückgibt, und einen "interaktiven" Dekorator hinzufügen. können. Wenn Sie die obige Zelle ausführen,
Auf diese Weise können Sie dynamisch binarisieren, während Sie den Schwellenwertregler auf dem Jupiter-Notebook bewegen.
Jetzt, da ich weiß, wie man den Schieberegler verwendet, werde ich versuchen, die berühmte GitHub-Methode zur Bestätigung von Bildunterschieden nachzuahmen. Ich war mit Pillow nicht sehr vertraut und wusste nicht, wie ich die Sättigung eines Teilbilds anpassen sollte. Deshalb habe ich es vergeblich gemacht, das Bild darüber zu legen.
orig = Image.open('picture.jpeg')
@interact
def github_diff(percentage: (0, 100, 1)):
orig_copied = orig.copy()
box = (int(img.width / 100 * percentage), 0, img.width, img.height)
img_cropped = img.crop(box)
orig_copied.paste(img_cropped, box)
return orig_copied
Nach dem Laden des Originalbilds in "orig" wird das Originalbild dynamisch auf der linken Seite angezeigt und das Gresque-Bild wird auf der rechten Seite basierend auf dem vom Schieberegler angegebenen Verhältnis gezeichnet.
Einfügen
scheint eine destruktive Methode zu sein, bei der für jede Wertänderung eine Kopie des Originalbilds erstellt wird.
Ich würde gerne wissen, ob es einen besseren Weg gibt.
Das Jupyter-Notebook, das bereits zum Experimentieren und Verifizieren geeignet ist, wird noch einfacher zu bedienen sein!
Recommended Posts