如何在 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 以促进此操作。