Verfasst am: 23.09.2009, 18:56
Titel: Hilfe bei Funktionensuche z. Thema Separieren
Hallo Miteinander!
Habe euch mal ein binäres Bild gepostet, um mein Problem zu verdeutlichen.
Es verlaufen horizontale und zwei schräge Linien in verschiedenen Richtungen.
Gibt es Funktionen oder Befehle in Matlab,die mein Bild nach 0° und +- 45° Formerkennung durchgehen können ?
Mein Ziel ist diese Richtungen voneinander unterscheiden zu können. Dieses kann bildlich oder falls das nicht geht in einer anderen Art erfolgen.
Im Anschluss an allem wollte ich diese voneinander getrennten Richtungen gerne noch zählen.
Hoffe einer von euch kann mir witerhelfen ? und begeistert sich für mein Thema mit einem kleinen Quellcode oder Funktion
probier doch mal zuerst das Bild mit Hilfe eines Kantenfilters wie Sobel oder Canny-Edge zu filtern. Bei Sobel kannst Du sogar mit Hilfe der entsprechenden Filtermaske die grobe Richtung bestimmen, in der Du Kanten finden willst. Mit Hilfe der Hough Transformation kann man nach Linien im Bild suchen.
Wenn Du die Image Processing Toolbox hast, kannst Du folgende Befehle verwenden: edge und hough
Wenn Du die Toolbox nicht hast, würde ich mal im Fileexchange auf der Mathworks Homepage danach suchen.
ersteinmal vielen Dank für deine Nachricht!
Ich habe mich in deinen Funktionen versucht schlau zu lesen, habe aber doch noch ein paar Fragen.
1) Die Sobel Funktion unterscheidet doch nur zwischen horizontalen und vertikalen Richtungen? Im Anhang habe ich ein Bild gepostet, dass mithilfe der Roberts Methode +- 45° Kanten erkennt. (gepostete Bild ist +45° als Bsp)
Hier erkennt man schön,dass 45° Bereiche in Linnien und die -45° Bereiche gepunktet dargestellt werden. Der 0° Bereich ist leider auch als Linie zu sehen.
Besteht die Möglichkeit die Roberts- und Sobel Methode miteinander zu kombinieren, so dass der 0° Bereich auch gepunktet dargestellt wird?
2) Wie entferne ich denn die weißen gepunkteten Pixel in meinem Bild?
Gibt es Funktion, die Gebiete mit Minimalpixelanzahl einfach löscht?
3)Das mit hough und den Linien klingt zwar ganz gut, aber leider bekomme ich das nicht hin Möchte gerne, die 45° Linien im Bild mit anderen 45° Linien verbinden, wenn diese nur durch ein kleinen schwarzen Pixelbereich unterbrochen werden?
Hilft da sowas wie houghpeaks oder andere funktionen weiter???
4) Oder gibt es für mein Problem noch eine einfachere Lösung?
zu 1) Sobel gibt es genaus für diagonal, die entsprechende Filtermaske sieht dann so aus:
0 -1 -2
1 0 -1
2 1 0
und
-2 -1 0
-1 0 1
0 1 2
Welcher der Kantendetektoren am besten für Dein Problem geeignet ist, findest Du am besten durch ausprobieren raus
Auch wenn die Filter bestimmte Richtungen hervorheben, wirst Du meistens noch Sachen mitbekommen, die Du nicht haben willst.
2) Zum entfernen von kleinen Objekten gibt es z.B. bwareaopen.
3) Genau, mit hougpeaks findest Du Maximas im Hough-Bild (und die Maxima entsprechen Linien. houghlines ist ebenfalls ein hilfreicher Befehl (vorallem wenn Du die Linien einzeichnen willst. Der Vorteil der Hough-Transformation ist, dass die gefundenen Linien durchbrochen sein können.
4) Ansonsten könntest Du auch mit morphologischen Operatoren (imerode, imdilate) spielen und schauen, ob Du damit weiter kommst.
Eventuell durch ein entsprechendes großes strukturierendes Element in die gewünschte Richtung alle anderen nicht passenden Bildelemente entfernen. Einfach mal ein bisschen rumspielen und gucken was passiert.
zu 1 + 2)
Da ich ja wirklich noch im Anfangsstadium von Matlab bin, schreibe ich dir
sicherhaltshalber noch mal meinen Code, ob dass so mit mit Sobel und der Filtermaske am elegantesten von mir gelöst worden ist, oder du dir vielleicht doch einen anderen Code vorgestellt hast?
Zudem habe die beiden Bilder noch einmal im Anhang gepostet!
Na ja,weisst du vielleicht, wie man noch die 0° Linien entfernen könntet, weil mit bwareaopen ich sonst noch bestimmt +- 45° Bereiche entfernen würde.
zu 3)
Oh ja zu 3,
mit der Hough Transformation und der Hough Linien blicke ich wirklich nicht ganz durch.
Möchte so gerne die Linien mit 45° Bereichen verbinden!
Würde das mit meinen jetzigen Bildern so ganz gut gehen??
Und wenn ja würde ich natürlich über weitere Hilfe und vielleicht einen kleinen Quellcode oder Verweis auf ein ähnliches Beispiel sehr freuen!
die Filterung mit conv2 passt so schon
In der Image Processing Toolbox gibt es noch imfilter (dort kannst Du z.B. noch eine Randbehandlung einstellen). Das ist aber in Deinem Bespiel recht egal. Allgemein solltest Du bei Operatoren wie Sobel darauf achten, dass in der Ergebnismatrix auch negative Werten stehen können (die ebenfalls Kanten repräsentieren).
Für die Hough Transformation stören die 0 Grad Linien nicht wirklich.
Bei mir hatte Dein angehängtes Bild eine weißen Rand, den solltest Du vorher noch entfernen.
Beispiel für Hough (die Parameter müsstest Du halt selber noch vernünftig anpassen, nur mal so eine grobe Idee):
Danke für den Code, leider bekomme ich aber folgende Fehlermeldung
Deinen Code habe ich in mein Programm kopiert und für alle Parameter
BW habe ich mein BW1 eingesetzt( halt mein aktuelles Bild)
BW1 ist bei mir ein binäres Bild,sprich eine Ergebnismatrix von 0 und 1
??? Error using ==> iptcheckinput
Function HOUGH expected its fifth input, ThetaResolution, to be a scalar.
Error in ==> hough>parseInputs at 140
iptcheckinput(theta_res, {'double'}, {'real', 'scalar', ...
Error in ==> hough at 93
[bw, rho, theta] = parseInputs(varargin{:});
Error in ==> Binaer at 74
[H,T,R] = hough(BW2,'RhoResolution',0.5,'Theta',-42:-0.2:-47.0);
das liegt an der verwendeten MATLAB Version. Ich habe das Beispiel mit 2009b erstellt und kann daher nicht nur die Auflösung angeben sondern direkt die Winkel die mich interessieren.
Ansonsten musst Du Dir nach der Peak-Erkennung die interessanten Winkel selber raussuchen.
So in der Art:
Code:
[H,T,R] = hough(BW,'RhoResolution',0.5);
P = houghpeaks(H,50,'threshold',0.1*max(H(:)));
x = abs(T(P(:,2))); y = R(P(:,1));
idx = x > 42 & x < 47;
x = x(idx);
y = y(idx);
P = P(idx,:);
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
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.