2015-04-06 143 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以便於實現。