Из того, с чем я имел дело, единственный способ прочитать несколько изображений из файла - сделать это последовательно и через цикл for
. То, что у вас есть в настоящее время, действительно является хорошим подходом, но вам нужно определить, как вы хотите хранить все эти изображения в MATLAB. Двумя самыми простыми вариантами было бы создание трехмерной матрицы, где каждый фрагмент представляет собой изображение 50 x 50, которое вы читаете из файла, или массив ячеек, где каждая ячейка представляет собой изображение 50 x 50.
Если вы хотите сделать первый вариант, вы должны сделать что-то вроде этого:
%// Your code
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
%// New - 3D matrix to store images
imageMatrix = uint8(zeros(50,50,numel(jpegFiles)));
%// Your code
for k = 1:length(jpegFiles)
baseFileName = jpegFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
imageArray50x50 = imread(fullFileName);
imageArray50x50New = imresize(imageArray50x50, [50 50]);
%// New
imageMatrix(:,:,k) = imageArray50x50New;
end
Чтобы получить доступ к th изображению, вы должны сделать:
img = imageMatrix(:,:,k);
Приведенный выше код предполагает, что все ваши изображения имеют тип uint8
. Если это не тот случай, когда ваши изображения относятся к разным типам, предпочтительнее использовать подход с массивом ячеек.... так что это будет второй подход. Если это так, то сделайте это вместо этого:
%// Your code
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
%// New - 3D matrix to store images
imageMatrix = cell(1,numel(jpegFiles));
%// Your code
for k = 1:length(jpegFiles)
baseFileName = jpegFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
imageArray50x50 = imread(fullFileName);
imageArray50x50New = imresize(imageArray50x50, [50 50]);
%// New
imageMatrix{k} = imageArray50x50New;
end
Чтобы получить доступ к th изображению, вы должны сделать:
img = imageMatrix{k};
Однако, если вы имеете дело с PCA, то вместо этого я предлагаю вам создать 2D-матрицу, где каждая строка представляет собой развернутую версию изображение, и у вас будет столько строк, сколько у вас есть изображений. Следовательно, каждая строка будет представлять собой вектор интенсивности 1 x 250. Причина, по которой вам это нужно, заключается в том, что если бы вы использовали функцию pca
в MATLAB, каждая строка была бы точкой данных, а каждый столбец — переменной. Поэтому вы бы сделали это вместо этого:
%// Your code
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
%// New - 3D matrix to store images
imageMatrix = zeros(numel(jpegFiles), 250);
%// Your code
for k = 1:length(jpegFiles)
baseFileName = jpegFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
imageArray50x50 = imread(fullFileName);
imageArray50x50New = imresize(imageArray50x50, [50 50]);
%// New
imageMatrix(k,:) = double(imageArray50x50New(:).');
end
Следовательно, каждая строка будет изображением, представленным в виде одного вектора. Этот оператор: imageArray50x50New(:).'
сначала преобразует изображение 50 x 50 в вектор-столбец, затем оно транспонируется так, чтобы оно стало вектором-строкой. Также обратите внимание, что я сделал матрицу изображения с двойной точностью. Я сделал это, потому что pca
лучше всего подходит для данных с плавающей запятой, и поэтому, когда я преобразовывал каждое изображение в вектор-строку, я приводил данные к double
, чтобы облегчить это.
06.04.2015