Verfasst am: 05.07.2015, 15:59
Titel: Bild auf relevanten Bereich zuschneiden
Guten Tag Forum,
Ich möchte Bilder auf einen relevanten Bereich zuschneiden. Mein Code funktioniert so weit, benötigt allerdings sehr lange Zeit für den Prozess und ist auch nur spezifisch auf das Beispielbild zugeschnitten.
Das Beispielbild ist als 'Kreis.png' angehängt, das zugeschnitte Bild als 'Keiszugeschnitten.png'.
if k==1% Falls Zeile 1 schon Farbe enthält if x(k,n,:)~=0
z1=k;
end elseif x(k,n,:)~=0% Falls eine Zeile Farbe enthält if x(k-1,n,:)==0% Falls die Zeile davor keine Farbe enthält if z1==1% Nur der erste Wert wird gespeichert
z1=k;
end end end end
if k==sz(1)% Falls letzte Zeile Farbe enthält if x(k,n,:)~=0
z2=k;
end elseif x(k,n,:)~=0% Falls eine Zeile Farbe enthält if x(k+1,n,:)==0% Falls die Zeile dannach keine Farbe enthält
z2=k;
end end end
if n==1% Falls Spalte 1 schon Farbe enthält if x(k,n,:)~=0
s1=n;
end elseif x(k,n,:)~=0% Falls eine Spalte Farbe enthält if x(k,n-1,:)==0 if s1==1% Falls die Spalte davor keine Farbe enthält
s1=n;
end end end end
if n==sz(2)% Falls letzte Spalte Farbe enthält if x(k,n,:)~=0
s2=n;
end elseif x(k,n,:)~=0% Falls eine Spalte Farbe enthält if x(k,n+1,:)==0% Falls die Spalte dannach keine Farbe enthält
s2=n;
end end end
Ich habe mir gedacht, dass ich die Zeilen und Spalten auf Farben ungleich Schwarz teste und sobald diese gefunden wurden die Zeilen bzw. Spaltenwerte zurück geben lasse. Mit Hilfe dieser Werte wird dann in einer zweiten Funktion das Bild zugeschnitten.
Hat jemand eine Idee, wie ich vorallem die erste Funktion schneller und effektiver Programmieren könnte ? Bzw. ist es möglich, dass man sich das Bild anzeigen lässt und dann in diesem ein Rechteck mit der Maus zieht und alles ausserhalb dieses Rechtecks abgeschnitten wird?
das ist richtig aber ich frage lieber nach ob dir klar ist das dort ein all eingesetzt wird und kein any? wenn eine deiner farbkomponenten 0 ist wird da nix gemacht. denke das ist nich das was du willst.
das erstmal zu deinem code.
ich würde keine schleife benutzen. ich denke es giebt in der image processing toolbox schon etwas das das amcht aber wenn man das nicht hat würde ich wie in deinem programm vorgehen blos vektorisiert.
du kannst erstmal ein
any
über die 3. dimension machen dann hast du nur noch eine 2d matrix. dann machst du ein
sum
über die erste und 2. dimension. und bekommst dann ja mit
find
first und last die indexe der äußeren ränder.
_________________
if x(k,n,:)~=0% Falls eine Zeile Farbe enthält if x(k-1,n,:)==0% Falls die Zeile davor keine Farbe enthält if z1==1% Nur der erste Wert wird gespeichert
z1=k;
end end end
if x(k,n,:)~=0% Falls eine Zeile Farbe enthält if x(k+1,n,:)==0% Falls die Zeile dannach keine Farbe enthält
z2=k;
end end
das ist richtig aber ich frage lieber nach ob dir klar ist das dort ein all eingesetzt wird und kein any? wenn eine deiner farbkomponenten 0 ist wird da nix gemacht. denke das ist nich das was du willst.
Doch glaube schon, dass hier des all passt, weil ich ja wirklich nur das Schwarz[0 0 0] erkennen möchte.
Zur Image Prozessing Toolbox: Diese besitze ich, bin allerdings noch nicht wirklich dazu gekommen diese zu nutzen bzw. ist mir noch nicht ganz klar, wie ich diese in meinen Quellcode einbinde damit automatisch etwas passiert
Zitat:
du kannst erstmal ein any über die 3. dimension machen dann hast du nur noch eine 2d matrix. dann machst du ein sum über die erste und 2. dimension. und bekommst dann ja mit find first und last die indexe der äußeren ränder.
Wenn ich deinen Vorschlag richtig verstehe, dann ist er auf jedenfall eine bessere Lösung.
nochmal ne anmerkung zu deinem code. diene beiden schleifen laufen eigendlich über die selben indizes. du kannst sie darum auch einfach in die selbe schleife packen. das würde das ganze schonmal beschleunigen. wenn man mit schleifen arbeitet halt gucken was man raußziehen kann. und dann gucken ob du sachen auch mit einer schleife erledigen kannst als mit 2. und dann kommt es noch drauf an wie die diemensionen des bildes sind. gibt da noch unterschiede ob die äußere schleife über den ersten oder 2. index läuft und so weiter.... aber wie gesagt bei deinem fall hier ist es auch ohne schleife möglich.
_________________
Wow, vielen Dank
Ich versuche erstmal das "any" genau zuverstehen, weil das ist mir noch neu, aber stehe ja auch erst am Anfang
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.