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

Probleme mit if-Schleife

 

stratist9011
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2013, 21:38     Titel: Probleme mit if-Schleife
  Antworten mit Zitat      
Hi,

ich habe eine Matrix E in der die Koordinaten von Punkten mit dem Wert 0 einer Binärmatrix enthalten sind. Jetzt will ich jeweils Pro Zeile zwei Spaltenwerte auswählen und durch diese eine Gerade plotten lassen.
Hier mal mein Code :

Code:

[i,j]=find(D==0);               % findet alle zeilen und spalten wo D gleich 0 ist ... d.h. schwarz ist !
E=[i,j]                              % Matrix mit Koordinaten der schwarzen Pixel

for j=1:1:2                       % Zeilen in j+1 Schritten bis i+2 von i an durchlaufen
    if i=1:10:20                        % Den zu j passenden Zeilenwert i finden ...   hier sollen nur 2 Werte genommen werden
        P=polyfit(i,j,1);
        figure,
        plot(P);
    end
end
 


Leider funktioniert es nicht, was mache ich falsch ?
Hier die Fehlermeldung die ich von Matlab bekomme :
Cell cannot be evaluated because it contains an invalid statement.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2013, 22:24     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe diese Zeile genauso wenig wie MATLAB:
Code:
if i=1:10:20  


Zu if gehört eine logische Bedingung, die entweder true oder false ist.
Wenn du for statt if verwendest, wäre es immerhin mal lauffähiger Code. Allerdings kann ich nicht beurteilen, ob der Code dann das macht, was er soll.

Vielleicht kannst du mal in Worten sagen, für welche i und j der Code ausgeführt werden soll.

Alternativ:
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2013, 22:58     Titel:
  Antworten mit Zitat      
Hallo,

also ich möchte das Matlab pro Zeile(=i) zwei Spaltenwerte(=j) nimmt und durch diese eine Gerade legt. Deshalb soll j=1:2 sein und i=1:10:200.
Bei i soll von 1 bis i+200 gelaufen werden (habe da ausversehen eine 0 vergessen) und das mit einer Schrittweite von 10, also nach dem 1. i soll das 10te i danach wieder genommen werden und so weiter.

Ich bin noch ein ziemlicher Anfänger im Programmieren und Matlab, ich hoffe das konnte mein Problem etwas besser beschreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.05.2013, 23:30     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

Deine Erklärung und der gezeigte Code passen nicht zusammen.
Wie Harald schon erklärt hatte, ist "if i=1:10:200" kein valider Matlab-Ausdruck. Dass "pro i-Zeile zwei j-Werte genommen werden sollen" passt aber auch nicht zur "for j = 1:1:2".
"P=polyfit(i,j,1);" bekommt bisher (also wenn ich "if i" durch "for i" ersetze) zwei skalare Werte als Inputs und kann dadurch keine Linie legen. Selbst wenn, wäre das Plotten der Polynom-Parameter nicht nützlich oder sinnvoll.
Wieso erzeugst Du E, obwohl es später gar nicht benutzt wird?

Ich empfehle, das Problem erst nochmal neu in einzelne Teile zu zerlegen und weiter zu versuchen die Einzel-Schritte dann in Matlab zu implementieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2013, 13:44     Titel:
  Antworten mit Zitat      
Okay. Vielleicht versuche ich hier auch das falsche Werkzeug zu benutzen um zum Ziel zu kommen.

Im Anhang ist das Binärbild das ich erzeuge. In diesem Binärbild sieht man schwarze Balken.

Wie kann man mit Matlab diese Rechtecke erkennen und deren Kantenkoordinaten ? Regionprops hat mich da nicht wirklich weiter gebracht.

Wie kann ich denn in diesem Bild den Mittelpunkt der jweiligen Rechtecke finden und mir deren Koordinaten ausgeben lassen ?

Bild.jpg
 Beschreibung:

Download
 Dateiname:  Bild.jpg
 Dateigröße:  9.84 KB
 Heruntergeladen:  536 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.05.2013, 22:26     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

Zitat:
Regionprops hat mich da nicht wirklich weiter gebracht.

Es ist für eine Diskussion im Forum immer hilfreich, solche Aussagen miot Details zu erklären: Was hast Du mit REGIONPROPS versucht und woran bist Du gescheitert?
Es ist immer viel einfacher einen Verbesserungsvorschlag zu machen, anstatt das Problem komplett zu lösen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 09:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

inzwischen bin ich von regionprops weg und habe mir etwas anderes überlegt, was eigentlich funktionieren müsste.
Ich erzeuge mir aus einem Bild über mehrere Schritte eine Binärmatrix D, siehe Code, anschließend suche ich alle Zeilen und Spalten in der Matrix wo die einzelnen Stellen d_ij=0 sind.

Leider weiß ich nicht wie ich mittels einer Schleife pro Zeile die 0 ist durch die Spaltenwerte j und j+1 eine Gerade legen kann und mir diese dann plotten lassen kann und in einer Vektorgleichung ausgeben lassen kann.

