WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Risse in einem Foto erkennen und in Vektoren umwandeln

 

Markus_667
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 12:45     Titel: Risse in einem Foto erkennen und in Vektoren umwandeln
  Antworten mit Zitat      
Hallo an alle hier im Forum. Ich hoffe das ich den Post hier an der richtigen Stelle einfüge.
Ich habe folgendes Problem. Ich habe eine Fotografie, worauf Risse in einer homogenen Masse zu sehen sind. Diese Fotografie muss ich in Matlab einlesen und die Risse als Vektoren erfassen um die Länge mathematisch bewerten zu können. Leider habe ich mit Matlab bisher ausschließlich Dgls sowie andere Gleichungen gelöst und habe von anderen Funktionen keine Ahnung. Kann mir da jemand weiterhelfen ? Für Literaturempfehlungen oder andere Lösungsansätze wäre ich sehr dankbar.

Vielen Dank schon mal ...
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.05.2012, 12:36     Titel: Re: Risse in einem Foto erkennen und in Vektoren umwandeln
  Antworten mit Zitat      
Hallo Markus_667,

möchtest Du die Risse automatisch erkennen lassen oder manuell auf einem Bild per Maus markieren?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2012, 13:34     Titel:
  Antworten mit Zitat      
Hallo Jan S

Vorzugsweise möchte ich einen gewissen Automatisierungsgrad erreichen und die Risse automatisch selektieren lassen aber ich würde mich auch mit einer manuellen Auswahl zufriedengeben. Ist natürlich auch vom Aufwand abhängig.
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2012, 16:53     Titel:
  Antworten mit Zitat      
Hat Keiner eine Idee ?
Vielleicht wie ich in einem angezeigtem Bild ein Koordinatensystem einbauen kann und dann mit der Maus die Endpunkte der Risslinien manuell selektieren kann.
Vielleicht mehrere Punkte mit der Maus auswählen und dann eine Funktion annähern (Wie eine Art Spline)

Wäre super wenn ich noch ein paar Denkanstöße bekommen könnte.
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2012, 17:56     Titel:
  Antworten mit Zitat      
Ich denke die Risse kannst Du über eine klassische Kantendedektion innerhalb des Bildes finden. Damit würdest Du eben schon einmal Deine Risse als Kanten finden, anhand der Kanten und eines Bezugssystems kannst Du dann die Koordinaten der Kanten ermitteln und dann z.B. einen Spline erzeugen, wobei ich ggf das noch einmal überdenken würde, denn ein Spline ist letztendlich ein Polynom. Risse würde ich nicht unbedingt als Polynom beschreiben, sondern vielleicht sogar eher als stückweise definitierte Funktionen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 19:04     Titel:
  Antworten mit Zitat      
Ok der Tip war super.
Ich habe die Ränder mit Kantendetektion nun gefunden und ein SW Image mit den weißen Kanten vorliegen. Hab das Bild mal mit beigefügt. Nun möchte ich automatisch die Länge von den Spitzen der Risse bis in das Zentrum ermitteln. Hat da vielleicht noch jemand ein paar Denkanstöße.

Danke schon mal

Bildschirmfoto 2012-06-22 um 18.57.53.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2012-06-22 um 18.57.53.png
 Dateigröße:  10 KB
 Heruntergeladen:  887 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 19:26     Titel:
  Antworten mit Zitat      
Du musst jetzt aus den Daten des Gradientenbildes Kantenzüge ermitteln oder direkt die Linien Dir erzeugen.

Direkte Linien kann man mit Hilfe von http://de.wikipedia.org/wiki/Hough-Transformation bestimmen

Ansonsten würde sich http://de.wikipedia.org/wiki/Segmen.....onenorientierte_Verfahren anbieten

Was aber generell noch fehlt ist, dass Du ja wenn Du ja noch dedektieren musst, ob es sich um eine Kante handelt und nicht ggf. um eine zufällige Störung in Deinen Daten, d.h. Du benötigst noch eine Klassifizierung Deiner Daten http://de.wikipedia.org/wiki/Klassifizierung
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 17:29     Titel:
  Antworten mit Zitat      
Hallo Zusammen,

