2010-06-15 5 views
2

Je dois exécuter un algorithme de traitement d'image sur de nombreuses images dans un répertoire.Comment indiquer MATLAB pour ouvrir et enregistrer des fichiers spécifiques dans le même répertoire

Une image est enregistrée sous la forme name_typeX.tif. Il existe donc X types d'images différents pour un nom donné.

L'algorithme de traitement d'image prend une image d'entrée et sort un résultat d'image.

Je dois enregistrer ce résultat sous la forme name_typeX_number.tif, où number est également une sortie de l'algorithme pour une image donnée.

maintenant ..

Comment puis-je dire Matlab pour ouvrir un fichier typeX spécifique? Notez également qu'il existe d'autres fichiers non-tif dans le même répertoire.

Comment sauvegarder le résultat sous name_typeX_number.tif?

Les résultats doivent être sauvegardés dans le même répertoire où les images d'entrée sont présentes. Comment puis-je dire à MATLAB de ne pas traiter les résultats qui ont été enregistrés en tant qu'images d'entrée?

Je dois exécuter ceci comme code d'arrière-plan sur un serveur ... ainsi aucune entrée d'utilisateur permise.

Répondre

3

Il semble que vous vouliez obtenir tous les fichiers dans un répertoire dont les noms correspondent à un certain format, puis les traiter tous automatiquement. Vous pouvez le faire en utilisant la fonction DIR pour obtenir une liste de noms de fichiers dans le répertoire courant, puis en utilisant la fonction REGEXP pour trouver les noms de fichiers qui correspondent à un certain modèle. Voici un exemple:

fileData = dir();    %# Get a structure of data for the files in the 
           %# current directory 
fileNames = {fileData.name}; %# Put the file names in a cell array 
index = regexp(fileNames,...     %# Match a file name if it begins 
       '^[A-Za-z]+_type\d+\.tif$'); %# with at least one letter, 
              %# followed by `_type`, followed 
              %# by at least one number, and 
              %# ending with '.tif' 
inFiles = fileNames(~cellfun(@isempty,index)); %# Get the names of the matching 
               %# files in a cell array 

Une fois que vous avez un réseau de cellules de fichiers dans inFiles qui correspond au modèle de nom que vous voulez, vous pouvez faire une boucle sur les fichiers et effectuer votre traitement. Par exemple, votre code pourrait ressembler à ceci:

nFiles = numel(inFiles); %# Get the number of input files 
for iFile = 1:nFiles  %# Loop over the input files 
    inFile = inFiles{iFile}; %# Get the current input file 
    inImg = imread(inFile); %# Load the image data 
    [outImg,someNumber] = process_your_image(inImg); %# Process the image data 
    outFile = [strtok(inFile,'.') ... %# Remove the '.tif' from the input file, 
      '_' ...     %# append an underscore, 
      num2str(someNumber) ... %# append the number as a string, and 
      '.tif'];     %# add the `.tif` again 
    imwrite(outImg,outFile); %# Write the new image data to a file 
end 

L'exemple ci-dessus utilise les fonctions NUMEL, STRTOK, NUM2STR, IMREAD et IMWRITE.

+0

Merci gnovice! Sur la ligne 3 index = regexp (fileNames, '[A-Za-z] + _ type \ d + \ .tif'); Et si je veux que le numéro soit 1, 2 et 5 (au lieu de tous les autres numéros disponibles). Je n'ai pas encore couru votre code .. occupé à googler toutes les fonctions que vous avez utilisées: P mais est la partie "+" du code? –

+1

@ its-me: Si vous voulez faire correspondre * seulement un * des nombres 1, 2 ou 5 après le mot 'type', vous pouvez supprimer le' \ d + 'et le remplacer par' [125] '. Le '+ 'est un quantificateur indiquant que le ou les caractères précédents doivent être appariés 1 fois ou plus. J'ai également ajouté des liens supplémentaires pour la documentation de la fonction à ma réponse. – gnovice

+0

Réponse parfaite! –

Questions connexes