Wie kann ich also Matlab sagen, dass er für jede Zeile in der 0 vorkommt durch 2 Spaltenwerte dieser Zeile eine Gerade legen soll .... ?
Ich hoffe ich konnte mein Problem jetzt mal ordentlich darlegen Smile ...

Viele Grüße



Code:
clear all;
close all;
A=imread('Struktur2.jpg');      % Bild einlesen
imshow(A)
B=rgb2gray(A);                  % Graubild erstellen
C=imadjust(B,[0;1],[0;1]);      % Kontrast von X erhöhen
C(C>50)=255;                    % Alle Werte oberhalb 50 auf 255 setzen
D=im2bw(C);
D = edge(C,'sobel',i);          % sucht in i-Richtung der Matrix nach Maxima
D=~D;
hold on
imshow(D);
[i,j]=find(D==0);               % findet alle Zeilen und Spalten in denen Werte vorhanden sind die =0 und somit schwarz sind
if d_ij==0                         % Wenn d_ij=0 soll soll Gerade durch die jeweilige Zeile geplottet werden
    y Werte geplottet werden
        p=polyfit(x,y,1);
        y=polyval(p,x);
        plot(x,y)
        hold off
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.05.2013, 16:55     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

Zitat:
Leider weiß ich nicht wie ich mittels einer Schleife pro Zeile die 0 ist durch die Spaltenwerte j und j+1 eine Gerade legen kann und mir diese dann plotten lassen kann und in einer Vektorgleichung ausgeben lassen kann.

Bitte erkläre diesen Satz noch mal in anderen Worten. Danke.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 16:56     Titel:
  Antworten mit Zitat      
Hi, sorry das ich jetzt erst Antworte habe vorher, aber leider keine Zeit gefunden.

Also ich habe den Code nochmal leicht verändert und versucht durch bwconncomp und labelmatrix allen zusammenhängenden Balken einen bestimmten Wert von 1 aufwärts zuzuweisen (also 1,2,3 ... usw.).
Allerdings funtkioniert das noch nicht ganz so wie es soll, denke ich, da mir komierscherweise in der Matrix L nur 0 angezeigt wird und somit nur noch Hintergrund da wäre oder ?

Was ich anschließend mit den Geraden erreichen möchte um auf deine Frage zurück zu kommen ist, dass ich die Mittelpunkte eines jeden Balkens finde und dann durch diesen Mittelpunkt eine Gerade lege (im Anhang ist ein Bild mit Paint erstellt wie ich das meine) ....
Anschließend soll mir noch in Form eines Vektors die Steigung jeder Gerade ausgegeben werden und deren Geradengleichung in vektorieller Form.

Hier der Code wie ich ihn jetzt habe
Code:
%% Bild in Binary, Filterung, Labeln, Mittelpunkte suchen

clear all;
close all;
tic
A=imread('Struktur2.jpg');          % Bild einlesen
figure,
imshow(A)
B=rgb2gray(A);                      % Graubild erstellen
C=imadjust(B,[0;1],[0;1]);          % Kontrast von X erhöhen
C(C>50)=255;                        % Alle Werte oberhalb 30 auf 255 setzen
D=im2bw(C);                         % Wandelt C in Binärbild
D=~D;                               % Bild muss nochmal umgekehrt werden, damit conncomp funktioniert
toc                                 % Braucht 1.402576 sek.

tic
DD=imfill(D,'holes');               % FloodFill stopft alle Löcher ....
figure,
imshow(DD)
CC = bwconncomp(DD);                % returns the connected components CC found in D while D is a binary image
L = labelmatrix(CC);                % Weißt jedem zusammenhängenden Bildteilen eine 1, 2, 3 usw. zu. Der Hintergrund ist 0.
L2 = bwlabel(DD);
whos L L2
figure,
imshow(label2rgb(L));               % Erzeugt farbiges Bild der Labelmartrix mit zusammenhängenden Strukturen
s=regionprops(CC,'Centroid');       % Array s mit den Mittelpunkten der Objekte in der Matrix L % Funktioniert noch nicht ganz, der sucht nur im ersten Ding nach dem Mittelpunkt
whos s
toc                                 % Braucht 0.899794 sek.

