如何在 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 中将多个图像读入一个数组?的主要内容,如果未能解决你的问题,请参考以下文章