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
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2014, 16:06     Titel:
  Antworten mit Zitat      
Hi, weiß jetzt nicht ob das so passt!
i=y und x=j dürfte stimmen oder?


Code:
function [Areas]=Image(Bild)
%----------------------------------------------------
im=imread('C:\Users\Hans\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);

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

[i,j]=find(picWithAreas)
curPoint = [ i(1),j(1) ]

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

   %..and if the pixel under curPoint is a 1..
            if(picWithAreas(i+1 , j) == 1)
                %..it is added to the area..
                area = vertcat(area,[i+1 , j]);
                %..set zero..
                picWithAreas(i+1 , j) = 0;
                %..and set as initPoint for the next iteration.
                fill(i+1 , j);
            end
           
          if(picWithAreas(i-1 , j) == 1)
                %..it is added to the area..
                area = vertcat(area,[i-1 , j]);
                %..set zero..
                picWithAreas(i-1 , j) = 0;
                %..and set as initPoint for the next iteration.
                fill(i-1 , j);
          end
         
         if(picWithAreas(i , j+1) == 1)
                %..it is added to the area..
                area = horzcat(area,[i , j+1]);
                %..set zero..
                picWithAreas(i , j+1) = 0;
                %..and set as initPoint for the next iteration.
                fill(i , j+1);
         end
         
         if(picWithAreas(i , j-1) == 1)
                %..it is added to the area..
                area = horzcat(area,[i , j-1]);
                %..set zero..
                picWithAreas(i , j-1) = 0;
                %..and set as initPoint for the next iteration.
                fill(i , j-1);
         end
         
         if(sizePic(1) > i)
         end
         if(sizePic(1) >j)
         end
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, 16:37     Titel:
  Antworten mit Zitat      
Ich werde morgen nochmal reinschauen.
Für heute mach ich erstmal Schluss.
_________________

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: 11.11.2014, 10:04     Titel:
  Antworten mit Zitat      
Okay, kannst du mir dann heute wieder helfen? Wäre sehr nett.
Private Nachricht senden Benutzer-Profile anzeigen
 
raptus93
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 14.10.13
Wohnort: nrw
Version: ---
     Beitrag Verfasst am: 11.11.2014, 10:29     Titel:
  Antworten mit Zitat      
ich lese und probiere, sekunde. Bin auch noch etwas langsamer darin Very Happy
Das was in [i} Tags steht kannst du schonmal löschen, da hab ich wiedermal versucht, was im Forum hier zu formatieren, ist im Code aber unbrauchbar
_________________

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: 11.11.2014, 10:37     Titel:
  Antworten mit Zitat      
Gut, also was mir schonmal zu deinem Code einfällt:
Das du in der dritten und vierten if-Abfrage das nicht mehr vertcat,
also vertikal konkateniert, sonder horzcat hast, finde ich unglaublich gut,
auch wenn es leider falsch ist. es zeugt aber zweifelsfrei davon, dass du dir Mühe gibst.

Auch das Prinzip, dass du bei beiden Koordinaten jeweils einmal +1 und einmal -1 gerechnet hast,
um die Nachbarn zu erwischen ist ein perfekter Ansatz.

Um uns beide zu belohnen (dich für die Mühe und mich... auch für die Mühe), kriegst du jetzt
meine komplette innere Funktion, und wir werden zusammen am korrekten Aufruf
dieser Arbeiten.

Das wichtigste beim Programmieren ist das Kommentieren, denn sonst fällt es allen, inkl. dir selbst,
unglaublich schwer, deinen Code zu lesen.

Hier meine innere Funktion, bevor du an den Aufruf gehst, verstehe sie vollkommen, indem
du die Kommentare im deutschen schreibst und den Code hier rein stellst. Bis gleich!

Code:
   function[ ] = fill(y,x)
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel to
    %   area
    % Input    :     the coordinates of the initPoint in myMatrix
    % Output   :     no output, accesses myMatrix and area immidiate  
       
        sizePic = size(picWithAreas);
        %If there is a Pixel under y..
        if(sizePic(1) > y)
            %..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
        end
        % " ..left from.. "
        if(x > 1)    
            if(picWithAreas(y, x-1) == 1)
                area = vertcat(area,[y , x-1]);
                picWithAreas(y,x-1) = 0;
                fill(y,x-1);
            end
        end
        % " ..over.. "
        if(y > 1)
            if(picWithAreas(y-1, x) == 1)
                area = vertcat(area,[y-1 , x]);
                picWithAreas(y-1,x) = 0;
                fill(y-1,x);
            end
        end
        % " ..right from.. "
        if(x < sizePic(2))
            if(picWithAreas(y , x+1) == 1)
                area = vertcat(area,[y , x+1]);
                picWithAreas(y,x+1) = 0;
                fill(y,x+1);
            end
        end

    end


EDIT: Vervollständige die Kommentare hinter den letzten drei if Blöcken so, dass sie so aussehen wie der oberste if block!
_________________

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: 11.11.2014, 11:33     Titel:
  Antworten mit Zitat      
Hi, also hab das jetzt so gemacht.
Bin mir aber bei den folgenden Zeilen nicht so sicher,
das mit dem area=vertcat und pic with areas=0 verstehe ich nicht so ganz


Code:
  area = vertcat(area,[y+1 , x]);
                %..set zero..wenn es =0 ist dann wird es nicht beachtet bin
                %mir aber nicht sicher
                picWithAreas(y+1,x) = 0;
                %..and set as initPoint for the next iteration.
                fill(y+1,x);








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;


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

[i,j]=find(picWithAreas)
curPoint = [ i(1),j(1) ]

    function[ ] = fill(i,j)

 
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel to
    %   area
    % Input    :     the coordinates of the initPoint in myMatrix
    % Output   :     no output, accesses myMatrix and area immidiate  
       
        sizePic = size(picWithAreas);
        %Wenn Pixel über dem Wert y
        if(sizePic(1) > y)
            %Und wenn Pixel =1, also weiß ist dann
            if(picWithAreas(y+1 , x) == 1)
                %wird es zur Fläche dazugezählt
                area = vertcat(area,[y+1 , x]);
                %..set zero..wenn es =0 ist dann wird es nicht beachtet bin
                %mir aber nicht sicher
                picWithAreas(y+1,x) = 0;
                %..and set as initPoint for the next iteration.
                fill(y+1,x);    
            end
        end
        % " ..left from.. "
        if(x > 1)     %Wenn der Wert x>1 ist dann
            if(picWithAreas(y, x-1) == 1) %Wenn der Wert links von x=1 ist dann
                area = vertcat(area,[y , x-1]);
                picWithAreas(y,x-1) = 0; %set zero, wenn es =0 ist dann nicht beachten
                fill(y,x-1); %Punkt für nächste suche nach der nächsten 1 festlegen
            end
        end
        % " ..over.. "
        if(y > 1) %Wenn der Wert y>1 ist dann
            if(picWithAreas(y-1, x) == 1) %Wenn der Wert unter y=1 ist dann
                area = vertcat(area,[y-1 , x]);
                picWithAreas(y-1,x) = 0; %set zero, wenn es =0 ist dann nicht beachten
                fill(y-1,x);    %Punkt für nächste suche nach der nächsten 1 festlegen
            end
        end
        % " ..right from.. "
        if(x < sizePic(2))  %Wenn der Wert x>1 ist dann
            if(picWithAreas(y , x+1) == 1)  %Wenn der Wert rechts von x=1 ist dann
                area = vertcat(area,[y , x+1]);
                picWithAreas(y,x+1) = 0; %set zero, wenn es =0 ist dann nicht beachten
                fill(y,x+1);            %Punkt für nächste suche nach der nächsten 1 festlegen
            end
        end

    end
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: 11.11.2014, 12:01     Titel:
  Antworten mit Zitat      
Ist n Anfang. Nein, also es wird null gesetzt, um damit zu zeigen, dass das Pixel schon "besucht" wurde. Sonst würde der Algorithmus ja unendlich lange hin und herspringen, so nach dem Motto:
Oh hey! Links von mir ist weiß. Sprung nach links. Oh hey! Rechts von mir ist weiß! Sprung nach rechts. Oh hey, links von mir ist weiß! etc

Um das zu verhindern, wird ein Pixel ABGESPEICHERT mit
Code:

und dann auf schwarz gesetzt (also quasi gelöscht).

Sooo... Das ist glaube ich verständlich. Weiter gehts:
Wenn du Kommentare übersetzt, dann alle. Auch die Beschreibung der Funktion ganz oben. Ich will, dass außer den Variablennamen oder Funktionsaufrufen kein Wort englisch mehr dort steht.

Und noch eine letzte Sache:
Wenn geprüft wird:
Code:

Dann ist jedem klar, dass geprüft wird, ob x größer als eins ist. Die Frage ist eher, warum das geprüft wird. Und das sollte man dann in die Kommentare schreiben!

Ich will es dir beantworten:

die Koordinaten deines Bildes reichen von (1,1) bis (sizePic(1), sizePic(2)),
alles was größer oder gleich der ersten koordinate und kleiner oder gleich der zweiten koordinate ist, liegt innerhalb deines bildes, alles andere außerhalb.

Das heißt, immer wenn du schaust, ob ein benachbartes Pixel weiß ist, schaust du vorher noch schnell, ob da überhaupt ein Pixel ist. Denn wenn dort keins ist, kannst du auch nicht die Farbe davon abrufen.

Gruß![/quote]
_________________

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: 11.11.2014, 12:39     Titel:
  Antworten mit Zitat      
Hi, ich denke ich verstehe was du meinst, hab das nochmals geändert.

Code:

   function[ ] = fill(i,j)

 
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel to
    %   area  Benutzt den Flood_Fill algorithmus um alle Punkte der Selben
    %   Fläche (in4-Richtungen, oben,unten,links,rechts) auf 0 zu setzen
    %   und die Pixel zur Fläche dazu zu zählen
    % Input    :     the coordinates of the initPoint in myMatrix
    % Koordinaten des ersten Punktes mit >1
    % Output   :     no output, accesses myMatrix and area immidiate   ?
       
        sizePic = size(picWithAreas);
        %Wenn der Pixel innerhalb des Bildes liegt dann..
        if(sizePic(1) > y)
            %Und wenn Pixel =1, also weiß ist dann
            if(picWithAreas(y+1 , x) == 1)
                %wird es zur Fläche dazugezählt
                area = vertcat(area,[y+1 , x]);
                %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                picWithAreas(y+1,x) = 0;
                %.Setzt den Punkt für den nächsten Aufruf
                fill(y+1,x);    
            end
        end
        % " Nach Links"
        if(x > 1)     %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y, x-1) == 1) %Wenn der Wert links von x=1 ist dann
                area = vertcat(area,[y , x-1]);
                picWithAreas(y,x-1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x-1);  %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Oben"
        if(y > 1)  %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y-1, x) == 1) %Wenn der Wert unter y=1 ist dann
                area = vertcat(area,[y-1 , x]);
                picWithAreas(y-1,x) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y-1,x);     %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Rechts "
        if(x < sizePic(2)) %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y , x+1) == 1)  %Wenn der Wert rechts von x=1 ist dann
                area = vertcat(area,[y , x+1]);
                picWithAreas(y,x+1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x+1);            %.Setzt den Punkt für den nächsten Aufruf
            end
        end

    end
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: 11.11.2014, 13:37     Titel:
  Antworten mit Zitat      