%  Geraden Plotten
tic
Ni=size(L,1);
Nj=size(L,2);
whos Ni Nj s
for i=1:Ni                         % Für alle i von 1 bis Ni,
    for j=1:Nj                     % Für alle j von 1 bis Nj,
        while(L(i,j)~=0)           % Solange L ungleich 0,
            imshow(L)              % Zeige L
            hold on                % Halte Image L fest
            p=polyfit(i,s,1);
            plot(p,i);             % Plotte für das jeweilig i durch das entsprechende s und die entsprechenden j`s ....
            hold off               % Lasse Image L los
        end
    end
end
toc


Die Schleife soll nun für das entsprechende i, also die entsprechende Zeile in der der Mittelpunkt s liegt suchen und durch diese eine Gerade legen.
Allerdings funktioniert die Schleife so wie ich sie jetzt habe nicht !
Stehe da im Moment etwas auf dem Schlauch

untitled2.jpg
 Beschreibung:

Download
 Dateiname:  untitled2.jpg
 Dateigröße:  15.63 KB
 Heruntergeladen:  496 mal
untitled.jpg
 Beschreibung:

Download
 Dateiname:  untitled.jpg
 Dateigröße:  9.33 KB
 Heruntergeladen:  571 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.05.2013, 00:54     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

"Funktioniert nicht" ist im Forum ein eindeutiges DON'T. Bitte erkläre stattdessen den Unterschied zwischen Deinen Erwartungen und dem Ergebnis, bzw. poste eine Kopie der vollständigen Fehlermeldung.
Man kann viel besser versuchen einen Verbesserungsvorschlag zu machen, wenn man nicht zuerst das Problem erraten muss.

Noch eine Bemerkung: Der header "clear all; close all;" ist zwar weit verbreitet, aber dennoch nicht sinnvoll. "clear all" löscht alle Funktionen aus dem Speicher und das Nachladen von der Festplatte und das erneutet Parsen ist sehr zeitraubend. Ausserdem löscht es alle Breakpoints aus dem Code. Und wer Programmieranfängern Methoden empfiehlt, die das Debuggen absichtlich und effizient erschweren machen, gehört an den Pranger gestellt.
Ich empfehle, diesen brutalen clearing-Header einfach ersatzlos zu streichen. Er macht mehr Probleme als er löst.
Und wenn das dann erledigt ist, kannst Du einfach ein paar Breakpoints in den Code setzen und per Debugger selbst nachschauen, was warum wo im Code nicht läuft wie gewünscht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 11:19     Titel:
  Antworten mit Zitat      
So .... heute habe ich endlich mal die Zeit gefunden hier zu antworten.
Also ich habe an der Schleife noch leicht etwas verändert :

Code:
STRUCT=regionprops(CC,'centroid');       % Array s mit den Mittelpunkten der Objekte in der Matrix L
tic
[nrows,ncols] = size(L2);
x=ncols;
y=nrows;
for i=1:nrows                        % Für alle i von 1 bis nrows,
    for j=1:ncols                    % Für alle j von 1 bis ncols,
        while(L(i,j)~=0)             % Solange L ungleich 0,
            if(i==STRUCT)            % Wenn Zeile i = Zeile mit s, dann
                figure,
                imshow(L2)           % Zeige L2
                hold on              % Halte Image L fest
                p=polyfit(x,y,1);
                plot(p);             % Plotte für das jeweilige i durch das entsprechende s und die entsprechenden j`s ....
                hold off             % Lasse Image L los
            end
        end
    end
end
toc


Wenn ich diese durchlaufen lasse kommt folgende Fehlermeldung :
~~Undefined function 'eq' for input arguments of type 'struct' ~~

STRUCT macht also nicht das was ich denke das es macht Sad nämlich die Mittelpunkte finden ... oder ?

Wie gesagt ich möchte durch die Mittelpunkte eines jeden Balkens eine Gerade legen ... Viele Grüße und danke für den Hinweis mit dem clear all close all ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.05.2013, 23:43     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

Ich wiederhole es noch einmal: Um zu verstehen, was das Problem ist, benötigen wir eine Kopie der vollständigen Fehlermeldung. Dabei ist es wichtig zu erklären, welche Zeile des Fehler erzeugt.

Es scheint hier eine Verwechselung zu geben: In der Fehlermeldung steht 'struct', deine Variable heißt aber 'STRUCT'. Die Groß/Kleinschreibung ist aber wichtig.
Ich rate mal, dass das Problem hier auftritt:
Code:

"eq" ist der "=="-Operator, der hier links einen DOUBLE und rechts eine Variable vom Typ struct bekommt. Das lässt sich aber nicht vergleichen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 12:27     Titel:
  Antworten mit Zitat      
Hallo Jan,

das ist die komplette Fehlermeldung die mir Matlab ausspuckt.
Das Problem müsste der Fehlermeldung nach
Code:

sein, wie du es ja selbst schon geschrieben hast.

Aber wieso kann ich i und STRUCT nicht vergleichen ?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 20:25     Titel:
  Antworten mit Zitat      
STRUCT ist vom Typ 'struct' und i vom Typ 'double', wie die Fehlermeldung ja schon sagt. Wie soll man Äpfel mit Birnen vergleichen können. Schau mal nach, was in STRUCT überhaupt drinsteht, und mach Dir klar, was Du eigentlich vergleichen willst.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.05.2013, 01:45     Titel:
  Antworten mit Zitat      
Hallo stratist9011,

Ich glaube nicht, dass "~~Undefined function 'eq' for input arguments of type 'struct' ~~" die komplette Fehlermeldung ist. Einerseits kenne ich gar keine Fehlermeldung, die in doppelte Tilden gestellt wird, andererseits enthält die Meldung auch einen Hinweis auf die Zeile, in der der Fehler auftritt. Schaue sie dir einfach nochmal an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

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