Verfasst am: 04.05.2013, 21:38
Titel: Probleme mit if-Schleife
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.
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.
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.
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.
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.
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 ...
Viele Grüße
Code:
clearall;
closeall;
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
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.
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
clearall;
closeall;
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
"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.
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 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 ...
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:
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.
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.
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
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.