如何在 MATLAB 中将多个图像读入一个数组?

Posted

技术标签:

【中文标题】如何在 MATLAB 中将多个图像读入一个数组?【英文标题】:How do I read multiple images into an array in MATLAB? 【发布时间】:2015-06-10 12:25:16 【问题描述】:

我目前正在从事 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) 

这是一个好方法吗?如何正确调整图像大小?

提前致谢, 标记

【问题讨论】:

【参考方案1】:

根据我的处理,从文件中读取多个图像的唯一方法是通过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

要访问第 kth 个图像,您可以:

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
    imageMatrixk = imageArray50x50New;
end

要访问第 kth 个图像,您可以:

img = imageMatrixk;

但是,如果您正在处理 PCA,那么我建议您改为创建一个 2D 矩阵,其中每个 展开的 > 版本的图像,您将拥有与图像一样多的行。因此,每一行都是一个 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 以方便此操作。

【讨论】:

以上是关于如何在 MATLAB 中将多个图像读入一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在matlab中将两个图叠加到一起?

将 PHP Div 值读入 $variable 并在 Javascript 中将上传文件的文件名读入数组

如何在MATLAB中读入多个音频文件啊?

matlab如何把读入的数弄成数组?

如何在 MATLAB 中将彩色图像转换为灰度图像?

C++ 如何将输入的数读入数组