Verfasst am: 24.04.2016, 06:36
Titel: Erkennen eines Bildbereiches mittels while-Schleife
Hallo,
ich möchte bei einem s/w-Bild nur die außenliegenden weißen Pixel erfassen. Hierzu habe ich eine Schleife entworfen, die einen Großteil der gewünschten Pixel erfasst. Aber sie erfasst erstens nicht alle und zweitens auch unerwünschte. Außerdem ist die Methode sicher nicht die schnellste und eleganteste. Daher wollte ich Euch mal fragen, ob ihr irgendwelche Ideen und Anregungen zum verbessern des Codes habt.
Kor_Image ist das s/w_Bild und Kor_Reihe eine nx2-Matrix. Die erste Spalte von Kor_Reihe enthält die Startwerte eines Bildes. Also in jeder Reihe des Bildes wird die Spalte mit dem ersten weißen Pixel in Kor_Reihe geschrieben. Ab diesem Punkt geht der Code für jede Reihe das Bild ab und guckt, ob die Pixel den Wert 1 haben und gibt diesen dann den Wert 255. lim_1 ist einfach der Mittelwert aus Kor_Reihen(:,1)
Kor_Reihe(n,2) enthält wiederrum die Endwerte.
In meinem Programm habe ich den Code 4 mal etabliert. Er geht damit das Bild von links, recht, oben und untern durch. Ich hoffe ich habe es einigermaßen verständlich erklärt. Vielleicht machen es die Bilder etwas verständlicher.
Code:
s=size(Kor_Image);
for i=1:s(1) if Kor_Reihe(i,1)~=0 && Kor_Reihe(i,1)<lim_1
e=Kor_Reihe(i,1);
f=i;
Kor_Reihe(i,1)=255;
while Kor_Image(f,e+1)==1 || Kor_Image(f+1,e)==1 || Kor_Image(f,e-1)==1 || Kor_Image(f-1,e)==1 if Kor_Image(f,e+1)==1
Kor_Image(f,e+1)=255;
end if Kor_Image(f+1,e)==1
Kor_Image(f+1,e)=255;
end if Kor_Image(f,e-1)==1
Kor_Image(f,e-1)=255;
end if Kor_Image(f-1,e)==1
Kor_Image(f-1,e)=255;
end
while Kor_Image(f,e+1)==1 || Kor_Image(f+1,e)==1 || Kor_Image(f,e-1)==1 || Kor_Image(f-1,e)==1
f=f-1;
if Kor_Image(f,e+1)==1
Kor_Image(f,e+1)=255;
end if Kor_Image(f+1,e)==1
Kor_Image(f+1,e)=255;
end if Kor_Image(f,e-1)==1
Kor_Image(f,e-1)=255;
end if Kor_Image(f-1,e)==1
Kor_Image(f-1,e)=255;
end
end
f=i;
while Kor_Image(f,e+1)==1 || Kor_Image(f+1,e)==1 || Kor_Image(f,e-1)==1 || Kor_Image(f-1,e)==1
f=f+1;
if Kor_Image(f,e+1)==1
Kor_Image(f,e+1)=255;
end if Kor_Image(f+1,e)==1
Kor_Image(f+1,e)=255;
end if Kor_Image(f,e-1)==1
Kor_Image(f,e-1)=255;
end if Kor_Image(f-1,e)==1
Kor_Image(f-1,e)=255;
end
Was ist denn genau Dein Ziel? Wie wäre es ein Quadrat in die "äußeren Pixel" zu fitten und dann alle Pixels zu behalten, die nur eine bestimmte Entfernung davon haben?
Zitat:
Hierzu habe ich eine Schleife entworfen, die einen Großteil der gewünschten Pixel erfasst. Aber sie erfasst erstens nicht alle und zweitens auch unerwünschte. Außerdem ist die Methode sicher nicht die schnellste und eleganteste.
Ob sie schnell ist oder elegant ist weniger wichtig, wenn sie denn zumindest tun würde, was sie soll.
Zitat:
In meinem Programm habe ich den Code 4 mal etabliert.
Mein Ziel ist es, dass ich die zusammenhängenden äußeren Pixel, also das Quadrat, behalte und die inneren weißen Pixel "eleminiere". Es soll also nur noch das Quadrat sichtbar sein und alles was im Quadrat liegt soll schwarz werden. Das mit dem Abstand von dem Quadrat kling interessant und wirkungsvoll. Dem Ansatz werde ich mal nachgehen. Hast du eventuell ein kleines Beispiel, an dem ich mich orientieren kann. Im Endeffekt brauche ich ja nur 4 Punkte und dann muss ich den Puffer festlegen?
Mit dem Satz habe ich gemeint, dass ich das Bild auf diese Weise von allen Seiten durchgehe. Einmal von links, einmal von rechts, einmal von oben und einmal von unten.
Danke für die schnelle Antwort und den interessanten Ansatz!
Einstellungen und Berechtigungen
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.