Sehr gut, dann machen wir jetzt mal einen ersten Aufruf für die erste Fläche.

Da wo du dein Fragezeichen hinter output stehen hast, ist eine Stelle, die ich jetzt erkläre:

Die innere Funktion kann auf die Variablen der äußeren Funktion zugreifen. Die Variablen, auf die wir zugreifen heißen

"picWithAreas"

und

"area".

Die erste Variable steht dabei für das Bild, wo wir die Flächen nach und nach auf schwarz setzen. In der zweiten Variable speichern wir alle Koordinaten der einen Fläche.

Zur Initialisierung der Variablen:
picWithAreas ist bei mir der Input der äußeren Funktion, bei dir ist es ganz normal dein Bild.

area ist eine Matrix mit 2 Spalten (x und y Koordinate), und n Zeilen, wobei n für die Anzahl der zugehörigen Pixel zu eine Fläche gehört.

Code:
%The initial point is always the first part of the area..
    area = [curPoint(1),curPoint(2)];


Der area können wir ja schonmal den zuerst gefundenen Punkt hinzufügen,
bei mir ist dieser curPoint. (steht für current Point, also der aktuell betrachtete Punkt).

Versuche mal, area jetzt anhand der inneren Funktion zu füllen, indem du sie aufrufst und deinen initial Punkt eingibst.

