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

400 Bilder nacheinander einlesen und bearbeiten

 

norm85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 14:05     Titel: 400 Bilder nacheinander einlesen und bearbeiten
  Antworten mit Zitat      
Hi Leute

ich hab schon hier im Forum gesucht aber keine passende Lösung gefunden.

Ich hab Bilder von 001.tif bis 399.tif und will die alle einlesen, so dass ich sie bearbeiten kann.

Das folgende Programm ist meine Bildbearbeitung. Ich will dann alle 399 Bilder mit dem ersten sozusagen vergleichen und bräuchte dafür einen Befehl der alle Bilder als einzelne Matrizen in den Workspace lädt und dann einen Befehl der eine Art Laufvariable für die Benennung des zu bearbeitenden Bildes (hier B2) erstellt, so dass das Programm 398 bearbeitete Bilder (natürlich in Form von Matrizen) ausgespuckt. Wenn mir jemand helfen könnte, wäre das super.


Code:


%% Beschreibung
% MittelwertBer2.m

%% Start
clear
clc


%% Einlesen der Bilder
B1 = double(imread('001.tif'));
B2 = double(imread('036.tif'));

%% Parameterdefinition
Zaehler=0;
Summe=0;

%% Mittelwertberechnung
for i = 1:544
    for j = 1:1024
        if B2(i,j) <= 7500
            HB2(i,j) = -65537; % 16-Bit + 1
        else
            HB2(i,j) = B2(i,j);
        end
        if B2(i,j)>7500
            Zaehler = Zaehler+1;
            Summe = Summe+B2(i,j);
        end
    end
end
   
Mittelwert = Summe/Zaehler;
 


%% Bildberechnung
B3 = HB2 - B1 + Mittelwert;
for i=1:544
    for j=1:1024
        if B3(i,j) < 0
            B3(i,j) = 0;
        else
            B3(i,j) = B3(i,j);
        end
    end
end
B4 = uint16(B3);
B5 = mat2gray(B4);
figure;imshow(B5);

 


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 19.11.2009, 14:44     Titel:
  Antworten mit Zitat      
Also das mit der Syntax des Einlesens sollte recht einfach gehen. So kann z. B. der Dateiname gebildet werden:

Code:

for k1=0:3
    for k2=0:9
        for k3=0:9
            [num2str(k1), num2str(k2), num2str(k3), '.tif']
        end
    end
end


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 19.11.2009, 14:49     Titel:
  Antworten mit Zitat      
ich habe noch ein paar Beobachtungen und Anmerkungen:

400 Bilder 1024x544, 16 Bit dürfte in den Speciher passen - 425 MB. Aber wenn die Bilder in Double umgewanelt werden ist das kaum möglich (mit 32 Bit Systemen). Von der Aufagbe scheint aber nichts dagegen zu sprechen Bild 2 zu löschen wenn Bild 3 eingelsen wird usw.

Ich verstehe nicht warum überhaupt DOUBLE Konversion nötig ist. Und warum die (langsamen) Schleifen für die Bildung eines Mittelwertes?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 15:04     Titel:
  Antworten mit Zitat      
Andreas Goser hat Folgendes geschrieben:
Also das mit der Syntax des Einlesens sollte recht einfach gehen. So kann z. B. der Dateiname gebildet werden:

Code:

for k1=0:3
    for k2=0:9
        for k3=0:9
            [num2str(k1), num2str(k2), num2str(k3), '.tif']
        end
    end
end


Andreas



ja solch ähnliche Ideen hatte ich auch schon. Aber wie krieg ich es hin dass er 001.tif zu A macht und dann 002.tif zu B und so weiter...

Wenn ich

Code:

for k1=0:3
    for k2=0:9
        for k3=0:9
           img =  imread([num2str(k1), num2str(k2), num2str(k3), '.tif']);
        end
    end
end


mache, liest er zwar alle ein aber überschreibt dann ja alle und es bleibt nur 399.tif. Ich bräuchte also einen aufsteigenden Namen für die linke Seite des Gleichheitszeichen. Und das weiß ich leider nicht wie es geht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.11.2009, 15:04     Titel:
  Antworten mit Zitat      
Hallo,

das Bilden des Dateinamens geht noch schöner:

edit für verschiedene Variablen:
Code:
for I = 1:399
assignin('caller', ['bild' num2str(I)], imread(sprintf('%03d.tif', I)))
end


vielleicht erst mal mit 10 statt 399 probieren...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 15:09     Titel:
  Antworten mit Zitat      
Andreas Goser hat Folgendes geschrieben:


Ich verstehe nicht warum überhaupt DOUBLE Konversion nötig ist.
Andreas


weil sonst dieses entsteht

??? Error using ==> minus
Integers can only be combined with integers of the same class, or scalar doubles.

Error in ==> MittelwertBer2 at 37
B3 = HB2 - B1 + Mittelwert;


Andreas Goser hat Folgendes geschrieben:

Und warum die (langsamen) Schleifen für die Bildung eines Mittelwertes?
Andreas


weil mir kein besserer Weg einfällt Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 15:10     Titel:
  Antworten mit Zitat      
Hallo,

die Dateinamen kannst Du Dir in einer Schleife erzeugen und dann die Bilder einlesen:

Code:

for idx = 0:399
    filename = sprintf('%03d.tif',idx);
    ...
end
 


Ansonste würde ich auf jeden Fall auf einige Schleifen verzichten:
Beispiel Bildberechnung:
Code:

B3 = HB2 - B1 + Mittelwert;
B3(B3<0) = 0;
 

Auf ähnliche Weise (mit Hilfe logischer Indizierung) kannst Du auch die erste Schleife entfernen.