danke für die Tips, da waren super Anregungen dabei. Ich hab das jetzt soweit hin bekommen dass ich die Kannten erkenne und dann auf eine Pixel Linie verdünnen kann. Allerdings ist das noch nicht so ausgereift, da ich mir diesem "Skeletting" etwas Risslänge entferne. Ich denke aber dass ich dann im Nachhinein zurückrechnen kann. Der Anhang zeigt meinen Fortschritt.
Nur stellt sich mir jetzt das Problem, dass ich eine binäre Matrix vorliegen habe die nur aus 0 und 1 besteht. Ich möchte jetzt ein paar Stützstellen ermitteln um ein Polygon oder einen Spline da rein zu legen. Damit möchte ich dann die Länge der Risse respektive der Polygone ermitteln.
Is sicherlich nicht sehr komplex jedoch steh ich da völlig auf dem Schlauch.
Kann dabei bitte noch jemand helfen ?

Danke schonmal.

Bildschirmfoto 2012-06-28 um 17.21.39.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2012-06-28 um 17.21.39.png
 Dateigröße:  7.26 KB
 Heruntergeladen:  755 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 18:20     Titel:
  Antworten mit Zitat      
Gerade bei dem Beispiel hast Du eigentlich schon ein praktisches Problem, denn wie stellst Du das Polynom auf, denn Du hättest, wenn ich das Bild als Koordinatensystem betrachte, dann könnte es bei Dir den Fall geben, dass folgendes gilt:
f(x) = y1 = y2

d.h. Du hättest für den gleichen X-Wert zwei mögliche Y-Werte und damit kannst Du nicht mehr eindeutig das Polynom aufstellen. Du müsstest, bevor Du eine Polynominterpolation machst, erst einmal überlegen wie Du die Daten so zerteilst, dass sie eindeutig werden. Denn in dem Beispiel liegen ja eine Art "Stern" vor. Was sich evtl anbietet, dass Du immer bis zu Schnittpunkten die Daten zerteilst und dann immer nur für einen Datensatz die Interpolation durchführst.

Rein technisch kannst Du aus der binären Matrix ja alle 0-Elemente rauswerfen und Dir mit Hilfe von find und der Matrixgröße die Tuppel (x,y) geben lassen, also binär in Koordinaten umwandeln. Ich sehe im Moment noch das Problem der Eindeutigkeit der Daten, denn Du musst irgendwie entscheiden können, welche Tupel zu welchen Polynom gehören. Ein recht einfacher Ansatz wäre zu sagen, wenn die Y-Koordinate für gleiche X-Koordinaten unterschiedlich ist, dann gehört es auch zu unterschiedlichen Polynomen, das bedeutet dann, dass Du letztendlich immer Polynome bestimmst, die bis zu einem Schnittpunkt gehen.
Evtl kannst Du aber auch aufgrund Deiner Daten noch weitere Annahmen machen, womit es dann evtl leichter wird
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 20:21     Titel:
  Antworten mit Zitat      
Ja da hast du natürlich recht dass keine eindeutige Zuordnung passieren kann. Aber ich dachte, da ich nicht alle Punkte benötige kann man eine Doppelung vermeiden. Oder ich suche vom Mittelpunkt aus wie viele "Arme" weg gehen und betrachte diese dann separat. Das sollte auf Pixelebene kein Problem sein. Ich denke da an "bwhitmiss". nur was ist wenn sich die Risse Kreuzen... Sad.
Vielleicht sollte ich einen anderen Ansatz wählen, da es ja im Endeffekt nur um die Risslänge vom Mittelpunkt aus geht.
Den ich bis jetzt immer noch manuell selektiere. Bei manchen Bildern ist nur ein Riss vorhanden, da ist die Detektion des Mittelpunktes fast nicht automatisch möglich.
Ich bin da also noch für alles offen.

Hab auch schon überlegt die Pixel zu addieren, aber dann müsste ich auch Unterscheiden ob die Pixel gerade oder schräg aneinander sitzen. Da ich bei den Schrägen immer den Faktor sqr(2) dabei habe.

Ich habe eine andere Arbeit gefunden, bei der Objekte erfasst werden und die Kanten ermittelt. Danach werden die Kanten in einem KS dargestellt und Stützpunkte ermittelt. Ich habe leider nur die Bilder dazu und nicht wie die darauf kommen. Ich kann das Bild ja mal posten, vielleicht erkennt jemand was da passiert ist.

