Sobel- vs. Canny-Kantendetektor

Schicke ein Testbild durch die vollständige Kantenerkennungs-Pipeline hinter maschinellem Sehen — Graustufen, Gauß-Weichzeichnung, Sobel-Gradienten, Non-Max-Suppression, Canny-Hysterese — und fahre über jeden Schritt, um die Mathematik hinter einem einzelnen Pixel zu untersuchen.

Interaktive Simulation wird geladen...

warum erst geglättet wird und warum zwei Schwellen 🖖

Eine Ableitung verstärkt alles, was ihr zugeführt wird, auch das Rauschen – differenzierst du ein unbearbeitetes Bild, wirkt jede Schwankung um ein einzelnes Pixel wie eine Kante. Die vorherige Faltung mit einem Gauß-Filter (Schritt 2) mittelt dieses Rauschen heraus, während die großräumigen Helligkeitsänderungen echter Kanten nahezu erhalten bleiben. Deshalb glättet jeder praxistaugliche gradientenbasierte Kantendetektor das Bild vor dem Differenzieren. Die Sobel-Kernel sind separierbare Näherungen der partiellen Ableitungen ∂I/∂x und ∂I/∂y. Entlang der jeweils senkrechten Achse werden sie mit 1-2-1 gewichtet, sodass die mittlere Zeile beziehungsweise Spalte stärker in die Schätzung eingeht. Ein einziger Schwellenwert für den resultierenden Betrag zwingt dich zu einer unlösbaren Entscheidung: Ist er niedrig, übersät Rauschen die Ausgabe mit Sprenkeln; ist er hoch, zerfallen kontrastarme Kanten in gestrichelte Bruchstücke. Die Hysterese (Schritt 6) umgeht diesen Zielkonflikt mit zwei Schwellenwerten. Der obere Schwellenwert (Thigh) erkennt Kanten mit hoher Sicherheit. Der untere Schwellenwert (Tlow) gilt nur für Pixel, die bereits an eine starke Kante grenzen. So kann eine echte Kontur einen vorübergehend schwachen Abschnitt durchlaufen, ohne dass Rauschen eine eigene Kontur beginnt. Dasselbe Prinzip der doppelten Schwelle kommt bei der Segmentierung durch Flächenfüllung und in Schmitt-Trigger-Schaltungen zum Einsatz, überall dort, wo ein einzelner Grenzwert ein Flackern verursachen würde.

Zwei Fragen an ein Bild 🖖

Sobel und Canny stellen an dieselbe Aufnahme unterschiedliche Fragen. Sobel erzeugt eine Gradientenkarte: Jeder Pixel erhält einen Wert dafür, wie stark sich die Helligkeit dort ändert, sodass Kanten dick und in Graustufen erscheinen, wie ein weiches Leuchten. Canny nimmt genau diesen Gradienten und erzwingt eine Entscheidung — die Non-Maximum-Suppression behält nur den hellsten Pixel quer über jeden Kamm und dünnt das Leuchten zu einer scharfen Ein-Pixel-Linie aus, die dann als Kante eingestuft wird oder nicht. Wechsle zwischen den Reitern Gradient und Canny, um zu sehen, wie eine verschwommene Karte zu einer sauberen Kontur zusammenfällt.

Cannys Kanten bergen einen eingebauten Zielkonflikt 🖖

John Canny hat sich nicht zu einem Rezept vorgetastet. In seiner Arbeit von 1986 formulierte er die Kantenerkennung als Optimierung mit drei Zielen — echte Kanten finden, sie genau lokalisieren und pro Kante nur einmal ansprechen — und löste sie mit der Variationsrechnung; die Lösung war fast exakt die erste Ableitung einer Gaußfunktion. Der Haken, den er ebenfalls bewies: Detektion und Lokalisierung wirken gegeneinander, je breiter die Glättung wird — ein größeres σ findet schwächere Kanten, verschmiert aber ihre Position, und kein einzelnes σ ist in beidem am besten. Schiebe σ und beobachte es.

