2015-04-06 142 views
0

我目前正在研究PCA人脸识别项目,我想知道如何将多个图像读入矩阵,然后将其大小调整为50x50。我知道我需要使用Imread并传入图像,然后使用imresize。 它会像下面这样吗?如何在MATLAB中将多个图像读入数组?

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 

要访问第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,那么我建议你做的,而不是创建一个二维矩阵其中每个展开版本的图像和d您将拥有与图像一样多的行。因此,每行将是一个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图像转换为列向量,然后对其进行转置以使其成为行向量。另外,请注意,我制作了图像矩阵双精度。我这样做是因为pca最适合用于浮点数据,所以当我将每个图像转换成一个行向量时,我已经将数据转换为double以便于实现。