Danke schon mal... Smile

Bildschirmfoto 2012-06-28 um 20.08.48.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2012-06-28 um 20.08.48.png
 Dateigröße:  32.23 KB
 Heruntergeladen:  837 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 21:01     Titel:
  Antworten mit Zitat      
Markus_667 hat Folgendes geschrieben:

Ich habe eine andere Arbeit gefunden, bei der Objekte erfasst werden und die Kanten ermittelt. Danach werden die Kanten in einem KS dargestellt und Stützpunkte ermittelt. Ich habe leider nur die Bilder dazu und nicht wie die darauf kommen. Ich kann das Bild ja mal posten, vielleicht erkennt jemand was da passiert ist.


Da kann ich weiterhelfen, man verwendet dazu die konvexe Hülle http://de.wikipedia.org/wiki/Konvexe_Hülle und um diese zu bestimmen gibt es den Graham-Scan-Algorithmus http://de.wikipedia.org/wiki/Graham_Scan Dies wird aber in Deinem Fall nicht funktionieren, da Du ja keine konvexe Hülle hast

Ich denke die Ermittlung von Kantenzügen (Canny Edge Detection) sollte auch weiter helfen http://de.wikipedia.org/wiki/Canny-Algorithmus
Ein Pixel gehört zu einem Kantenzug, wenn es in Deinem Gradientenbild ein Pixel mit dem Wert 1, überhalb, unterhalb, rechts oder links vom aktuellen Pixel gibt. Als Datenstruktur verwendet man dazu http://de.wikipedia.org/wiki/Quadtree
D.h. in Deinem Fall wandel das Binärbild in reale X-Y-Koordinaten um und entferne alle 0 Elemente. Starte nun bei einem Tupel und suche die benachbarten Pixel, wenn welche existieren, füge sie in den Kantenzug ein. Wiederhole das so lange, bis keine Nachbarn mehr existieren und nehme dann das nächste Pixel aus dem umgewandelten Binärbild, sofern es noch nicht in einem Kantenzug enthalten ist.
Ich würde hier, da wie in dem Beispielbild zu sehen ist, deine "Risskanten" sich an Punkten treffen, die Dedektion dahingehend abwandeln, dass ich den Kantenzug erweitere, wenn nur ein Nachbar existiert, bei mehr als einem würde ich das Pixel zwar in den Kantenzug übernehmen, aber den Kantenzug abbrechen. Damit werden dann die Kanten so selektiert, dass Du zwar den Schnittpunkt erhällst, aber jeden Kantenzug für sich betrachtet werden kann. Für jeden Kantenzug kannst Du dann das Polynom bestimmen, da ja direkt in Der Datenstruktur X- und Y-Koordinate abgelegt und diese eindeutig sind.

Z.b. hättest Du dann einen Kanntenzug [(3,4), (4,5), (5,6), (6,6), (7,6), (8,6)] und [(3,12), (4,13), (5,13),(6,14)] Die Tupel kannst Du dann ggf direkt als Stützstellen Deiner Polynome verwenden. Dadurch, dass Du ein binäres Gradientenbild hast, musst Du nur zu den nicht-null Elementen die Nachbarn ermitteln, wobei Du ggf nicht nur die 1-Pixel-Nachbarn berücksichtigen kannst, sondern auch die n-Pixel-Nachbarn, damit kannst Du Kantenzüge verbinden, die mehr als n-Pixel auseinander liegen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 22:35     Titel:
  Antworten mit Zitat      
Man man man ich bin beeindruckt... du scheinst ein MVP zu sein. Smile Dankeschön, ich führe mir das morgen mal in Ruhe vor's geistige Auge.
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2012, 23:08     Titel:
  Antworten mit Zitat      
Markus_667 hat Folgendes geschrieben:
Man man man ich bin beeindruckt... du scheinst ein MVP zu sein. Smile

Vielen Dank, aber ich denke dass das zu viel des Lobes ist. Ich habe nur ein gutes Gedächtnis Razz

