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

Farbsegmentierung

 

Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.06.2014, 13:10     Titel:
  Antworten mit Zitat      
Manchmal sind Fehlermeldungen irreführend. Ich bekomme diese Meldung vereinzelt, wenn eine best. Funktion nicht vorhanden ist, obwohl es dafür eine andere Fehlermeldung gibt. Hast du diese Funktion?

Ich habe mein Beispiel unter R2013b ausgeführt. Natürlich ohne Fehlermeldung. Sonst hätte ich Sie dir nicht gegeben. Dafür aber ein anderes Problem beobachtet, das zeigt, wie man sich täuschen kann:

Die Funktion imfindcircle gehört zu R2013b. Die Variablen sind sehr empfindlich. Bei geringer Abweichung wird der Kreis nicht erkannt. Wenn man beim Probieren die Funktion startet, alles durchlaufen hat, alle Variablen löscht und sofort wieder startet, habe ich beobachtet, dass der Kreis nicht rot umrandet wird, obwohl die Werte stimmten.

Das macht einen ganz konfus, zumal man die richtigen Werte eingeben hat und versucht, irgendwo einen anderen Fehler zu suchen. Tatsächlich hängt das Problem mit dem Löschen der Daten im Workspace ab. Obwohl sie dort nicht mehr erscheinen, gibt es diesen Fehler, wenn man die Funktion sofort wieder startet. Wartet man dagegen eine Sekunde, läuft die Funktion fehlerfrei durch. Dieser Fehler ist reproduzierbar!!
Private Nachricht senden Benutzer-Profile anzeigen


MatLabStarter
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2014, 13:39     Titel:
  Antworten mit Zitat      
Ich habe die R2009b Version von MatLab. Als ich deinen Vorschlag mit "imfindcircles" gesehen habe, fiel mir im Nachinein ein, dass ich bei der Suche nach Kreiserkennung, wie z.B.

http://www.mathworks.de/de/help/ima.....odcode=IP&language=de

oder ein anderes mit den Coins immer eine Fehlermeldung mit "imfindcircles" bekommen habe.

Ich habe mich auch bezüglich der Hough Transformation zur Detektion von kreisen schlau machen wollen, aber da seh ich leider überhaupt nicht durch, obwohl ich die allgemeine Theorie dahinter denke zu verstehen weiß.
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: 29.06.2014, 13:57     Titel:
  Antworten mit Zitat      
Eine Alternative zu finden wird schwierig. Ich will aber gerne am Montag nachsehen, ob es noch eine andere Möglichkeit gibt.
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: 29.06.2014, 14:23     Titel:
  Antworten mit Zitat      
Eine Alternative wäre, über die Segmentierung den Kreis hervorzuheben. Die Funktion: "BlobsDemo" könnte man als Hinweis auf andere Funktionen nehmen. Wichtig wären die Funktionen um "label2rgb", da über die "codierten Farben" eine Zuordnung möglich wäre. Du musst nur die Fläche mit dem störenden Rot soweit entfernen, dass andere Funktionen diese nicht in der gleiche Farbe darstellen.

http://www.mathworks.com/matlabcent.....emo--/content/BlobsDemo.m
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: 01.07.2014, 07:46     Titel:
  Antworten mit Zitat      
Bist du weiter gekommen? Sonst tausche in deinem Code, den du ganz am Anfang geschrieben hast:

"diff_im = bwareaopen(diff_im,300);" % entfernen

gegen die Funktionen: imclose und imopen aus. Bei der richtigen Einstellung wird der rote Ball mit einem rechteckigen Rahmen versehen, der die Koordinaten x=676 und y=454 wiedergibt.

Das rote Rechteck wird dann nicht erfasst. Wenn der Rahmen um den Ball noch präziser gezeigt werden soll, musst du noch eine weitere Segmentierung dazu nehmen. Das wäre dann "imdilate" und du bist nicht auf die Funktion "imfindcircle" nicht angewiesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabStarter
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 12:48     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

Danke für deine erneuten Tipps. Ich habe die vergangenen Tage einen neuen Ansatz gewählt:

Ich habe die Farbsegmentierung "Rot" über HSV realisiert konnte das Binärbild (Bild 1) erzeugen. Als nächstes habe ich in Anlehnung an das Tutorial

http://www.mathworks.de/products/im.....images/ipexroundness.html

die Objekte auf Ihre Rundheit untersucht (Bild 2).

Als nächsten Schritt würde ich gern alle "unrunden Objekte" schwärzen, sprich mit dem Wert "1" belegen und somit aus dem Binärbild entfernen. Somit spielen weitere rote "unrunde" Objekte bei der späteren Kreisbestimmung ja theoretisch keine Rolle mehr!?

Der Code lautet ja:

Code:

%% Identifying Round Objects

[B,L] = bwboundaries(HSVredObjectsMask,'noholes');

% Display the label matrix and draw each boundary
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end
stats = regionprops(L,'Area','Centroid');

threshold = 0.85;

% loop over the boundaries
for k = 1:length(B)

  % obtain (X,Y) boundary coordinates corresponding to label 'k'
  boundary = B{k};

  % compute a simple estimate of the object's perimeter
  delta_sq = diff(boundary).^2;
  perimeter = sum(sqrt(sum(delta_sq,2)));

  % obtain the area calculation corresponding to label 'k'
  area = stats(k).Area;

  % compute the roundness metric
  metric = 4*pi*area/perimeter^2;

  % display the results
  metric_string = sprintf('%2.2f',metric);

  % mark objects above the threshold with a black circle
  if metric > threshold
    centroid = stats(k).Centroid;
    plot(centroid(1),centroid(2),'ko');
     
  end

  text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
       'FontSize',14,'FontWeight','bold');

end

title(['Metrics closer to 1 indicate that ',...
       'the object is approximately round']);
 



Kannst du mir einen Tipp geben, wie ich in der Schleife
Code:

  % mark objects above the threshold with a black circle
  if metric > threshold
    centroid = stats(k).Centroid;
    plot(centroid(1),centroid(2),'ko');
     
  end
 
dieses Kriterium unter Ergänzug von "else metric < threshold" eingeben muss?


VG MatLabStarter

Bild 2.jpg
 Beschreibung:

Download
 Dateiname:  Bild 2.jpg
 Dateigröße:  56.66 KB
 Heruntergeladen:  594 mal
Bild 1.jpg
 Beschreibung:

Download
 Dateiname:  Bild 1.jpg
 Dateigröße:  50.41 KB
 Heruntergeladen:  576 mal
Original.jpg
 Beschreibung:

Download
 Dateiname:  Original.jpg
 Dateigröße:  189.98 KB
 Heruntergeladen:  570 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: 14.07.2014, 07:14     Titel:
  Antworten mit Zitat      
Verstehe nicht, warum du die Funktion so umständlich machst oder hat das einen tieferen Hintergrund. Du brauchst doch nur die von mir genannten Befehle einzusetzen und hast das Ergebnis.

Wenn du 2x das gleiche Rot im Bild hast kann auch HSV die beiden Rotflächen nicht trennen. Dein letzter Link verzichtet auch auf HSV und geht gleich zur Segmentierung über.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.