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

Flächen zählen + Größen bestimmen

 

HansiHans

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 11:46     Titel: Flächen zählen + Größen bestimmen
  Antworten mit Zitat      
Hallo Leute!

ich konnte mein Bild jetzt soweit bearbeiten, dass ich es auswerten kann. (Siehe Anhang, es ist eigtl ein .bmp Format aber das kann ich hier nicht hochladen).

Jetzt würde ich gerne die Anzahl der weißen Flächen bestimmen (=6)
Und die Größe von jeder Fläche und mir die Größte Fläche ausgeben lassen, also einfach die Pixelanzahl!

Wie kann ich das verwirklichen? Könnte mir da evtl jemand weiterhelfen?

Danke
Gruß
Hans

SpeckleBild.jpg
 Beschreibung:

Download
 Dateiname:  SpeckleBild.jpg
 Dateigröße:  8.65 KB
 Heruntergeladen:  422 mal


raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 12:04     Titel:
  Antworten mit Zitat      
Hi!

Ich hatte mal ein ähnliches Problem, bzw. mein Problem ging einen Schritt weiter, denn ich musste noch die Mittelpunkte der weißen Flächen bestimmen.

Meine Lösung (theoretsich): Ich habe mit find die erste 1 gesucht, und die koordinaten, dann einen Flood-fill algorithmus laufen lassen, und alle weiteren Koordinaten der Flächenzugehörigen Punkte abgespeichert in einem neuen Vektor. Als der Flood fill abbrach, musste ich nur noch die länge dieses neuen Vektor betrachten, und ich wusste wie viele Pixel ihr zugehörig sind, und wo diese Liegen. Im Anschluss setzt man die gesamte Fläche auf 0, und iteriert so von Fläche zu Fläche. Solltest du programmierschwierigkeiten damit haben, melde dich nochmal.

Gruß, r93
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 12:12     Titel:
  Antworten mit Zitat      
Puh,

also damit werde ich sicherlich Schwierigkeiten haben. Bin ein ziemlicher Anfänger auf diesem Gebiet. Gibt es dazu keinen integrierten MatlabBefehl?
Wäre gut wenn du mir ausführlicher weiterhelfen könntest.

Gruß
Hans
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 12:19     Titel:
  Antworten mit Zitat      
Okay.
Ich habe die Lösung gerade geöffnet, und mir nochmal angeschaut. Soweit ich weiß (und meine MATLAB Bibliothekskenntnis ist SEHR begrenzt) gibt es das nicht schon vorgegeben. Deswegen schlage ich folgendes vor:
Ich helfe dir beim Unterteilen des Problems und bei den einzelnen Lösungen, gebe dir aber nicht die komplettlösung (wo bliebe da der Lerneffekt?). Ich selbst würde das bevorzugen, und deswegen will ich das auch dir gegenüber so handhaben. Dann wirst du es auf jeden Fall verstehen. Also, lass uns nochmal ausführlich den Ablauf durchgehen, ich gehe davon aus, dass deine Matrix binär/logical ist.

1. Schritt: Finde die Koordinaten der ersten 1.
Schaue dir dazu die Methode "find" in der Matlab Dokumentation an.
Versuche die Koordinaten irgendwie abzuspeichern in zwei neuen Variablen (zB [row, col]), dann meld dich hier mit dem Ergebnis (dem Code und der Ausgabe).. ich werde dich jetzt live unterstützen.
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 13:02     Titel:
  Antworten mit Zitat      
Hi Raptus,

habe mich jetzt hier angemeldet.
Hab es jetzt mal mit dem Befehl "I=find(BW2, 1);" probiert.
BW2 ist mein Bild und er soll praktisch die erste 1 finden...
Jedoch zeigt er in meinem Workspace nichts für die 1 an
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 13:42     Titel:
  Antworten mit Zitat      
Erster Schritt: hervorragend (damit meine ich die Anmeldung).
Zweiter Schritt: Ich habe es mit

[code][row, col] = find(picWithAreas)[/code]

gelöst.
Sorry für die lange Pause grade, ich war Mittag essen Smile
Klappt das bei dir?
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 13:51     Titel:
  Antworten mit Zitat      
Code:
;

er zeigt mir bei den klammern vor/nach i und j einen Klammerfehler an :/
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:05     Titel:
  Antworten mit Zitat      
Ist BW2 eine logische Matrix? Das sieht man im Workspace. Ich gehe davon aus. Ein Klammerfehler liegt definitiv nicht in dieser Zeile vor, wenn also, dann in einer vorherigen Zeile oder einer folgenden.
Am besten machst du eine neue Funktion und benennst sie.
Als Eingabe nimmst du picWithAreas (da gibst du dein BW2 rein), als Ausgabe machst du areas, die werden wir später füllen.

ist die erste Zeile, die du in diese niegalnagelneue funktion schreibst einfach nur
[code][row, col] = find(picWithAreas)[code]
und führst in deinem workspace deine methode aus und gibst dein BW2 rein.
Was schreibt die Konsole dann?
_________________

Nicht jeder der "Weswegen" fragt,
meint: "Wem gehört dieser Weg?".
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:29     Titel:
  Antworten mit Zitat      
Hi, also das ist mein Code den ich verwende.
Im Workspace wird mir nur ein "ans 320x320 logical" angezeigt. Was mich wundert, eigtl sollte er doch die ganzen Images anzeigen.

