Charger et sauvegarder des images 3D

Présentation
Voici deux codes MATLAB pour charger et sauvegarder des images 3D

Ces fonctions se basent sur les fonctions imread et imwrite, de la boîte à outils "Image Processing", qu'il vous faudra donc posséder.

La fonction readstack (ou "charge pile") charge un fichier ou une succession de fichiers. La fonction permet d'importer :
  • des séries d'images numérotées en ordre croissant (img00.tif, img01.tif...), en général il suffit de donner la première image pour que toute la pile se charge
  • des images tif multi-page
  • des images stockées en "raw", dans ce cas il faut spécifier le type de données et la taille du résultat



La fonction savestack, qui sauve un tableau 3D ou 4D dans une série de fichiers. Pour écrire dans une série de fichier, on passe soit par une chaîne de la forme "img%03d.tif", soit par une succession de caractères "#" ou "?", qui seront remplacés par des chiffres.

Les deux fonctions permettent de travailler avec des images en niveaux de gris (les images sont des tableaux 3D Ny-Nx-Nz), ou des images couleurs (dans ce cas les images sont des tableaux 4D Ny-Nx-3-Nz).
Téléchargement
Compatibilité
Linux Mac Windows
0  0 
Téléchargé 37 fois Voir le commentaire
Détails
Catégories : Images et videos
Avatar de Kangourou
Membre éclairé
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 14 avril 2013




Avatar de Jerome Briot Jerome Briot - Rédacteur/Modérateur https://www.developpez.com
le 31/03/2011 à 10:33
Quelques remarques...

Les codes que tu présentes ici ne sont pas identiques à ceux présents dans l'archive zip.

Pour readstack :

Ajoute la ligne suivante au tout début de ton code :

Code : Sélectionner tout
error(nargchk(1,5,nargin)); % Vérifier le 5
TYPE est déjà un nom de fonction MATLAB, change le ici (et par la suite) :
Code : Sélectionner tout
type = varargin{1};
Ligne 115, il y a un FOPEN sans FCLOSE correspondant.

Ensuite :

Code : Sélectionner tout
if length(size(img))==2
s'écrit plus proprement :

Code : Sélectionner tout
if ndims(img)==2
Le code en commentaire à partir de la ligne 255 ne sert à rien

Code : Sélectionner tout
string = [basename sprintf('%%0%dd', n)  endname];
vu que tu utilises SPRITNF, s'écrit plus logiquement :

Code : Sélectionner tout
string = sprintf('%s%%0%dd%s',basename, n, endname);
Code : Sélectionner tout
1
2
3
	len = length(fname); 
    basename = fname(1:index-1); 
    endname = fname(index+n:len);
devient simplement :

Code : Sélectionner tout
1
2
    basename = fname(1:index-1); 
    endname = fname(index+n:end);
Code : Sélectionner tout
index = index(length(index));
devient

Code : Sélectionner tout
index = index(end);
Pour finir, tu devrais récupérer l'extension des fichiers d'entrée avec FILEPARTS pour la passer ensuite dans IMREAD. Ce sera plus rapide.

Pour savestack

Ajoute la ligne suivante au tout début de ton code :

Code : Sélectionner tout
error(nargchk(1,4,nargin)); % Vérifier le 4
Il faut aussi ajouter un test sur le format d'image demandé en sortie car tous n'ont pas l'argument 'WriteMode' de IMWRITE (gif, tiff et hdf seulement)

Code : Sélectionner tout
1
2
3
4
5
pos = strfind(fname, '?'); 
npos = length(pos); 
if npos>0 
    fname = strrep(fname, repmat('?', [1 npos]), ['%0' num2str(npos) 'd']); 
end
s'écrit plus efficacement :

Code : Sélectionner tout
1
2
3
4
5
pos = strfind(fname, '?'); 
if ~isempty(pos) 
    npos = length(pos); 
    fname = strrep(fname, repmat('?', [1 npos]), ['%0' num2str(npos) 'd']); 
end
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Contacter le responsable de la rubrique MATLAB