Verfasst am: 14.12.2012, 00:18
Titel: Einlesen und speichern mehrerer Bilder und Daten
Hallo zusammen,
ich bin neu hier und arbeite auch noch nicht so lange mit Matlab. 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?
% 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;
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.
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.
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.
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.
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.
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. 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.
% 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;
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.
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.
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');"
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.
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.
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
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.