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

Objekterkennung optimaler Schwellenwert

 

skyforce
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2012, 14:30     Titel: Objekterkennung optimaler Schwellenwert
  Antworten mit Zitat      
Hallo zusammen,

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?

Vielen Dank im Voraus!

ausgang.jpg
 Beschreibung:

Download
 Dateiname:  ausgang.jpg
 Dateigröße:  2.04 KB
 Heruntergeladen:  1522 mal
eingang.jpg
 Beschreibung:

Download
 Dateiname:  eingang.jpg
 Dateigröße:  2.96 KB
 Heruntergeladen:  1524 mal
Private Nachricht senden Benutzer-Profile anzeigen


flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2012, 15:10     Titel:
  Antworten mit Zitat      
ich würde evtl eher http://de.wikipedia.org/wiki/Hough_Transformation verwenden, wird auch direkt von Matlab unterstützt
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 08:25     Titel:
  Antworten mit Zitat      
die Funktion imfindcircles von Matlab, welche die Hough Transformation verwendet, habe ich am Anfang auch benutzt. Leider liefert imfindcircles sehr schlechte Ergebnisse.

Gibt es bessere Alternative zu imfindcircles?
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.09.2012, 09:06     Titel:
  Antworten mit Zitat      
Moin,

suche mal nach: "BlobsDemo.m" und "circle_hough.zip(Rar)". Vielleicht helfen dir diese Demos weiter.

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 13:11     Titel:
  Antworten mit Zitat      
ich habe mir dieses Programm http://www.mathworks.de/matlabcentral/fileexchange/9833 angeschaut. Der Kreis ist zwar erkenntbar wird aber nicht markiert. Außerdem läuft dieses Programm kommplett anders.

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.09.2012, 13:50     Titel:
  Antworten mit Zitat      
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.

Code:
I=imread('coins.png');
ind=(I>100 & (I<255);
Y=I;
Y(ind)=255;
figure; imshow(I)
figure; imshow(Y)


Ich kann dein Bild leider nicht als Demo nehmen. Es müsste aber klappen.
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 16:25     Titel:
  Antworten mit Zitat      
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 freue mich auf weitere Vorschläge

bild.jpg
 Beschreibung:

Download
 Dateiname:  bild.jpg
 Dateigröße:  47.45 KB
 Heruntergeladen:  1431 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 13.09.2012, 06:41     Titel:
  Antworten mit Zitat      
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.

Viel Erfolg

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.09.2012, 08:48     Titel:
  Antworten mit Zitat      
kannst du bitte den Link posten? Ich hab es leider nicht gefunden.

vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 14.09.2012, 09:32     Titel:
  Antworten mit Zitat      
Die Demo findest du unter:

http://www.mathworks.com/matlabcent.....ugh-transform-for-circles

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.

Code:
I=imread('eingang.jpg');
I=rgb2gray(I);
Ie=edge(I,'sobel',(graythresh(I)*.1));
S1=strel('disk',2,4);
S2=strel('line',2,8);
Iim=imdilate(Ie,[S1 S2]);
Ifill=imfill(Iim,'holes');
Iim2=imclearborder(Ifill,1);
S3=strel('disk',5);
Irode=imerode(Im2,S3);
Iende=imerode(Irode,S3);


Schönes Wochenende!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.