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

时间:2015-04-06 04:59:50

标签: image matlab image-processing pca face-recognition

我目前正在开展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 个答案:

答案 0 :(得分: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

要访问k th 图像,您可以执行以下操作:

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 th 图像,您可以执行以下操作:

img = imageMatrix{k};

但是,如果你正在处理PCA,那么我建议你做的是创建 2D矩阵,其中每个展开图像的版本,您将拥有与图像一样多的行。因此,每行将是1×250的强度矢量。您之所以想要这样,是因为如果您在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), 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以促进这一点。