Legoteil-Erkennung/Klassifizierung A

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Fabian Lehnert
Betreuer: Prof. Schneider

Motivation

Das Durchzählen von Lego-Bausets ist mühselig und aufwendig. Ein automatisierter Ablauf soll diese Arbeit übernehmen. Ein Teilbereich davon ist die Erkennung und Klassifizierung der einzelnen Legoteile.

Ziel

Erkennung, Klassifizierung und Zuordnung von Legoteilen aus Fotoaufnahmen.

Aufgabe

  1. Einlesen eines Bildes.
  2. Objekterkennung nach den gängigen Verfahren der Bildverarbeitung.
  3. Objektzuordnung anhand einer Bestandsliste (4 Teile).

Lösung

Rahmenbedingungen und Ablaufplan

Um eine eindeutige Zuordnung der Teile zu gewährleisten, muss festgelegt werden, nach welchen Kriterien die erkannten Teile unterschieden werden. Für dieses Projekt wurden folgende Kriterien gewählt:

  • Flächeninhalt
  • Kantenlänge
  • Farbe

Um diese Kriterien nun zu bestimmen, muss das zu analysierende Bild nach gängigen Verfahren der Bildverarbeitung bearbeitet werden. Die Arbeitsschritte lassen sich anhand folgendem Ablaufplan einteilen:

  1. Erfassen der zu analysierenden Bilddatei.
  2. Originalbild Filtern (Gauß-Filter, Median-Filter).
  3. Bild auf Förderband zuschneiden.
  4. Bestimmung der Bauteilkanten.
  5. Bestimmung der Bauteilfläche.
  6. Bestimmung der Bauteilfarbe.
  7. Ausgabe der Ergebnisse und Vergleich mit Inventurliste.

Einlesen eines Bildes

Original Abbildung eines zu analysierenden Legoteils.

Um eine Bilddatei in Matlab einzulesen kann der Befehl imread(filename, fmt) verwendet werden. filename entspricht dabei dem Dateipfad der zu lesenden Bilddatei. Für fmt wird die Dateiendung angegeben. Ein konkretes Beispiel ist: Bild = imread('C:\Users\Fabian\Bilder\Legoteil1.png','png');
Das Bild liegt nun unter dem Namen Bild vor und entspricht einem dreidimensionalen Array in der Form MxNxO. M entspricht der Höhe des Bildes in Pixeln, N entspricht der breite des Bildes in Pixeln und O entspricht der Anzahl der Farbebenen (RGB = 3 Ebenen, Graustufen = 1 Ebene).

Die für dieses Projekt verwendeten Bilder wurden mit Hilfe von Matlab zu einer .mat-Datei zusammengefasst. Es handelt sich dabei um ein vierdimensionales Array. Zu den drei Dimensionen der eigentlichen Bilddatei kommt noch der Bildindex hinzu. Mit diesem lässt sich ein ausgesuchtes Bild auswählen.

Um die erwähnte .mat-Datei in das Projekt zu laden wird der Befehl load(filename) verwendet. filename entspricht dabei wie schon zuvor dem Dateipfad der zu lesenden Datei. Da die geladene Datei als struct vorliegt und noch alle Bilder beinhaltet, wird in einem nächsten Schritt das ausgesuchte Bild mittels Index aus dem struct gelesen. Das Bild liegt nun als dreidimensionales Array im Matlab-Speicher und kann verarbeitet werden.

Objekterkennung nach den gängigen Verfahren der Bildverarbeitung

Um aus dem zu analysierenden Bild die nötigen Informationen zu erhalten, müssen verschiedene Verfahren der Bildverarbeitung angewandt werden.