@topic: Da Du ja am Anfang des Threads gesagt hattest, dass Du Risse hast, kann es evtl ja nötig sein, nicht nur die Kante, sondern auch die Fläche des Risses zu ermitteln, d.h. Du würdest wie gehabt die Kanten dedektieren und dann die Kanten "verbinden", d.h. aus den Koordinatentupeln dann mit Hilfe des Graham-Scan die Fläche ermitteln. Denn der Riss lässt sich ja durch die Kante umschließen, und um diese Fläche mathematisch zu formulieren benötigst Du eben die konvexe Hülle.
Also wäre dann Dein Algorithmus: Bild via Kantendedektion binarisieren, Tupel (x,y) der Nicht-Null-Koordinaten ermitteln, Kantenzüge / konvexe Hülle aus den Tupeln erzeugen
Private Nachricht senden Benutzer-Profile anzeigen
 
Markus_667
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2012, 10:58     Titel:
  Antworten mit Zitat      
Ok ich hab mir das mit der Hülle mal zu Gemüte geführt aber ich bin mir nicht sicher ob ich das umgesetzt habe was du meintest.
Ich habe zunächst alle störenden kleinen Objekte entfernt mit "bwconncomp" min(..) = 0 mit einer while loop u.s.w..
Nun hatte ich ausschließlich das zu betrachtende Objekt in weiß in dem Image. Dann suchte ich nach einer Kante und habe diese mit "bwtraceboundary" in einen Vektor geschrieben. Nun habe ich die x,y Koordinaten der Kanten im Image. Schon mal gut dachte ich.

Bild habe ich beigefügt.

Nun stehe ich aber schon wieder auf dem Schlauch...
Endpunkte ermitteln, aber wie ?
Eckpunkte ermitteln wenn einer etwas abknickt, aber wie ?
Mittelpunkt ermitteln, aber wie ?
Auf dem beigefügten Image ist das ja zu ermitteln, wenn ich von rechts,links respektive oben, unten ran gehe und suche, aber es muss ja eine gewisse Redundanz geben. Genau genommen sind es ja vier Risse, drei große und ein kleiner.
Wenn ich diese Punkte hätte könnte ich mit Skalarprodukt die Länge ermitteln.

Frage über Fragen Smile

Danke schon mal.

Bildschirmfoto 2012-07-04 um 10.23.26.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2012-07-04 um 10.23.26.png
 Dateigröße:  44.51 KB
 Heruntergeladen:  740 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2012, 22:21     Titel:
  Antworten mit Zitat      
Sorry, hatte einige Tage jetzt nicht in die Threads geschaut. Du bist ja auch OSX Nutzer Razz

Aber die Bilder sehen doch schon gut aus. Was brauchst Du denn überhaupt von den Rissen? (Länge, Fläche, ??)

Sobald die Risse verbunden sind, sind das ja für den Rechner erst einmal zusammenhängende Regionen, d.h. wenn das aufgrund von Messungenauigkeiten entsteht, dann musst Du das eben korrigieren. Ein einfacher Ansatz wäre halt dazu, einfach zu sagen, wenn eine Verbindung von zwei Rissen z.B. nur n Pixel / Elemente breit ist, dann einfach dort cutten.

Falls Du die Fläche der Risse brauchst, dann musst Du ja nur die "Pixel" innerhalb der Umrandung zählen und entsprechend mit der Auflösung der Kamera skalieren.

Brauchst Du die Richtung des Risses, dann musst Du jeden Riss einzeln entsprechend orientieren, d.h. Du musst anhand der Daten den Riss passen rotieren und dann darauf weiter arbeiten.

Wenn es Dir um die Länge des Riss geht, dann musst Du hier nun erst einmal definieren was die Länge des Risses überhaupt ist, denn Du hast hier ein Gebiet. Ich kann theoretisch die Länge in X-Richtung, aber auch in Y-Richtung bestimmen und beides wäre als Längenmaß korrekt. Theoretisch wäre so etwas wie die "maximale Ausdehnung" wohl das interessante. Ich verweise mal etwas weiter gefasst auf LLE (local linear embedding) http://www.cs.nyu.edu/~roweis/lle/papers/lleintro.pdf

Aber ich denke, das wichtigste ist, dass Du zuerst einmal definierst, was Du aus Deinen Daten für Informationen benötigst, dann kann man weiter überlegen.

P.S.: Wenn Du dann einen fertigen Algorithmus hast, hätte ich da Interesse dran
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.