Programming lesson
Morphologische Bildverarbeitung: Schrumpfen, Verdünnen und Skelettieren in MATLAB
Lerne die Grundlagen der morphologischen Bildverarbeitung kennen: Schrumpfen, Verdünnen und Skelettieren. In diesem Tutorial zeigen wir dir Schritt-für-Schritt, wie du diese Operationen in MATLAB implementierst – mit Beispielen aus der Praxis, angepasst an die Aufgabenstellung von EE569 Homework #3.
Einführung in die morphologische Bildverarbeitung
Die morphologische Bildverarbeitung ist ein fundamentales Werkzeug in der digitalen Bildverarbeitung und wird häufig in der Bildanalyse, Mustererkennung und medizinischen Bildgebung eingesetzt. In diesem Tutorial lernst du die drei wichtigsten morphologischen Operationen kennen: Schrumpfen, Verdünnen und Skelettieren. Diese Techniken sind besonders nützlich, um binäre Bilder zu vereinfachen, Rauschen zu entfernen und die Struktur von Objekten zu extrahieren.
Das Tutorial basiert auf der Problemstellung von EE569 Homework #3 und zeigt dir, wie du diese Operationen in MATLAB implementierst. Wir verwenden dazu die Pattern-Tabellen aus der Vorlesung und wenden sie auf Beispielbilder wie spring, flower und jar an. Am Ende wirst du in der Lage sein, ein Labyrinth zu lösen und Defekte in einem Binärbild automatisch zu erkennen und zu zählen.
Grundlagen der morphologischen Operationen
Morphologische Operationen arbeiten mit strukturierenden Elementen (SE), die als kleine Binärmatrizen definiert werden. Die grundlegenden Operationen sind Erosion und Dilatation. Aus diesen werden komplexere Operationen wie Schrumpfen, Verdünnen und Skelettieren abgeleitet.
Schrumpfen (Shrinking)
Das Schrumpfen reduziert ein Objekt auf einen einzigen Punkt, sofern das Objekt keine Löcher hat. Es wird durch wiederholte Erosion mit einem geeigneten strukturierenden Element erreicht, bis das Objekt verschwindet. Der letzte Punkt vor dem Verschwinden ist der Schrumpfpunkt.
Verdünnen (Thinning)
Das Verdünnen reduziert ein Objekt auf seine Mittellinie, ohne die Topologie zu verändern. Es wird durch eine Kombination von Erosion und Hit-or-Miss-Transformation realisiert. Das Ergebnis ist ein Skelett, das die Grundstruktur des Objekts widerspiegelt.
Skelettieren (Skeletonizing)
Das Skelettieren extrahiert das mediale Achsenskelett eines Objekts. Es ist verwandt mit dem Verdünnen, liefert aber ein genaueres Skelett, das die Entfernung zum Rand berücksichtigt. In MATLAB kann die Funktion bwmorph verwendet werden.
Implementierung in MATLAB
Wir implementieren die drei Operationen basierend auf den Pattern-Tabellen aus der Vorlesung. Die Tabellen definieren 3x3-Muster, die auf jedes Pixel angewendet werden. Für das Schrumpfen und Verdünnen verwenden wir die Hit-or-Miss-Transformation mit den entsprechenden Mustern.
Schrumpfen implementieren
function shrunk = shrink(I) % I: binäres Bild % Verwendet Pattern-Tabelle für Schrumpfen % Iterative Erosion mit strukturierendem Element se = strel('square', 3); prev = I; curr = imerode(prev, se); while ~isequal(curr, prev) prev = curr; curr = imerode(prev, se); end shrunk = curr;endVerdünnen implementieren
function thinned = thin(I) % I: binäres Bild % Verwendet Hit-or-Miss-Transformation thinned = bwmorph(I, 'thin', Inf);endSkelettieren implementieren
function skel = skeletonize(I) % I: binäres Bild % Verwendet bwmorph skel = bwmorph(I, 'skel', Inf);endAnwendung auf Beispielbilder
Wir wenden die Operationen auf die Bilder spring, flower und jar an. Diese Bilder sind binär und zeigen verschiedene Formen. Die Ergebnisse werden visualisiert und diskutiert.
Ergebnisse für spring
Das Bild spring zeigt eine Spirale. Nach dem Schrumpfen wird die Spirale auf einen Punkt reduziert. Das Verdünnen liefert eine Linie, die der Spirale folgt. Das Skelett zeigt die mediale Achse.
Ergebnisse für flower
Das Bild flower zeigt eine Blume. Das Schrumpfen reduziert die Blütenblätter auf einen zentralen Punkt. Das Verdünnen erzeugt ein dünnes Gerüst, das die Blütenform nachzeichnet.
Ergebnisse für jar
Das Bild jar zeigt einen Krug. Das Skelettieren extrahiert die Umrisse und die Henkelstruktur.
Labyrinth-Lösung mit morphologischen Operationen
Ein klassisches Problem ist die Lösung eines Labyrinths mit morphologischen Methoden. Die Idee ist, die Wände des Labyrinths zu verdünnen, bis nur noch der Weg übrig bleibt. Wir gehen wie folgt vor:
- Lade das Binärbild des Labyrinths (weiß = Weg, schwarz = Wand).
- Wende das Verdünnen auf die Wände an, bis sie auf eine Linie reduziert sind.
- Die verbleibenden weißen Pixel bilden den Lösungsweg.
maze = imread('maze.png'); % Binärbild walls = ~maze; % Wände sind schwarz, wir invertieren thinned_walls = bwmorph(walls, 'thin', Inf); solution = ~thinned_walls; imshow(solution);Diese Methode funktioniert gut für Labyrinthe ohne Zyklen. Bei komplexeren Labyrinthen können zusätzliche Schritte erforderlich sein.
Defekterkennung und -zählung
Im dritten Teil des Tutorials betrachten wir ein Binärbild eines Pferdes mit schwarzen Defekten. Ziel ist es, die Anzahl der Defekte, ihre Größenverteilung und die Korrektur des Bildes zu bestimmen.
Defektzählung
Wir verwenden die MATLAB-Funktion bwlabel, um zusammenhängende Komponenten zu identifizieren. Die Anzahl der Komponenten entspricht der Anzahl der Defekte.
horse = imread('horse.png'); defects = horse == 0; % Schwarze Pixel [labeled, numDefects] = bwlabel(defects); fprintf('Anzahl Defekte: %d
', numDefects);Größenverteilung
Die Größe jedes Defekts wird durch die Anzahl der Pixel in der Komponente bestimmt. Ein Histogramm zeigt die Häufigkeit der verschiedenen Größen.
stats = regionprops(labeled, 'Area'); areas = [stats.Area]; histogram(areas); xlabel('Defektgröße (Pixel)'); ylabel('Häufigkeit');Defektkorrektur
Um die Defekte zu korrigieren, können wir eine morphologische Schließung (Dilatation gefolgt von Erosion) anwenden, um kleine Löcher zu füllen. Alternativ kann eine mediane Filterung verwendet werden.
se = strel('disk', 5); corrected = imclose(horse, se); imshow(corrected);Alternative Methode
Neben morphologischen Filtern können auch Deep Learning-Ansätze wie Convolutional Neural Networks (CNNs) zur Defekterkennung eingesetzt werden. Diese lernen Merkmale direkt aus den Daten und sind besonders robust gegenüber Rauschen.
Fazit
In diesem Tutorial hast du die Grundlagen der morphologischen Bildverarbeitung kennengelernt und in MATLAB implementiert. Du kannst nun Schrumpfen, Verdünnen und Skelettieren anwenden, um binäre Bilder zu analysieren. Die Techniken sind vielseitig einsetzbar, von der Labyrinthlösung bis zur industriellen Qualitätskontrolle. Mit den erlernten Methoden bist du bestens gerüstet für die Aufgaben in EE569 Homework #3.