Zum Speichern von mehreren Bildern:
Wenn Sie die gleiche größe haben, kannst Du folgendes machen:
Code:

% Speicher reservieren; es ist auch möglich direkt den gewünschten %Datentyp anzugeben (siehe doc zeros)
Bilder = zeros(200,300,10) % Bildbreite 300, Bildhöhe 200, Anzahl Bilder 10
Bilder(:,:,1) = Bild1;
Bilder(:,:,2) = Bild2;
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 15:27     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

das Bilden des Dateinamens geht noch schöner:

edit für verschiedene Variablen:
Code:
for I = 1:399
assignin('caller', ['bild' num2str(I)], imread(sprintf('%03d.tif', I)))
end


vielleicht erst mal mit 10 statt 399 probieren...

Grüße,
Harald


Super das funktioniert.

Aber ich hab natürlich noch weitere Fragen.

Jetzt lädt das Programm ja alle Bilder und benennt sie sinnvoll. Wie kann ich jetzt die Mittelwertberechnung so abändern dass das Programm diese für alle Bilder durchführt. Da müsste ich ja dann B2 (oben im Quellcode ersichtlich) so ändern, dass er auch hochzählt. Müsste das auch über eine Schleife erfolgen? Wenn ja wie müsste dann B2 aussehen.

Auch danke an die anderen die zwischendurch geschrieben haben, aber so schnell kann ich nciht alles ausprobieren Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2009, 17:56     Titel:
  Antworten mit Zitat      
So ich hab das ganze jetzt so realisiert:

Code:


%% Mittelwertberechnung Gesamtprogramm
% Mittelwert_Gesamt.m

%% Clearen

clear
clc
clf


%% Einlesen aller Bilder und Berechnung

Zaehler = 0;
Summe = 0;

for q = 1:298
    assignin('caller', ['Bild' num2str(q)], double(imread(sprintf('%03d.tif', q))));
    Laufbild = evalin('caller', ['Bild' num2str(q)]);
    for i = 1:544
        for j = 1:1024
             if Laufbild(i,j) <= 7500
                Hilfsbild(i,j) = -65537;              % 16-Bit + 1
            else
                Hilfsbild(i,j) = Laufbild(i,j);
            end
            if Laufbild(i,j) > 7500
                Zaehler = Zaehler + 1;
                Summe = Summe + Laufbild(i,j);
            end
        end
    end
    Mittelwert = Summe/Zaehler;
    Summe = 0;
    Zaehler = 0;
    Laufbild = Hilfsbild - Bild1 + Mittelwert;
    for a = 1:544
        for b = 1:1024
            if Laufbild(a,b) < 0
                Laufbild(a,b) = 0;
            else
                Laufbild(a,b) = Laufbild(a,b);
            end
        end
    end
    Laufbild = uint16(Laufbild);
    Laufbild = mat2gray(Laufbild);
    figure;imshow(Laufbild);
    saveas(gcf, ['CleanBild' num2str(q)], 'tif');
    close
end

 


wie ihr seht nutze ich

Code:

figure;imshow(Laufbild);
    saveas(gcf, ['CleanBild' num2str(q)], 'tif');
    close
 


zum speichern weil ich nix anderes gefunden habe was meinen Anforderungen entspricht. Wenn da jemand einen weniger speicherintensiven Weg weiß würd ich mich über Tipss freuen.

Und wenn euch noch weiteres zum Optimieren auffällt würd ich mich auch freuen, weil ich nun nciht wirklich Ahnung habe Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.11.2009, 09:18     Titel:
  Antworten mit Zitat      
Hallo,

warum nutzt nicht imwrite-Funktionen zu ausschreiben der Bilder

Code:

    Laufbild = uint16(Laufbild);
    Laufbild = mat2gray(Laufbild);
    imwrite(Laufbild, ['CleanBild' num2str(q),'.tif'], 'tif')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2009, 12:16     Titel:
  Antworten mit Zitat      
Hi Denny

ich danke dir. Habe es so umgesetzt und nun funktioniert es wie gewünscht.

grüße
norm
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.11.2009, 17:39     Titel:
  Antworten mit Zitat      
Hallo,

man könnte natürlich versuchen, da ein paar Schleifen loszuwerden:

Code:
for a = 1:544
        for b = 1:1024
            if Laufbild(a,b) < 0
                Laufbild(a,b) = 0;
            else
                Laufbild(a,b) = Laufbild(a,b);
            end
        end
end


wird zu:
Code:
Laufbild(Laufbild < 0) = 0


Code:
for i = 1:544
        for j = 1:1024
             if Laufbild(i,j) <= 7500
                Hilfsbild(i,j) = -65537;              % 16-Bit + 1
            else
                Hilfsbild(i,j) = Laufbild(i,j);
            end
            if Laufbild(i,j) > 7500
                Zaehler = Zaehler + 1;
                Summe = Summe + Laufbild(i,j);
            end
        end
    end


wird zu:
Code:
indices = Laufbild <= 7500;
Hilfsbild = Laufbild;
Hilfsbild(indices) = -65537;
Zaehler = nnz(~indices);
Summe = sum(Laufbild(~indices));


Das sollte deutlich effizienter und schneller sein. Bitte aber sicherheitshalber überprüfen, ob auch die gleichen Ergebnisse herauskommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2009, 16:41     Titel:
  Antworten mit Zitat      
Hi Harald

danke für die Antwort. Funktioniert genauso gut nur natürlich schneller und weniger Speicherintensiv. Danke für die Hilfe. Wirklich ein gutes Forum hier.

Grüße
norm
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.