Filterung
Im ersten Schritt wird das zu analysierende Bild gefiltert. Das Filtern ist für die Kantenerkennung notwendig. Benutzt werden das Median-Filter (zur Unterdrückung von Störungen) und das Gauß-Filter (zum Weichzeichnen). Die Umsetzung der Filter in Matlab folgt durch die Befehle medfilt2(A, [m n]), fspecial('gaussian', [m n], sigma) und conv2(A,B) verwendet. A ist das zu filternde Bild. [m,n] ist gibt die Größe der Filter an. sigma gibt an, wie stark das Bild vom Gauß-Filter beeinflusst werden soll. B entspricht einer zweidimensionalen Gauß-Kurve. Die entsprechende Matrix wurde mit fspecial('gaussian', [m n], sigma) erzeugt. Der Befehl conv2(A,B) faltet das mediangefilterte Bild mit der zweidimensionalen Gauß-Kurve.

Zugeschnittene Abbildung eines zu analysierenden Legoteils auf relevanten Teilbereich.

Zuschnitt
Da nur ein Teilausschnitt der Bilder für die Teileerkennung relevant ist, werden das Ursprungsbild, das mediangefilterte Bild und das gaußgefilterte Bild auf diesen Teilausschnitt zugeschnitten. Dies wird durch eine dreifache for-Schleife realisiert. Dabei werden die drei Farbebenen, sowie Reihen und Spalten durchlaufen. Die relevanten Werte werden anschließend pixelweise und pro Bild in ein neues dreidimensionales Array übertragen.
Anmerkung: Das Zuschneiden der Bilder erfolgt nach dem Bilden der gefilterten Bilder, um Randprobleme, die beim Falten entstehen, zu umgehen.

Abbildung eines zu analysierenden Legoteils nach einer ausgeführten Kantenerkennung.

Kantenerkennung
In diesem Schritt wird die Kantenerkennung realisiert. Dazu wird von dem zugeschnittenen mediangefilterten Bild das zugeschnittene gaußgefilterte Bild subtrahiert. Das Ergebnis ist ein zweidimensionales Array, dessen Werte die Wahrscheinlichkeit für die Existenz einer Kante entsprechen. Dieses wird nun mit einem Schwellwert bearbeitet, sodass sich daraus ein binäres Bild ergibt. In jeder Zelle dieses Arrays befindet sich nun der Wert 1, falls sich dort eine Kante befindet, oder der Wert 0, falls nicht.

Abbildung eines zu analysierenden Legoteils nach einer ausgeführten Flächenerkennung.

Flächenerkennung
In diesem Schritt wird die Flächenerkennung realisiert. Dies wird mittels Farbwerten und verknüpften Bedingungen erreicht. Das Förderband besitzt ein bestimmtes Farbspektrum. Nun soll alles, was nicht in diesem Farbspektrum liegt, zum Flächeninhalt des Bauteils gezählt werden. Die Ebenen (Rot, Grün, Blau) werden erst einzeln betrachtet und anschließend mit UND-Operatoren verknüpft.
Anmerkung: Die Subtraktion eines leeren Hintergrunds vom Originalbild bietet sich in diesem Projekt nicht an. Grund dafür ist die strukturierte Oberfläche des Förderbands, welches im laufenden Prozess unterschiedliche Positionen anfahren kann, wodurch der Hintergrund von aktueller Aufnahme und Referenz nicht mehr identisch sind.
Es wird ein zweidimensionales binäres Array erzeugt. In jeder Zelle dieses Arrays befindet sich nun der Wert 1, falls es die vorangegangenen Bedingungen erfüllt, oder der Wert 0. Dieses Array kann jedoch noch Störungen enthalten. Um diese auszulöschen wird der Befehl bwconncomp(BW,conn) verwendet. Mit diesem ist es möglich ein binäres Bild zu segmentieren. BW entspricht einem binären Bild. conn gibt den Grad der Konnektivität einzelner Segmente an. Als Ausgabe erhält man unter anderem eine Liste mit allen ermittelten Segmenten und deren Größe. Diese Liste wird nun nach Segmenten durchsucht, die eine Mindestgröße aufweisen. Diese werden für weitere Verarbeitungsschritte in ein neues zweidimensionales Array übertragen. Segmente, die nicht die Mindestgröße überschreiten, werden ignoriert. Anschließend wird erneut geprüft, wie viele Segmente noch vorhanden sind.

