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

xfyts7mz  于 2023-06-30  发布在  Matlab
关注(0)|答案(1)|浏览(366)

我目前正在进行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)

这是一个好方法吗?如何正确调整图像大小?
先谢谢你,马克

zzoitvuj

zzoitvuj1#

从我所处理的内容来看,从文件中读取多个图像的唯一方法是通过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矩阵,其中每个是图像的展开版本,你会有尽可能多的行,因为你有图像。因此,每一行将是I X 2500强度向量。你想要这样的原因是因为如果你要在MATLAB中使用pca函数,每一行是一个数据点,而每一列是一个变量。因此,您可以这样做:

%// Your code
myFolder = 'C:\Users\X';
filePattern = fullfile(myFolder, '*.jpg');
jpegFiles = dir(filePattern);

%// New - 3D matrix to store images
imageMatrix = zeros(numel(jpegFiles), 2500);

%// 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以便于此。

相关问题