2016-08-24 6 views
0

У меня есть код здесь.Прочитайте изображения из подпапок и сохраните их в другой папке

start_path = fullfile(matlabroot, '\toolbox\images\imdemos'); 
% Ask user to confirm or change. 
topLevelFolder = uigetdir(start_path); 
if topLevelFolder == 0 
    return; 
end 
% Get list of all subfolders. 
allSubFolders = genpath(topLevelFolder); 
% Parse into a cell array. 
remain = allSubFolders; 
listOfFolderNames = {}; 
while true 
    [singleSubFolder, remain] = strtok(remain, ';'); 
    if isempty(singleSubFolder) 
     break; 
    end 
    listOfFolderNames = [listOfFolderNames singleSubFolder]; 
end 
numberOfFolders = length(listOfFolderNames) 

% Process all image files in those folders. 
for k = 1 : numberOfFolders 
    % Get this folder and print it out. 
    thisFolder = listOfFolderNames{k}; 
    fprintf('Processing folder %s\n', thisFolder); 

    % Get PNG files. 
    filePattern = sprintf('%s/*.png', thisFolder); 
    baseFileNames = dir(filePattern); 
    % Add on TIF files. 
    filePattern = sprintf('%s/*.tif', thisFolder); 
    baseFileNames = [baseFileNames; dir(filePattern)]; 
    % Add on JPG files. 
    filePattern = sprintf('%s/*.jpg', thisFolder); 
    baseFileNames = [baseFileNames; dir(filePattern)]; 
    numberOfImageFiles = length(baseFileNames); 
    % Now we have a list of all files in this folder. 

    if numberOfImageFiles >= 1 
     % Go through all those image files. 
     for f = 1 : numberOfImageFiles 
      fullFileName = fullfile(thisFolder, baseFileNames(f).name); 
    pathname = strcat('C:\\xampp\\htdocs\\PACS_Client\\cbir_matlab\\ano\\'); 
    outputBaseFileName = sprintf('%3.3d.jpg',f); 
    outputFullFileName = fullfile(pathname, outputBaseFileName); 

    fprintf('Processing image file %s\n', fullFileName); 
    im=imread(fullFileName); 
    imshow(im); 
    data = im; 
    imwrite(data,[pathname,outputBaseFileName]); 
     end 
    else 
     fprintf('  Folder %s has no image files in it.\n', thisFolder); 
    end 
end 

я пытался сохранить все изображения из вложенных папок в другую folder.But не мог получить все images.Only несколько номеров изображений являются saved.I хочет сохранить все images.can кто-нибудь помочь мне с этот код?

+0

Какие изображения отсутствуют? все ли они в одном каталоге или в разных? сколько папок есть? – Finn

+0

Есть 4 подпапки в основной папке. Каждый из подпапок имеет много images.i может сохранить только изображения, которые находятся в первой подпапке – Jury

+0

Я хочу сохранить все изображения в подпапках в одну папку – Jury

ответ

1

Я немного уточнил ваш код, пожалуйста, проверьте, работает ли это для вас. Одной из проблем является ваше базовое имя файла всегда «% 3.3d.jpg», поэтому каждая фотография будет «.jpg», даже если ее нет. Также вы загружаете и показываете изображения, но вам нужно их скопировать, поэтому вы можете пойти за copyfile. 3rd вы всегда устанавливаете каждое изображение 001.jpg, которое перезапишет последний 001.jpg из предыдущей папки. вам нужно добавить номер, чтобы следующая папка начиналась с более высоких чисел.

start_path = fullfile(matlabroot, '\toolbox\images\imdemos'); 
% Ask user to confirm or change. 
topLevelFolder = uigetdir(start_path); 
if topLevelFolder == 0 
    return; 
end 
%dir where everything should go. if the destination is not the 
%topLevelFolder 
%destinationpath = strcat('D:\\pics\\'); 
destinationpath = topLevelFolder; 

% Get list of all subfolders. 
allSubFolders = genpath(topLevelFolder); 
% Parse into a cell array. 
remain = allSubFolders; 
listOfFolderNames = {}; 
%while true 
% [singleSubFolder, remain] = strtok(remain, ';'); 
% if isempty(singleSubFolder) 
%  break; 
% end 
% listOfFolderNames = [listOfFolderNames singleSubFolder]; 
%end 
%your while worked fine, but try to avoid 'while true' with break 
for i=1:sum(strfind(allSubFolders,';')) 
[singleSubFolder, remain] = strtok(remain, ';'); 
listOfFolderNames = [listOfFolderNames singleSubFolder]; 
end 
numberOfFolders = length(listOfFolderNames) 

%set inital count 
picturecount=0; 
% Process all image files in those folders. 
for k = 1 : numberOfFolders 
    % Get this folder and print it out. 
    thisFolder = listOfFolderNames{k}; 
    fprintf('Processing folder %s\n', thisFolder); 

    % Get PNG files. 
    filePattern = sprintf('%s/*.png', thisFolder); 
    baseFileNames = dir(filePattern); 
    % Add on TIF files. 
    filePattern = sprintf('%s/*.tif', thisFolder); 
    baseFileNames = [baseFileNames; dir(filePattern)]; 
    % Add on JPG files. 
    filePattern = sprintf('%s/*.jpg', thisFolder); 
    baseFileNames = [baseFileNames; dir(filePattern)]; 
    numberOfImageFiles = length(baseFileNames); 
    % Now we have a list of all files in this folder. 

    if numberOfImageFiles >= 1 
     % Go through all those image files. 
     for f = 1 : numberOfImageFiles 
       fullFileName = fullfile(thisFolder, baseFileNames(f).name); 
       [~,~,ext] = fileparts(baseFileNames(f).name); %get extension 
       outputBaseFileName = sprintf(['%3.3d' ext],f+picturecount);%create name based on picturecount 
       outputFullFileName = fullfile(destinationpath, outputBaseFileName); 

       %fprintf('Processing image file %s\n', fullFileName); 
       %im=imread(fullFileName); 
       %imshow(im); 
       %data = im; 
       %imwrite(data,[pathname,outputBaseFileName]); 
       %you dont need it in matlab just copy the file 
       copyfile(fullFileName,outputFullFileName); 
     end 
     picturecount=picturecount+numberOfImageFiles;%set picturecount for next k 
    else 
     fprintf('  Folder %s has no image files in it.\n', thisFolder); 
    end 
end 
+0

Большое спасибо .. Этот код отлично работает ... Спасибо за помощь! – Jury

0

Проблема в baseFileNames = dir(filePattern), где вы сбросите список каждый раз, когда цикл находится в новой папке. Вот почему в конце вы будете иметь только изображения последней папки. Просто добавьте baseFileNames = [] непосредственно перед циклом for, а затем замените baseFileNames = dir(filePattern) на baseFileNames = [baseFileNames; dir(filePattern)].

+0

выход из dir является структурой в моей версии Matlab, и эта часть работает – Finn

+0

Спасибо. Я попытался с этим. Но все же я не могу получить все изображения. У меня есть 3 подпапки с именами folder1, folder2, folder3. Он сохраняет только папку 3 изображений. – Jury

+0

Вы правы @ Финн, я ошибся. – erfan

Смежные вопросы