Gruß! Viel Erfolg, melde dich, wenn in area mehrere Werte stehen, oder wenn es nicht klappt. Danach sind nur noch ca. 3 Schritte zu tun.
_________________

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: 11.11.2014, 14:15     Titel:
  Antworten mit Zitat      
Hi,

ich verstehe nicht ganz was du mit "füllen" meinst. Hab es jetzt mal so geschrieben aber verstehe nicht ganz wie du das meinst, sorry bin wie gesagt ein völliger Anfänger.




Code:
function [Areas]=Image(Bild)
%----------------------------------------------------
im=imread('C:\Users\Hans\Desktop\BLZ\Matlab Programm\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;


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

[i,j]=find(picWithAreas)
curPoint = [ i(1),j(1) ]
area=0;
   function[ ] = fill(i,j)

 
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel   to
    %   area  Benutzt den Flood_Fill algorithmus um alle Punkte der Selben
    %   Fläche (in4-Richtungen, oben,unten,links,rechts) auf 0 zu setzen
    %   und die Pixel zur Fläche dazu zu zählen
    % Input    :     the coordinates of the initPoint in myMatrix
    % Koordinaten des ersten Punktes mit >1
    % Output   :     no output, accesses myMatrix and area immidiate   ?
   


    %Der curPoint ist immer der Erste Teil der Fläche
    area=[curPoint(1),curPoint(2)];
   
   


        sizePic = size(picWithAreas);
        %Wenn der Pixel innerhalb des Bildes liegt dann..
        if(sizePic(1) > y)
            %Und wenn Pixel =1, also weiß ist dann
            if(picWithAreas(y+1 , x) == 1)
                %wird es zur Fläche dazugezählt
                area = vertcat(area,[y+1 , x]);
                %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                picWithAreas(y+1,x) = 0;
                %.Setzt den Punkt für den nächsten Aufruf
                fill(y+1,x);    
            end
        end
        % " Nach Links"
        if(x > 1)     %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y, x-1) == 1) %Wenn der Wert links von x=1 ist dann
                area = vertcat(area,[y , x-1]);
                picWithAreas(y,x-1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x-1);  %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Oben"
        if(y > 1)  %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y-1, x) == 1) %Wenn der Wert unter y=1 ist dann
                area = vertcat(area,[y-1 , x]);
                picWithAreas(y-1,x) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y-1,x);     %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Rechts "
        if(x < sizePic(2)) %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y , x+1) == 1)  %Wenn der Wert rechts von x=1 ist dann
                area = vertcat(area,[y , x+1]);
                picWithAreas(y,x+1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x+1);            %.Setzt den Punkt für den nächsten Aufruf
            end
        end

    end
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: 11.11.2014, 16:20     Titel:
  Antworten mit Zitat      
