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

Einlesen und speichern mehrerer Bilder und Daten

 

Toffel
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2012, 00:18     Titel: Einlesen und speichern mehrerer Bilder und Daten
  Antworten mit Zitat      
Hallo zusammen,

ich bin neu hier und arbeite auch noch nicht so lange mit Matlab. Smile Ich bräuchte ein Programm, das (u. a.) mehrere Bilder einliest und die Ergebnisse sowie verschiedene Parameter speichert. Die Teile des Quelltextes dazu habe ich versucht zusammenzutragen und anzupassen. Allerdings funktionieren sie nicht richtig.
Der Teil zur Bildanalyse ist hier nur mal beispielhaft.
Kann mir jemand helfen?

Code:

clc;
 
% Einlesen des Dateipfades und Erstellen einer Liste der Dateinamen
fPath = uigetdir('.', 'Ordner auswählen');
if fPath==0, error('Kein Ordner ausgewählt'), end
fNames = dir( fullfile(fPath,'*.jpg') );
fNames = strcat(fPath, filesep, {fNames.name});
 
% Bearbeiten jeder einzelnen Datei
for i=1:length(fNames)
   
    % Belegen einer Variable mit dem aktuellen Bild (sicher fehlerhaft)
    Bildakt = fNames(i);
   
    % Erzeugen einer weiteren Matrix mit der Größe des aktuellen Bildes
    Ergebnis = Bildakt;
   
    % Bestimmung der Auflösung des Fotos
    Aufloesung = size (Bildakt);    
    AufH = Aufloesung (1,1);       % Höhe
    AufB = Aufloesung (1,2);       % Breite
   
    Wert1 = 0;
    Wert2 = 0;
   
    % Untersuchen des Bildes
    for x = 1:AufH
        for y = 1:AufB
            if Bildakt (x,y) == 0
                Ergebnis (x,y) = 255;
                Wert1 = Wert1 + 1;
            else
                Wert2 = Wert2 + 1;
            end;
        end;
    end;
   
    % Bild speichern
    Ordner = fPath;
    Name = Bildakt;
    Bildname = strcat(Ordner,'\Ergebnis',Name);
    imwrite(Ergebnis,Bildname,'png');
   
    % Ergebnisse in einer txt-Datei speichern
    Ergebnisse = [Bildname; Wert1; Wert2];
    fid = fopen('Ergebnisse.txt','w');
    fprintf(fid,'%6.2f  %12.8f\n',Ergebnisse);
    fclose(fid);
   
end;
 


Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.12.2012, 20:46     Titel:
  Antworten mit Zitat      
Hallo,

inwiefern funktioniert es nicht richtig?
Gibt es eine Fehlermeldung? Welche?
Ist das Ergebnis nicht wie erwartet? Inwiefern?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2012, 18:18     Titel:
  Antworten mit Zitat      
Hallo Harald,

mir ist u. a. nicht ganz klar, welcher Befehl in der Schleife das aktuelle Einzelbild aufruft. Ich hatte vermutet, dass es "fNames(i)" ist. Das stimmt aber wohl so nicht und deshalb hat er dann mit dem Befehl "if Bildakt (x,y) == 0" ein Problem ("Undefined function or method 'eq' for input arguments of type 'cell'.")
Es müssen natürlich erst mal die Grauwerte eingelesen werden, also vielleicht besser so: "Bildakt = imread (fNames(i));"? Dann kommt allerdings die Ausschrift, dass eine Zelle nicht in logische Werte umgewandelt werden kann.

Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.12.2012, 18:40     Titel:
  Antworten mit Zitat      
Hallo,

ja, das tatsächliche Einlesen des Bildes ist ein guter Anfang. Sonst lässt du die Operationen ja auf den Dateinamen los statt auf den Dateiinhalt.

Bitte eine Fehlermeldung immer kopieren, nicht übersetzen, und dazuschreiben, in welcher Zeile das Problem auftritt (wobei das ohnehin Teil der Fehlermeldung ist).

Zudem kannst du im Workspace Datentyp und Dimension der Variablen sehen und so selbst eine Vorstellung von dem bekommen, was schiefgehen könnte.
Schau insbesondere mal, was fnames bzw. fnames(i) ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2012, 20:16     Titel:
  Antworten mit Zitat      