Code:
function [BW,maskedImage] = segmentImage(im)
%segmentImage segments image using auto-generated code from imageSegmenter App
%  [BW,MASKEDIMAGE] = segmentImage(IM) segments image IM using auto-generated
%  code from the imageSegmenter App. The final segmentation is returned in
%  BW and a masked image is returned in MASKEDIMAGE.

% Auto-generated by imageSegmenter app on 10-Nov-2014
%----------------------------------------------------
im=imread('C:\Users\Hans\Desktop\Matlab Programm\Papier_2\Papier_6.bmp');

% Initialize segmentation with threshold
mask = im>100;
BW = mask;

% Form masked image from input image and segmented image.
maskedImage = im;
maskedImage(~BW) = 0;
figure, imshow(maskedImage);

BW2=bwareaopen(maskedImage, 3, 4)
figure, imshow(BW2);

[code][i,j]=find(BW2)[/code];

end


hab es jetzt mal so gemacht wie du meinst

Code:
function [Areas]=Image(Bild)
%----------------------------------------------------
im=imread('C:\Users\Jojo\Desktop\Matlab Programm\Matlab Funktionierendes Programm\Papier_2\Papier_6.bmp');

% Initialize segmentation with threshold
mask = im>100;
BW = mask;

% Form masked image from input image and segmented image.
maskedImage = im;
maskedImage(~BW) = 0;
figure, imshow(maskedImage);

BW2=bwareaopen(maskedImage, 3, 4)
figure, imshow(BW2);

[code][i,j]=find(BW2)[/code];


end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:34     Titel:
  Antworten mit Zitat      
ARGH! Mein Fehler, die [code} und /code] müssen weg, das war, um hier im Forum das in einem Codeblock anzuzeigen, klappte nicht. Sorry. Also ohne das!
_________________

Nicht jeder der "Weswegen" fragt,
meint: "Wem gehört dieser Weg?".
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:36     Titel:
  Antworten mit Zitat      
Wenn du jetzt noch das Semikolon am Ende weglässt, gibt er dir die erste Koordinate in deiner Console aus, die eine 1 ist.
_________________

Nicht jeder der "Weswegen" fragt,
meint: "Wem gehört dieser Weg?".
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:50     Titel:
  Antworten mit Zitat      
Er gibt mir da jede Zeile/Spalte mit einer 1 aus. Hab da mal ein paar Zahlen noch weggeschnitten sonst wäre es zuviel geworden.
Also nehme an die Koordinaten der ersten 1 sind i=144 j=154 ?

i =

144
144
149
144
148
....



j =

154
155
155
156
156
156
....
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 14:54     Titel:
  Antworten mit Zitat      
Hi!

So ist es.

curPoint = [ row(1),col(1) ];
gibt dir jetzt die allererste 1 aus. Ist ein Anfang, oder?
Jetzt solltest du das Prinzip von flood fill verstehen.
Schau dir dazu vielleicht ein-zwei Videos auf youtube an oder lies ein Kapitel darüber.
Wenn du die Idee dahinter verstanden hast, melde dich hier.
_________________

Nicht jeder der "Weswegen" fragt,
meint: "Wem gehört dieser Weg?".
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 15:09     Titel:
  Antworten mit Zitat      
Also das Prinzip habe ich verstanden, ich lasse ihn jetzt nachschauen ob jedes pixel eine 1 oder 0 als nachbarn hat und dadurch kann ich praktisch die grenzen der "fläche" bestimmen => größe + anzahl.
Jedoch weiß ich leider nicht wie ich das programmtechnisch umsetzen kann...
whrsl. über eine if schleife?
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 10.11.2014, 15:27     Titel:
  Antworten mit Zitat      
Eins nach dem anderen. If-Schleifen gibt es nicht. Es gibt while-schleifen.

Wir lösen das aber heute iterativ, weil der Algorithmus bei Wikipedia es so vorschlägt, und ich mich damals dran gehalten habe. Dafür bitte ich dich, eine innere function zu schreiben. Das heißt in der gleichen .m-file schreibst du, am besten ganz unten:

Code:

function[ ] = fill(y,x)
[i]hier kommt gleich der flood fill rein[/i]
end
 
.

Dann füllen wir die in eine Richtung gemeinsam, in die anderen drei Richtungen machst du es dann daraufhin alleine.

Die erste Richtung, sagen wir mal, es ist unter dem eingegebenen Punkt x,y
fragen wir ab:

Code:

            %..and if the pixel under curPoint is a 1..
            if(picWithAreas(y+1 , x) == 1)
                %..it is added to the area..
                area = vertcat(area,[y+1 , x]);
                %..set zero..
                picWithAreas(y+1,x) = 0;
                %..and set as initPoint for the next iteration.
                fill(y+1,x);
            end
 


hier passiert genau das, was in den Kommentaren beschrieben wird.
Da es jedoch sein kann, dass sich unter dem Pixel kein weiteres Pixel mehr befindet, weil das Bild dort zuende ist, fügen wir noch eine weitere Bedingung von außen dran:

Code:
if(sizePic(1) > y)

...
 
end


Sag bescheid, wenn du soweit bist.
_________________

Nicht jeder der "Weswegen" fragt,
meint: "Wem gehört dieser Weg?".
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  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.