Hi!

Entschuldige die Verzögerung, ich bin nicht arbeitslos xD

Also pass auf:
Der Plan ist, dass in area alle Punkte einer Fläche drin stehen.
dh
area = [
xKoordinate erster Punkt, yKoordinate erster Punkt;
xKoordinate zweiter Punkt, yKoord. zweiter Punkt;
usw und so fort
]

Am Anfang ist Area NICHT = 0 (wie in deinem Code),
sondern gleich des ersten initialpunktes (den wir erst mit find bestimmt haben)

JETZT NOCHMAL WAS ANDERES:
vertcat macht, dass du an eine Matrix eine Zeile dranhängst.
Also an der Stelle, wo wir
Code:


schreiben, hängen wir an die Matrix area, die im ersten Schritt nur eine Koordinate hat, eine weitere Zeile, also eine weitere Koordinate dran.

Hier der Aufruf:

Code:

%Find the first one..
    [row, col] = find(picWithAreas);
    %..and set it as initial point for flood_filling.
    curPoint = [ row(1),col(1) ];
   
    %The initial point is always the first part of the area..
    area = [curPoint(1),curPoint(2)];
    %..so lets set it to zero and then..
    picWithAreas(curPoint(1),curPoint(2)) = 0;
    %..rush through all other points by the inner function 'fill'.
    fill(curPoint(1),curPoint(2));
   
    %Some of the points are visited multiple times, so they have to be
    %cleaned -> every point is left unique after that.
    area = unique(area,'first','rows');
   
    %All pixels in the current area are in this matrix now, so..
    %..we can take the size (the number of points), and..
    sizeArea = size(area,1);
    %..the sum of all x and all y coordinates.
    sumArea = sum(area,1);
 


Dieser Code ist fast fertig. Probiere damit, die größe der ersten Fläche zu bestimmen.

Gruß!
_________________

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: 11.11.2014, 20:28     Titel:
  Antworten mit Zitat      
Hi, ich komme dort nicht wirklich weiter, muss ich nicht erst die ganzen if befehle ablaufen lassen?
hab das jetzt so gemacht aber es kommt nicht wirklich was dabei raus, leider! Langsam verwirrt mich der Code



