我目前正在开展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)
这是一个好方法吗?我将如何正确调整图像大小?
提前致谢, 标记
答案 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
以促进这一点。