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

Bild auf relevanten Bereich zuschneiden

 

Reiswaffel
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 16:59     Titel: Bild auf relevanten Bereich zuschneiden
  Antworten mit Zitat      
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'.

Code:

%% Funktion relevanterBereich

function [z1, z2, s1, s2]=relevanterBereich(x)

sz=size(x); % Größen des Bildes x bestimmen

z1=1; % Variablen auf Ausgangsbild setzen
z2=sz(2);
s1=1;
s2=sz(2);

for k=1:sz(1)
    for n=1:sz(2)
       
        if k==1 % Falls Zeile 1 schon Farbe enthält
           if x(k,n,:)~=0
               z1=k;
           end
        else 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
        end
       
        if k==sz(1) % Falls letzte Zeile Farbe enthält
            if x(k,n,:)~=0
                z2=k;
            end
        else 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
        end
         
    end
end

for n=1:sz(2)
    for k=1:sz(1)
       
        if n==1 % Falls Spalte 1 schon Farbe enthält
           if x(k,n,:)~=0
               s1=n;
           end
        else if 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
        else if 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
         
    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.

Code:

function y=zuschneiden(x,z1,z2,s1,s2)

Bild_zeilen=z2-z1; % Größe des neuen Bildes wird ermittelt
Bild_spalten=s2-s1;

y(1:Bild_zeilen+1,1:Bild_spalten+1,:)=x(z1:z2,s1:s2,:); % Bild zuschneiden
 


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?

Vielen Dank für eure Hilfe

Kreiszugeschnitten.png
 Beschreibung:

Download
 Dateiname:  Kreiszugeschnitten.png
 Dateigröße:  26.29 KB
 Heruntergeladen:  510 mal
Kreis.png
 Beschreibung:

Download
 Dateiname:  Kreis.png
 Dateigröße:  44.2 KB
 Heruntergeladen:  519 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 17:11     Titel:
  Antworten mit Zitat      
ok... ne menge code aber ich hab ein paar anregungen.
Zitat:
Code:
daws wird jedes mal ausgeführt obwohl es nur im ersten schleifen durchlauf erfüllt wird. je nach größe des bildes kann das schon ein wenig dauern.
Zitat:
Code:
if x(k,n,:)~=0
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 17:37     Titel:
  Antworten mit Zitat      
Danke erstmal für die schnelle Antwort Smile,

Also mit dem ersten Punkt hast du vollkommen Recht, die Fall unterscheidung für den letzten und ersten Punkt kann weg.

Code:

function [z1, z2, s1, s2]=relevanterBereich(x)

sz=size(x); % Größen des Bildes x bestimmen

z1=1; % Variablen auf Ausgangsbild setzen
z2=sz(2);
s1=1;
s2=sz(2);

for k=2:sz(1)-1
    for n=2:sz(2)-1
       
        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
         
    end
end

for n=2:sz(2)-1
    for k=2:sz(1)-1
       
        if 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
       
        if 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
end


 


Aufjedenfall schon etwas kürzer jetzt.

Zitat:
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 Question

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.

LG Reiswaffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 17:54     Titel:
  Antworten mit Zitat      
Zitat:
Doch glaube schon, dass hier des all passt, weil ich ja wirklich nur das Schwarz[0 0 0] erkennen möchte.

dann ist richtig. auch wenn du nicht weist was du gemacht hast Smile
Zitat:
Wenn ich deinen Vorschlag richtig verstehe, dann ist er auf jedenfall eine bessere Lösung.
denke auch Smile darum hab ich den vorschlag gemacht.
Code:
x=imread('Kreis.png');
sx=any(any(x,3),1);
sy=any(any(x,3),2);
s1=find(sx,1,'first');
s2=find(sx,1,'last');
z1=find(sy,1,'first');
z2=find(sy,1,'last');


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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 18:00     Titel:
  Antworten mit Zitat      
Wow, vielen Dank Smile
Ich versuche erstmal das "any" genau zuverstehen, weil das ist mir noch neu, aber stehe ja auch erst am Anfang Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.