Wie ein Programm Objekte in einem Bild zählt
Ein Programm zählt Objekte in einem Bild, indem es in einer Maske zusammenhängende Bereiche sucht. Jede Gruppe von Pixeln, die sich berührt, ist ein Objekt. Das Verfahren heißt Labeling, deutsch Beschriften.
So zählt man Münzen, Zellen unter dem Mikroskop oder Pakete auf einem Band. Dazu kommt das Suchen eines Bildstücks im Bild.
Am Ende dieser Lektion
Notiz
Ich kann die zusammenhängenden Bereiche einer Maske zählen und ihre Flächen angeben.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Bereich | eine Gruppe von Pixeln, die sich berühren |
| Nachbarschaft | welche Pixel als berührend gelten, 4 oder 8 |
| Labeling | jedem Bereich eine eigene Nummer geben |
| Fläche | die Zahl der Pixel eines Bereichs |
| Template Matching | ein kleines Bild in einem großen suchen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Vier oder acht Nachbarn: das ändert die Zahl
Zwei Pixel berühren sich, wenn sie Nachbarn sind. Bei 4 Nachbarn zählen nur oben, unten, links und rechts. Bei 8 Nachbarn zählen auch die vier Ecken.
Das gilt für jede Zählung. Zwei Pixel, die sich nur an einer Ecke berühren, sind bei 8 Nachbarn ein Bereich und bei 4 Nachbarn zwei Bereiche.
Beispiel: ein Gitter, 4 oder 8 Nachbarn
| Zeile | Spalte 0 | Spalte 1 | Spalte 2 | Spalte 3 |
|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 2 | 0 | 0 | 1 | 1 |
| Bereiche | mit 4 Nachbarn: 2, Flächen 2 und 3 | mit 8 Nachbarn: 1, Fläche 5 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
scikit-image nutzt standardmäßig 8 Nachbarn
Die Bibliothek scikit-image beschriftet mit measure.label. Ohne weitere Angabe nutzt sie 8 Nachbarn. Mit connectivity=1 nutzt sie 4.
Der Befehl beschriftet ein Gitter mit zwei Einsen, die sich nur an einer Ecke berühren, und zählt die Bereiche mit beiden Einstellungen. Er gibt 1 2 aus: erst 8, dann 4 Nachbarn.
Dieselbe Ecke mit 8 und mit 4 Nachbarn
docker exec jupyter python3 -c "import numpy as np; from skimage import measure; g = np.array([[1, 0], [0, 1]]); print(measure.label(g).max(), measure.label(g, connectivity=1).max())"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Bereiche mit einem Stapel zählen
# Ein kleines Gitter: 1 ist Objekt, 0 ist Hintergrund.
gitter = [
[1, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 1, 1],
]
# Zähle die Einsen, die Stück für Stück zusammenhängen (4 Nachbarn).
besucht = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
anzahl = 0
for z in range(3):
for s in range(4):
if gitter[z][s] == 1 and besucht[z][s] == 0:
anzahl = anzahl + 1
stapel = [[z, s]]
besucht[z][s] = 1
while len(stapel) > 0:
stelle = stapel.pop()
for nachbar in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
zz = stelle[0] + nachbar[0]
ss = stelle[1] + nachbar[1]
if 0 <= zz < 3 and 0 <= ss < 4:
if gitter[zz][ss] == 1 and besucht[zz][ss] == 0:
besucht[zz][ss] = 1
stapel.append([zz, ss])
print("Bereiche:", anzahl)
# Die Einsen bei Zeile 0, Spalte 1 und Zeile 1, Spalte 2 berühren sich nur an der Ecke.
Das Skript count.py zählt die Münzen
Das Skript gibt englische Wörter aus: objects found heißt gefundene Objekte, areas in pixels Flächen in Pixeln. Es schneidet das Münzbild mit der Schwelle 100 zu einer Maske und beschriftet sie.
Es findet 9 Objekte, genau die neun Münzen. Die Flächen kommen in drei Größen: dreimal 657, dreimal 1313 und dreimal 2553 Pixel. Die Münzen berühren sich nicht, daher ändert sich die Zahl bei 4 Nachbarn nicht.
Die Münzen zählen und messen
docker exec jupyter python3 steps/count.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 Bildstück im Bild suchen
Template Matching schiebt ein kleines Bild, die Vorlage, über das große und rechnet an jeder Stelle eine Bewertung. Eine Bewertung von 1 heißt: genau gleich.
Das Skript find.py schneidet ein Stück von 40 mal 40 Pixeln bei 30, 30 aus dem Münzbild und sucht es wieder. Es findet es bei 30 30 mit der Bewertung 1,0. Das ist kein Wunder, denn das Stück stammt aus demselben Bild. Bei einem anderen Foto läge die Bewertung unter 1.
Das ausgeschnittene Stück wiederfinden
docker exec jupyter python3 steps/find.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, die Zahl der Objekte sei die Zahl der weißen Pixel. Weiße Pixel messen die Fläche, Objekte sind die Gruppen. Das Münzbild hat 13569 weiße Pixel, aber nur 9 Objekte.