ich versuche gerade einen Kreis aus einem Bild mit unregelmäßigen Lichtverhältnissen raus zu filtern. Um den Kreis finden zu können, müssen andere Objekte im Bild ausgeblendet werden. Folgendes habe ich gemacht:
Code:
bild=rgb2gray(bild); % Umwandeln in Graustufe
bild=imadjust(bild); % Kontrast erhöhen
sw=graythresh(bild); % Findet automatisch den Schwellenwert
bild=im2bw(bild,sw); % Umwandeln in schwarz-weiß / Binär
bild=bwareaopen(bild,30); % Entferne objekte mit weniger als 30 pixel
bild=imclearborder(bild,8); % Alle zusammenhängende Punkte am Rand werden entfernt
bild=imfill(bild,'holes'); % Alle Löcher werden gefüllt.
Das gelingt mir leider nicht immer, es bleiben immer Flächen übrig, sodass der Kreis schwer zu erkennen ist. Mit graythresh(bild) bekomme ich ein sehr schlechtes Bild (s. Anhang). Gibt es ne möglichkeit den optimalen Schwellenwert rauszufinden?
die Funktion imfindcircles von Matlab, welche die Hough Transformation verwendet, habe ich am Anfang auch benutzt. Leider liefert imfindcircles sehr schlechte Ergebnisse.
Ich möchte gern bei meinem alten Programmcode bleiben, weil ich diesen selbst geschrieben habe. Mein Problem ist nur den richtigen Schwellenwert zu finden.
Ich habe im Internet gelesen, dass es 2 Schwellenwert-Methoden gibt:
- globaler Schwellenwert
- lokaler Schwellenwert
Bisher habe ich nur die 1. Methode verwendet, dh. das gesammte Bild wird mit einem vorgegebenen Schwellenwert verändert. Was bei schlechten Lichtverhältnissen schlechte Ergebnisse liefert.
Gibt es in Matlab eine Funktion, die die 2. Methode benutzt? Habe bisher nicht gefunden. Wenn nicht, habe ich mir gedacht, dass ich das bild in mehreren Bereichen aufteile und für jeden Bereich den passenden Schwellenwert verändere. Doch wie könnte man es am besten machen?
Ich habe dir die 2 Beispiele gezeigt, um das Verfahren dahinter als Beispiel aufzuzeigen. Es gibt noch ein weiteres Verfahren mit der Bez.: pupil_detect.m. Da dein Kreis sich aber deutlich von der Umgebung abhebt und diese auch nicht mit gleichen Grauwerten in den Kreis hinein ragen, kann man sich die Arbeit sehr vereinfachen, wenn man die zu eleminierenden Werte einfach indiziert, statt aufwendig mit Funktionen zu belegen.
Leider klappt es mit deinem Code nicht (s. Anhang).
Mein Projekt gerade ist eine Echzeiterkennung mit dem Webcam zu realisieren. Es funktioniert auch soweit mit meinem bisherigen Code, nur der Raum muss entsprechend gut beleuchtet sein. Aus einer 2 m Entfernung wird der Kreis nicht mehr deutlich erkennbar sein, so dass die Arbeit noch schwieriger wird.
Ich konnte mir erst jetzt dein Bild näher ansehen. Das Problem sind mehrfach gleiche Pixelwerte in 2 ähnlich gleich große Flächen. Da kann es keinen optimalen Schwellwert geben, weil immer neben dem Kreis eine 2. Fläche angezeigt wird. Ob du mit deiner Methode weiter kommst wage ich zu bezweifeln.
Ich denke dass "flashpixx" eingangs das bessere Verfahren schon genannt hat. Es gibt eine Funktion: "circle_hough.zip"(nur diese genaue Schreibweise!), die ich bereits genannt habe und die sofort den Kreis detektiert (habe ich an deinem Bild getestet). Du mußt in: circle_houghdemo.m den Wert in der Zeile: radii=15:1:40 auf 17:1:40 ändern.
Die Funktion soll natürlich nur den Weg aufzeigen und ist sicherlich noch nicht dein angestrebtes Resultat. Die Idee dahinter könnte mit einem eigenen Weg zum Ergebnis führen. Wenn das immer noch nicht dein Ziel ist, sage es auch deutlich, dann kann man evtl. noch nach anderen Wegen suchen.
Ich habe dann doch noch eine Möglichkeit ohne Hough-T. gefunden und mit deinem Bild getestet. Der Kreis wird eindeutig gefunden.
Es gibt hier im Forum immer wieder die Diskussion, dass man natürlich nicht die gestellten Aufgaben für andere erledigen möchte. Andererseits werden jede Menge Codes veröffentlicht und nicht jede Anfrage verfolgt den Zweck, Hausarbeiten durch andere erledigen zu lassen. Da du bereits ein Beispiel gezeigt und dich also mit der Sachlage vertraut gemacht hast, will ich eine weitere Lösung nicht vorenthalten. Du kannst dir beide Verfahren genauer ansehen und deine eigenen Schlüsse ziehen.
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.