Aufgabe vollständig gelöst

  1. Gradientenbetrag an Pixel (31, 3) des Schachbrett-Testbildes 9 Schritte

    Das Schachbrett-Testbild — rein schwarz und weiß, Quadrate 32 Pixel breit — bei σ = 1,0 mit dem 3×3-Weichzeichnungsfilter, Tlo = 30 und Thi = 80. Leiten Sie den Gradientenbetrag am Pixel (31, 3) ab, der letzten weißen Spalte vor der ersten vertikalen Grenze, und ermitteln Sie anschließend, wie viele Pixel breit die Kante ausfällt, zu der er gehört.

    1. Zuerst Graustufen, und bei diesem Bild bewirkt das nichts: Die drei Gewichtungen addieren sich zu genau 1, sodass ein Pixel mit gleichen Rot-, Grün- und Blauwerten seinen Wert behält. Weiß bleibt 255, Schwarz bleibt 0, daher stammt jede nachstehende Zahl aus nur diesen beiden Werten.

    2. Die Gauß-Gewichte fallen mit dem Quadrat des Abstandes ab. Bei σ = 1 erhält das Zentrum 1, die 4 Pixel, die sich eine Kante teilen, erhalten e-0,5 = 0,6065 und die 4 Ecken erhalten e-1 = 0,3679; die Division durch die Summe 4,8976 macht sie zu einem gewichteten Mittelwert.

    3. Zeile 3 liegt weit innerhalb eines horizontalen Streifens, sodass die 3 Zeilen jedes Fensters dort identisch sind und sich die vertikale Struktur des Kernels aufhebt. Es zählen nur seine Spaltensummen, und davon gibt es nur 2.

    4. Weichzeichnen über die Grenze hinweg. Bei x = 31 deckt das Fenster 2 weiße Spalten und 1 schwarze ab; bei x = 32 deckt es 1 weiße und 2 schwarze ab. Der harte Sprung von 255 auf 0 ist zu der Rampe 255, 185, 70, 0 geworden — diese mittleren 2 Werte, gerundet, sind diejenigen, die der Inspektor anzeigt.

    5. Sobel gewichtet die linke Spalte mit -1, -2, -1 und die rechte mit +1, +2, +1 und die mittlere Spalte überhaupt nicht. Wenn alle 3 Zeilen gleich sind, reduzieren sich diese Gewichte auf einen einzigen Faktor von 4, sodass die gesamte Faltung das 4-Fache der Differenz zwischen den Spalten auf beiden Seiten beträgt.

    6. Der vertikale Gradient verschwindet aus dem spiegelbildlichen Grund: Die Zeile über dem Pixel und die Zeile darunter bestehen aus denselben 3 Zahlen, sodass die Summe +1, +2, +1 die Summe -1, -2, -1 Glied für Glied aufhebt. Diese Kante verläuft im Gradienten rein horizontal, was den nächsten Schritt einfach macht.

    7. Kombiniert man beide, entspricht der Betrag genau dem horizontalen.

    8. Vergleicht man dies mit dem Ergebnis derselben Kante ohne Weichzeichnung: ein reiner Sprung von 255 über denselben Kernel. Die Glättung hat 280 Einheiten gekostet, knapp über 27 % der verfügbaren Antwort, und das ist der Preis der Rauschimmunität — kein Rundungsverlust, sondern ein bewusster Kompromiss.

    9. Nun wiederholen wir das eine Spalte weiter rechts. Bei x = 32 liest das Fenster 185, 70, 0, sodass die Differenz wieder -185 und der Betrag wieder 740 beträgt. Eine Spalte weiter außen auf beiden Seiten bricht die Differenz auf etwa -70 und der Betrag auf 280 ein.

    Antwort

    740 — und die Kante fällt 2 Pixel breit aus. Non-Maximum-Unterdrückung behält ein Pixel, wenn sein Betrag ≥ beiden Nachbarn entlang des Gradienten ist. Hier zeigt der Gradient entlang x, sodass Pixel 31 mit 280 zu seiner Linken und 740 zu seiner Rechten verglichen wird, Pixel 32 mit 740 und 280. Beide sind gleichauf, und ein Gleichstand erfüllt ≥, sodass beide überleben; bei 740 liegen beide um mehr als das 9-Fache über Thi = 80, sodass beide weiß herauskommen. Kein Schwellenwertpaar kann sie trennen, da Schwellenwerte nicht die Ursache sind. Die tatsächliche Grenze liegt bei x = 31,5, genau auf halbem Weg zwischen dem letzten weißen und dem ersten schwarzen Pixel, und eine symmetrische Weichzeichnung lässt den Gradienten symmetrisch um diese halbe Zahl — es gibt kein einzelnes Maximum zu finden. Das ist gut zu wissen, bevor man etwas einstellt: Eine doppelte Linie in einer Kantenkarte ist manchmal ein Fehler der Schwellenwertauswahl und manchmal Arithmetik, und hier ist es 740 = 740 auf einem Bild, dessen Quadrate zufällig eine ganze Zahl von Pixeln breit sind.

Quellen (1)

Beispielaufgaben

  • Klare Formen - Die Standardeinstellung auf der Registerkarte „Canny“: σ = 1,4 mit den Schwellenwerten 30 und 80. Bei klaren geometrischen Formen wirkt eine ein Pixel breite Kontur besonders wie eine gezeichnete Linie.
  • Schachbrett-Gradient - Die einzige Voreinstellung, die bei der Gradientenkarte endet. Du siehst daher einen breiten grauen Schimmer statt einer Kantenentscheidung. Zugleich ist dies die Einstellung der Beispielaufgabe: σ = 1,0, Tlo = 30, Thi = 80.
  • Leiterbahnen - σ = 0,8 sorgt hier für die geringste Unschärfe und erhält dadurch die dünnen Kupferleiterbahnen. Die Schwellenwerte sind dieselben wie bei „Gesicht“; nur σ unterscheidet die beiden Einstellungen.
  • Geglättetes Gesicht - σ = 2,5 mit einem 5×5-Kernel erzeugt bei gleichen Schwellenwerten dreimal so viel Unschärfe wie „Leiterplatte“. Die Textur verschwindet, die Struktur bleibt erhalten. Dabei verwischen auch die Kantenpositionen.