Code:
function [Areas]=Image(Bild)
%----------------------------------------------------
im=imread('C:\Users\Jojo\Desktop\BLZ\Matlab Programm\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;


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

[i,j]=find(picWithAreas)
curPoint = [ i(1),j(1) ]

   function[ ] = fill(i,j)

 
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel to
    %   area  Benutzt den Flood_Fill algorithmus um alle Punkte der Selben
    %   Fläche (in4-Richtungen, oben,unten,links,rechts) auf 0 zu setzen
    %   und die Pixel zur Fläche dazu zu zählen
    % Input    :     the coordinates of the initPoint in myMatrix
    % Koordinaten des ersten Punktes mit >1
    % Output   :     no output, accesses myMatrix and area immidiate   ?
   
    %Der curPoint ist immer der Erste Teil der Fläche
    area = [curPoint(1),curPoint(2)];
    %..CurPoint wird auf 0 gesetzt
    picWithAreas(curPoint(1),curPoint(2)) = 0;
    %..läuft durch alle Punkte in der Fläche durch.
    fill(curPoint(1),curPoint(2));
   
    %Mehr Punkte werden öfter durchlaufen, deswegen müssen diese
    %"gesäubert" werden -> jeder punkt bleibt danach einfach zurück
    area = unique(area,'first','rows');
   
    %Alle Pixel der Fläche sind jetzt in einer Matrix
    %Die größe wird durch die Anzah lder Pixel bestimmt
    sizeArea = size(area,1) ;
    %Die Summe aller x und y Koordinaten
    sumArea = sum(area,1);
 
   
   
        sizePic = size(picWithAreas);
        %Wenn der Pixel innerhalb des Bildes liegt dann..
        if(sizePic(1) > y)
            %Und wenn Pixel =1, also weiß ist dann
            if(picWithAreas(y+1 , x) == 1)
                %wird es zur Fläche dazugezählt
                area = vertcat(area,[y+1 , x]);
                %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                picWithAreas(y+1,x) = 0;
                %.Setzt den Punkt für den nächsten Aufruf
                fill(y+1,x);    
            end
        end
        % " Nach Links"
        if(x > 1)     %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y, x-1) == 1) %Wenn der Wert links von x=1 ist dann
                area = vertcat(area,[y , x-1]);
                picWithAreas(y,x-1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x-1);  %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Oben"
        if(y > 1)  %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y-1, x) == 1) %Wenn der Wert unter y=1 ist dann
                area = vertcat(area,[y-1 , x]);
                picWithAreas(y-1,x) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y-1,x);     %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Rechts "
        if(x < sizePic(2)) %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(y , x+1) == 1)  %Wenn der Wert rechts von x=1 ist dann
                area = vertcat(area,[y , x+1]);
                picWithAreas(y,x+1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(y,x+1);            %.Setzt den Punkt für den nächsten Aufruf
            end
        end

    end
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: 12.11.2014, 09:48     Titel:
  Antworten mit Zitat      
Also die
Code:


Ist eine innere Funktion.
Immer wenn du sie aufrufst, und für y,x eine 1 eingibst, dann schreibt sie in area alle weiteren Punkte die rein, die zur gleichen Fläche gehören.
DAS HEIßT:
Die function fill ist vollständig so, wie ich es in einem meine vorherigen posts als "fertig" deklariert habe. Weitere änderungen, wie das hineinkopieren dessen, was ich danach postete ist unsinnig.

Du schreibst jetzt den "Aufruf" wie ich ihn in einem meiner neueren Posts geschrieben habe, ÜBER (nicht in, über(!)) die function fill.

Dann sollte der Rest wie von alleine laufen, für die erste Fläche.

Noch ein Tipp:
Wenn du hinter eine Variable das Semikolon wegnimmst, dann wird sie bei der Ausführung auf der Konsole ausgegeben. Da ich mittlerweile weder Lust noch Nerven, plus selbst Zeug zu tun habe, und noch kein Danke gehört habe, werde ich mich evtl nicht mehr in diesem Forum melden.

Den Rest schaffst du, wenn du es wirklich willst, locker selbst. Denn die erste Fläche habe ich dir jetzt im Prinzip zu mind. 85% vorgegeben. Für alle anderen Flächen musst du dann, wenn es für die erste Fläche klappt, nur noch eine while-Schleife setzen, mit der Bedingung, dass pixWithAreas nicht schon leer ist. Das lässt sich mit einer sinnvollen Kombination aus find und length basteln, frag einfach mal Tante Google.
_________________

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: 12.11.2014, 10:06     Titel:
  Antworten mit Zitat      
Hi, tut mir leid bin ziemlich angenervt von diesem Zeug. Wenn du bis jetzt kein Dank gehört hast tut es mir leid. Ich bin dir wirklich sehr sehr dankbar, dass du dir die Zeit nimmst/genommen hast. Jeder Post hat mir ein Stück weitergeholfen ist echt super.

Die erste Fläche wollte ich mir jetzt so ausgeben lassen, jedoch zeigt er im Workspace für size Area und sumArea folgendes an was mir komisch erscheint. Hoffe du nimmst dir nochmals die Zeit.

sizeArea =

3


sumArea =

432 465



Code:
function [Areas]=Image(Bild)
%----------------------------------------------------
im=imread('C:\Users\Jojo\Desktop\BLZ\Matlab Programm\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);

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

[i,j]=find(picWithAreas)
curPoint = [ i(1),j(1) ]
 %Der curPoint ist immer der Erste Teil der Fläche
    area = [curPoint(1),curPoint(2)];
    %..CurPoint wird auf 0 gesetzt
    picWithAreas(curPoint(1),curPoint(2)) = 0;
    %..läuft durch alle Punkte in der Fläche durch.
    fill(curPoint(1),curPoint(2));
   
    %Mehr Punkte werden öfter durchlaufen, deswegen müssen diese
    %"gesäubert" werden -> jeder punkt bleibt danach einfach zurück
    area = unique(area,'first','rows');
   
    %Alle Pixel der Fläche sind jetzt in einer Matrix
    %Die größe wird durch die Anzah lder Pixel bestimmt
    sizeArea = size(area,1)
    %Die Summe aller x und y Koordinaten
    sumArea = sum(area,1)





   function[ ] = fill(i,j)

 
    % FILL using the flood_fill algorithm to iterate through all points of the
    %   same area (4 directions), setting them to zero and adding the pixel to
    %   area  Benutzt den Flood_Fill algorithmus um alle Punkte der Selben
    %   Fläche (in4-Richtungen, oben,unten,links,rechts) auf 0 zu setzen
    %   und die Pixel zur Fläche dazu zu zählen
    % Input    :     the coordinates of the initPoint in myMatrix
    % Koordinaten des ersten Punktes mit >1
    % Output   :     no output, accesses myMatrix and area immidiate   ?
   
   
 
   
   
        sizePic = size(picWithAreas);
        %Wenn der Pixel innerhalb des Bildes liegt dann..
        if(sizePic(1) > i)
            %Und wenn Pixel =1, also weiß ist dann
            if(picWithAreas(i+1 , j) == 1)
                %wird es zur Fläche dazugezählt
                area = vertcat(area,[i+1 , j]);
                %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                picWithAreas(i+1,j) = 0;
                %.Setzt den Punkt für den nächsten Aufruf
                fill(i+1,j);    
            end
        end
        % " Nach Links"
        if(j > 1)     %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(i, j-1) == 1) %Wenn der Wert links von x=1 ist dann
                area = vertcat(area,[i , j-1]);
                picWithAreas(i,j-1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(i,j-1);  %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Oben"
        if(i > 1)  %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(i-1, j) == 1) %Wenn der Wert unter y=1 ist dann
                area = vertcat(area,[i-1 , j]);
                picWithAreas(i-1,j) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(i-1,j);     %.Setzt den Punkt für den nächsten Aufruf
            end
        end
        % "Nach Rechts "
        if(j < sizePic(2)) %Wenn der Pixel innerhalb des Bildes liegt dann..
            if(picWithAreas(i , j+1) == 1)  %Wenn der Wert rechts von x=1 ist dann
                area = vertcat(area,[i , j+1]);
                picWithAreas(i,j+1) = 0; %Pixel auf 0 setzen, damit es nicht nochmals abgerufen
                %wird-
                fill(i,j+1);            %.Setzt den Punkt für den nächsten Aufruf
            end
        end

    end
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: 12.11.2014, 12:15     Titel:
  Antworten mit Zitat      
In Ordnung, gerngeschehen.

Ich habe jetzt nicht nochmal dein Bild rausgekramt, aber was spricht denn dagegen, das deine Werte stimmen?

sizeArea sagt einfach nur, dass deine Areas aus drei Pixeln besteht (Prüfe selbst.) SumArea war nur für meine aufgabenstellung relevant, für dich ist es egal und du kannst die Zeile löschen.
_________________

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 Zurück  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.