Wie ein Programm Kanten in einem Bild findet
Eine Kante ist eine Stelle im Bild, an der sich die Helligkeit stark ändert, zum Beispiel am Rand eines Objekts. Ein Programm findet sie, indem es Nachbarpixel voneinander abzieht.
Kanten zeigen Umrisse. Damit lassen sich Fahrbahnlinien, Formen und Ränder von Münzen vermessen, ohne ein Objekt zu verstehen.
Am Ende dieser Lektion
Notiz
Ich kann aus den Differenzen der Nachbarpixel eine Kantenkarte eines Bildes berechnen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Kante | eine Stelle, an der sich die Helligkeit stark ändert |
| Gradient | der Unterschied zwischen zwei Nachbarpixeln |
| Kantenstärke | wie stark sich die Helligkeit an einer Stelle ändert |
| Kantenkarte | ein Bild aus 0 und 1, das die Kantenpixel markiert |
| Umriss | die Linie rund um ein Objekt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Gradient ist der Unterschied zweier Nachbarn
Der waagerechte Gradient eines Pixels ist der Wert rechts von ihm minus der Wert links von ihm. Der senkrechte ist der Wert unter ihm minus der Wert über ihm.
Die Kantenstärke addiert die Beträge beider: abs(gx) + abs(gy). Ein Betrag ist die Zahl ohne Vorzeichen. Ist die Stärke größer als eine Schwelle, ist das Pixel ein Kantenpixel.
Beispiel: eine Zeile mit einer Kante
| Spalte | Wert links | Wert rechts | Gradient gx |
|---|---|---|---|
| 1 | 10 | 10 | 0 |
| 2 | 10 | 200 | 190 |
| 3 | 10 | 200 | 190 |
| 4 | 200 | 200 | 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den Gradienten einer Zeile rechnen
# Eine Zeile mit einer Kante zwischen Spalte 2 und Spalte 3.
zeile = [10, 10, 10, 200, 200, 200]
for s in range(1, len(zeile) - 1):
gx = zeile[s + 1] - zeile[s - 1]
print("Spalte", s, "Gradient", gx)
# Ändern Sie die 200 in 20 und starten Sie erneut.
Ein glatter Verlauf hat keine Kante
Das Bild gradient.png steigt von Schwarz links bis Weiß rechts, in jeder Spalte um 1. Zwei Spalten weiter liegt der Wert um 2 höher.
Der Befehl rechnet den Wert in Spalte 12 minus den Wert in Spalte 10 und gibt 2 aus. Ein Gradient von 2 ist überall gleich klein, also ist das keine Kante.
Den Gradienten eines Verlaufs lesen
docker exec jupyter python3 -c "from PIL import Image; import numpy as np; z = np.array(Image.open('images/gradient.png')).astype(int); print(z[0, 12] - z[0, 10])"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript edges.py nutzt ein genaueres Verfahren
Das Skript gibt englische Wörter aus: picture pixels heißt Bildpixel, edge pixels Kantenpixel. Es nutzt canny, ein bekanntes Verfahren von scikit-image: Es glättet zuerst leicht und sucht dann die stärksten Stellen.
shapes.png hat 60000 Pixel, davon sind 1326 Kantenpixel. Sie liegen als dünne Linien rund um die Rechtecke, Kreise und Dreiecke. Das Skript speichert die Karte als shapes_edges.png.
Die Kanten der Formen zählen
docker exec jupyter python3 steps/edges.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, Kanten lägen dort, wo es hell ist. Eine Kante liegt dort, wo sich der Wert ändert. Auch ein sehr heller Bereich hat in seiner Mitte keine Kante, nur an seinem Rand.