Hallo,

da steht:
"??? Conversion to logical from cell is not possible.

Error in ==> imread at 340
if (strfind(filename, '://'))

Error in ==> Bildverarbeitung at 15
Bildakt = imread (fNames(i));"

Wie bekomme ich Variablen im Workspace angezeigt? Automatisch steht dort wohl nur was, wenn ein Programm gelaufen ist.

Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.12.2012, 21:16     Titel:
  Antworten mit Zitat      
Hallo,

sobald du im Command Window eine Variable erstellst oder ein Skript laufen lässt, das dies tut, solltest du diese Variablen sehen.
Die Fehlermeldung lässt darauf schließen, dass der Bildname ungültig ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2012, 17:23     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das Programm laufen lasse, erscheint im Workspace nichts. Wenn ich die Variable "fnames" im Workspace erstelle, wird der Wert "0" angezeigt (ist ja sicher Standard).

Die Bildnamen enthielten Leerzeichen. Aber jetzt ohne die Leerzeichen bestehen sie nur noch aus einer Zahl. Habe es auch mit einem Buchstaben probiert, aber es funktioniert nicht. Es erscheint immer die gleiche Fehlermeldung.

Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.12.2012, 18:33     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
wenn ich das Programm laufen lasse, erscheint im Workspace nichts.

Und du bist sicher, dass es ein Skript ist? Du hast nicht etwa ein function ganz oben in der Datei, womit sie zu einer Funktion würde?

Zitat:
Wenn ich die Variable "fnames" im Workspace erstelle

Wie?

Zitat:
wird der Wert "0" angezeigt (ist ja sicher Standard).

Das kommt darauf an, wie du die Variable erstellst. Wenn es ein Bildname sein soll, ist das aber eher schlecht.

Zitat:
Die Bildnamen enthielten Leerzeichen. Aber jetzt ohne die Leerzeichen bestehen sie nur noch aus einer Zahl. Habe es auch mit einem Buchstaben probiert, aber es funktioniert nicht.

Was du schreibst, liest sich sehr merkwürdig. Bitte nicht beschreiben, was du versuchst, sondern den zugehörigen Code posten.

Und eine dringende Empfehlung: mal von Anfang an die Grundlagen von MATLAB erlernen und klein anfangen. Z.B. erst mal ein festes Bild analysieren und sicherstellen, dass da alles klappt, bevor du dich an einen ganzen Ordner von Bildern machst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2012, 19:32     Titel:
  Antworten mit Zitat      
Hallo,

Harald hat Folgendes geschrieben:

Und du bist sicher, dass es ein Skript ist? Du hast nicht etwa ein function ganz oben in der Datei, womit sie zu einer Funktion würde?


ach so. Wink Jetzt steht da "<1x2 cell>".

Zitat:

Zitat:
Wenn ich die Variable "fnames" im Workspace erstelle

Wie?


Ich klicke links oben auf "New variable" und gebe dann "fnames" ein.

Zitat:

Was du schreibst, liest sich sehr merkwürdig. Bitte nicht beschreiben, was du versuchst, sondern den zugehörigen Code posten.


Außer "Bildakt = imread (fNames(i));" habe ich nichts geändert. Weil du geschrieben hast, dass es am Bildnamen liegen könnte, dachte ich, dass in den Dateinamen ungültige Zeichen enthalten sind.

Der vollständige Code lautet jetzt:

Code:
clc;

% Einlesen des Dateipfades und Erstellen einer Liste der Dateinamen
fPath = uigetdir('.', 'Ordner auswählen');
if fPath==0, error('Kein Ordner ausgewählt'), end
fNames = dir( fullfile(fPath,'*.jpg') );
fNames = strcat(fPath, filesep, {fNames.name});

