如何在 MATLAB 中将多个图像读取到一个数组中?
How do I read multiple images into an array in MATLAB?
我目前正在从事 PCA 人脸识别项目,我想知道如何将多张图像读入矩阵,然后将它们调整为 50x50。我知道我需要使用 Imread 并传入图像,然后使用 imresize。
会不会像下面这样?
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
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]);
imshow(imageArray30x40New)
这是一个好方法吗?如何正确调整图像大小?
提前致谢,
马克
根据我所处理的情况,从文件中读取多个图像的唯一方法是通过 for
循环连续读取。您目前拥有的确实是一个很好的方法,但是您需要确定如何将所有这些图像存储在 MATLAB 中。两个最简单的选项是创建一个 3D 矩阵,其中每个切片是您从文件中读取的 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
要访问第 k 个 图像,您需要执行以下操作:
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
要访问第 k 个 图像,您需要执行以下操作:
img = imageMatrix{k};
但是,如果您正在处理 PCA,那么我建议您改为创建一个 2D 矩阵,其中每个 行 是unrolled 版本的图像,您将拥有与图像一样多的行。因此,每一行都是一个 1 x 250 的强度向量。你想要这样的原因是因为如果你在 MATLAB 中使用 pca
函数,每个 row 是一个数据点,而每个 column 是一个变量。因此,您应该这样做:
%// 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的图像转化为列向量,然后转置使其成为行向量。另外,请注意我将图像矩阵设为 double 精度。我这样做是因为 pca
最适合浮点数据,所以当我将每个图像转换为行向量时,我将数据转换为 double
以促进此操作。
我目前正在从事 PCA 人脸识别项目,我想知道如何将多张图像读入矩阵,然后将它们调整为 50x50。我知道我需要使用 Imread 并传入图像,然后使用 imresize。 会不会像下面这样?
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);
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]);
imshow(imageArray30x40New)
这是一个好方法吗?如何正确调整图像大小?
提前致谢, 马克
根据我所处理的情况,从文件中读取多个图像的唯一方法是通过 for
循环连续读取。您目前拥有的确实是一个很好的方法,但是您需要确定如何将所有这些图像存储在 MATLAB 中。两个最简单的选项是创建一个 3D 矩阵,其中每个切片是您从文件中读取的 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
要访问第 k 个 图像,您需要执行以下操作:
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
要访问第 k 个 图像,您需要执行以下操作:
img = imageMatrix{k};
但是,如果您正在处理 PCA,那么我建议您改为创建一个 2D 矩阵,其中每个 行 是unrolled 版本的图像,您将拥有与图像一样多的行。因此,每一行都是一个 1 x 250 的强度向量。你想要这样的原因是因为如果你在 MATLAB 中使用 pca
函数,每个 row 是一个数据点,而每个 column 是一个变量。因此,您应该这样做:
%// 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的图像转化为列向量,然后转置使其成为行向量。另外,请注意我将图像矩阵设为 double 精度。我这样做是因为 pca
最适合浮点数据,所以当我将每个图像转换为行向量时,我将数据转换为 double
以促进此操作。