Kanten und Konturen
Sobel, Canny und findContours: wie man Umrisse findet, zählt und vermisst, ohne ein einziges Modell zu trainieren.
Die Idee
Wo ein Bild von hell nach dunkel springt, ist eine Kante. Ein Rechner findet diese Stellen, indem er benachbarte Pixel voneinander abzieht: kleiner Unterschied bedeutet Fläche, großer Unterschied bedeutet Kante.
Wozu es gut ist
- Teile auf einem Förderband zählen.
- Prüfen, ob ein Bauteil den richtigen Umriss hat.
- Ein Dokument im Foto finden und entzerren.
- Linien, Kreise und Rechtecke messen.
Canny mit automatischen Schwellwerten
import cv2, numpy as np
def canny_auto(grau, sigma=0.33):
v = float(np.median(grau))
unten = int(max(0, (1.0 - sigma) * v))
oben = int(min(255, (1.0 + sigma) * v))
return cv2.Canny(grau, unten, oben)
img = cv2.imread("teile.jpg")
grau = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
grau = cv2.GaussianBlur(grau, (5, 5), 0) # ohne das: Rauschkanten
kanten = canny_auto(grau)
konturen, _ = cv2.findContours(kanten, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
for k in konturen:
flaeche = cv2.contourArea(k)
if flaeche < 800:
continue
umfang = cv2.arcLength(k, True)
ecken = cv2.approxPolyDP(k, 0.02 * umfang, True)
rund = 4 * np.pi * flaeche / (umfang ** 2) # 1,0 = perfekter Kreis
form = "Kreis" if rund > 0.85 else f"{len(ecken)}-Eck"
print(f"Flaeche {flaeche:8.0f} Rundheit {rund:.2f} -> {form}")Die Konturmerkmale, die man braucht
| Merkmal | Funktion | Wofür |
|---|---|---|
| Fläche | contourArea | Filtern, Größe prüfen |
| Umfang | arcLength | Rundheit, Glattheit |
| Rechteck | boundingRect | Zuschneiden, Position |
| Gedrehtes Rechteck | minAreaRect | Winkel bestimmen |
| Hülle | convexHull | Fehlende Stücke erkennen |
| Momente | moments | Schwerpunkt berechnen |
Der Gradient
Die vier Schritte von Canny
- 01
Glätten
Gaußfilter, damit Rauschen keine Gradienten erzeugt.
- 02
Gradient bestimmen
Sobel in beiden Richtungen, daraus Betrag und Richtung.
- 03
Nicht-Maxima unterdrücken
Nur der stärkste Punkt quer zur Kantenrichtung bleibt stehen. Dadurch werden die Linien ein Pixel dünn.
- 04
Hysterese
Punkte über dem oberen Schwellwert sind sicher Kante. Punkte zwischen den Schwellwerten nur dann, wenn sie mit einer sicheren Kante zusammenhängen.
Der vierte Schritt ist der eigentliche Gewinn: er verbindet unterbrochene Linien und unterdrückt gleichzeitig isolierte Störpunkte, was mit einem einzigen Schwellwert nicht gleichzeitig möglich ist.
Vermessen mit Referenz
Die Einschränkung „in derselben Ebene" ist entscheidend. Objekte, die näher an der Kamera liegen, erscheinen größer, und ohne Entzerrung ist die Messung um den perspektivischen Faktor falsch. Bei senkrechter Aufnahme mit einem Referenzobjekt neben dem Prüfteil sind Genauigkeiten unter einem Prozent erreichbar, bei schräger Aufnahme ohne Entzerrung leicht zehn Prozent daneben.
Passende Kurse und Quellen
OpenCV-Tutorials
Die offiziellen Anleitungen zu Filtern, Kanten, Merkmalen und Kalibrierung, jeweils mit lauffähigem Python-Code.
Für alle, die Bildverarbeitung selbst schreiben; jedes Beispiel ist lauffähig.