% Bearbeiten jeder einzelnen Datei
for i=1:length(fNames)
   
    % Belegen einer Variable mit dem aktuellen Bild (sicher fehlerhaft)
    Bildakt = imread (fNames(i));
   
    % Erzeugen einer Nullmatrix mit der Größe des aktuellen Bildes
    Ergebnis = Bildakt;
   
    % Bestimmung der Auflösung des Fotos
    Aufloesung = size (Bildakt);    
    AufH = Aufloesung (1,1);       % Höhe
    AufB = Aufloesung (1,2);       % Breite
   
    Wert1 = 0;
    Wert2 = 0;
   
    % Untersuchen des Bildes
    for x = 1:AufH
        for y = 1:AufB
            if Bildakt (x,y) == 0
                Ergebnis (x,y) = 255;
                Wert1 = Wert1 + 1;
            else
                Wert2 = Wert2 + 1;
            end;
        end;
    end;
   
    imshow (Ergebnis);
   
    % Bild speichern
    Ordner = fPath;
    Name = Bildakt;
    Bildname = strcat(Ordner,'\Ergebnis',Name);
    imwrite(Ergebnis,Bildname,'png');
   
    % Ergebnisse in einer txt-Datei speichern
    Ergebnisse = [Bildname; Wert1; Wert2];
    fid = fopen('Ergebnisse.txt','w');
    fprintf(fid,'%6.2f  %12.8f\n',Ergebnisse);
    fclose(fid);
   
end;


Zitat:

Und eine dringende Empfehlung: mal von Anfang an die Grundlagen von MATLAB erlernen und klein anfangen. Z.B. erst mal ein festes Bild analysieren und sicherstellen, dass da alles klappt, bevor du dich an einen ganzen Ordner von Bildern machst.


Das hat schon geklappt. Ich habe nur Probleme mit den Befehlen zum Einlesen, Speichern usw. mehrerer Bilder. Da ich sie bisher nicht kenne, habe ich die Quelltextfragmente von woanders kopiert und versucht anzupassen.

Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.12.2012, 19:57     Titel:
  Antworten mit Zitat      
Hallo,

was ist denn nun "<1x2 cell>"? fnames? Dann klicke mal rein und schau, ob da was sinnvolles drinsteht. Und wenn fnames ein Cell Array ist, solltest du mit {} reinindizieren, um das darin enthaltene zu verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2012, 16:33     Titel:
  Antworten mit Zitat      
Hallo,

ja, fnames hat den Wert "<1x2 cell>". Wenn ich drauf klicke, erscheint eine Tabelle, in deren Spalten in der ersten Zeile die einzelnen Pfade der jeweiligen Bilddateien stehen.

Wenn ich "Bildakt = imread {fNames(i)};" im Code nehme, erscheint:
"??? Undefined variable "imread" or class "imread".

Error in ==> Bildverarbeitung at 13
Bildakt = imread {fNames(i)};"

Wenn ich "Bildakt = imread (fNames{i});" nehme, erscheint:
"Warning: Image is too big to fit on screen; displaying at 33%
> In imuitools\private\initSize at 73
In imshow at 262
In Bildverarbeitung at 38
Warning: Input should be a string.
> In strcat at 92
In Bildverarbeitung at 43
Warning: Input should be a string.
> In strcat at 92
In Bildverarbeitung at 43"
usw.

Und am Ende:
"??? Error using ==> imwrite at 453
Can't open file
"UUUUUUUUUUU[...]::::::::::::::[...]\\\\\\\\\\\\\[...]GGGGGGGGGGGGGGGG[...]

Error in ==> Bildverarbeitung at 44
imwrite(Ergebnis,Bildname,'png');"

Viele Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2012, 16:37     Titel:
  Antworten mit Zitat      
Noch eine Ergänzung:
das erste Bild wird wie gewünscht ausgewertet und das Ergebnis auch angezeigt. Aber dann bricht er eben ab und wertet daher das zweite Bild nicht aus.

Grüße
Toffel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2012, 23:29     Titel:
  Antworten mit Zitat      
Hallo,

verwende bitte den Debugger. Dann sollte auch herauskommen, wie es zu dem merkwürdigen Bildnamen im vorletzten Beitrag kommt.
Ohne den Code selbst ausführen zu können ist es schwierig nachzuvollziehen, woran das liegt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Toffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 13.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2013, 23:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe mich nun eine Weile nicht gemeldet. Ich habe inzwischen eine Lösung gefunden. Dir möchte ich noch besonders für deine zahlreichen hilfsbereiten Antworten danken.

Viele Grüße und ein gesundes neues Jahr
Toffel
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 - 2025 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.