Kantenlänge und Flächeninhalt
Nachdem Kanten- und Flächenerkennung durchlaufen worden sind, werden die Kantenlänge und der Flächeninhalt bestimmt. Dazu werden die Werte innerhalb der erzeugten Bilder addiert. Da es sich um binäre Bilder handelt, liefert die Aufsummierung der Bildzellen vergleichbare Werte.

Farberkennung
Der letzte Schritt der Bildverarbeitung ist die Farberkennung. Dazu wird eine Maske über das zugeschnittene Originalbild gelegt. Die Maske entspricht dem binären Bild aus der Flächenerkennung. Übrig bleibt das erkannte Bauteil. Von diesem wird nun der Mittelwert der einzelnen Farbebenen gebildet. Dazu werden die Befehle mean(A) für die Mittelwertbildung und round(x) zum Runden des Mittelwerts verwendet. A entspricht der Liste aller zum Bauteil gehörigen Werte. x entspricht dem berechneten Mittelwert.

Objektzuordnung anhand einer Bestandsliste

Zum Überprüfen der Verarbeitung wird nun mit Hilfe von subplot(m,n,p) eine Auswahl von Bildern auf dem Bildschirm ausgegeben. Dazu gehören:

  • Das Originalbild
  • Das zugeschnittene Bild
  • Die binäre Kantenerkennung
  • Die binäre Flächenerkennung

Ein Abgleich mit der Bestandsliste findet nur statt, sofern exakt ein Segment als Flächeninhalt vorliegt. Ist dies nicht der Fall, so wird eine entsprechende Nachricht auf dem Bildschirm ausgegeben. Existiert hingegen exakt ein Segment, werden die ermittelten Werte mit denen aus der Bestandsliste verglichen. Die zu vergleichenden Werte entsprechen den gewählten Kriterien, wobei sich der Farbwert in drei Werte für Rot-, Grün- und Blauanteil unterteilt. Leichten Wertschwankungen wird mit einer Toleranz von 5% beim Abgleich entgegen gewirkt. Stimmen alle Bedingungen überein, wird die Bauteilnummer des erkannten Bauteils auf dem Bildschirm ausgegeben.

Ausblick

In Bezug auf die Motivation lässt sich sagen, dass das Projekt deutliche Erfolge erzielt hat und sich in einem automatisiertem Aufbau anwenden lässt. In Hinblick auf die Effizienz einer solchen Anlage lässt sich das Projekt noch optimieren, beispielsweise indem die Rechenzeit verkürzt wird. Dies kann durch eine niedrigere Auflösung der Bilder und unter Umständen durch eine Umstrukturierung des Quellcodes erreicht werden. Weiterhin ist es denkbar die Erkennungsmerkmale zu Spezifizieren oder zu Erweitern, um eine deutlich höhere Inventurliste abarbeiten zu können.

Siehe auch

  • SVN: Checkout URL | https://svn.hshl.de/svn/DSB/trunk
  • Wilhelm Burger, Mark James Burge.: Digitale Bildverarbeitung. Heidelberg: Springer Verlag, 2015. ISBN 978-3-642-04603-2 ISBN 978-3-642-04604-9 (eBook)
  • Tönnies, K. D.: Grundlagen der Bildverarbeitung. München: Pearson Studium, 2005. ISBN 3-8273-7155-4
  • Mathworks: Image Segmentation URL

Weblinks

https://www.youtube.com/watch?v=FoFPo7Br1_k&feature=youtu.be

BSD-Lizenzbedingung BSD-Lizenz

Copyright (c) 2014, Hochschule Hamm-Lippstadt, Dep. Lip. 1, Prof. Schneider
Hochschule Hamm-Lippstadt. Alle Rechte vorbehalten.



→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2015