1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
function img = readstack(fname, varargin)
%READSTACK Read either a list of 2D images (slices), or a 3D image
%
% Syntax
% IMG = readstack(FNAME)
% IMG = readstack(FNAME, INDICES)
% IMG = readstack(FNAME, TYPE, DIM)
%
% Description
%
% IMG = readstack(FNAME)
% FNAME is the base name of the image.
% In the case of a bundle image, this is simply the name of the file.
% In the case of an image stored as several slices, this is the string
% common to each file with wildcard '#', '?' or '0' at the position of
% the slices indices.
% IMG is a 3-dimensional array of type uint8, size: X*Y*Z;
% or a 4 dimensional array for color images (X*Y*3*Z).
%
% IMG = readstack(FNAME, INDICES)
% forces the number of dimensions of resulting array (slices images)
% FNAME: base filename of images, without end number (string)
% INDICES: indices of images to put for result. Ex: [0:39]
%
% IMG = readstack(FNAME, TYPE, DIM)
% forces the type and number of dimensions of resulting array.
% FNAME: name of the single stack file
% TYPE: matlab type of data ('uint8', 'double'...)
% DIM: size of final stack. Ex : [256 256 50].
% There is no support for binary raw stacks.
%
% Examples:
% IMG = readstack('images???.tif');
% IMG = readstack('aStack.tif');
% IMG = readstack('files00.bmp');
% IMG = readstack('files00.bmp', 5:23);
% IMG = readstack('files00slices##.tif');
% IMG = readstack('rawData.raw', 'uint8', [256 256 50]);
%
% See also:
% savestack, imread
%
% ---------
% author: David Legland, david.legland(at)grignon-dot-inra.fr
% created the 10/09/2003.
%% import a raw file.
% First argument is type of image ('uint8' usually),
% and second argument contains size of image to load.
if length(varargin)>1
type = varargin{1};
dim = varargin{2};
img = zeros(dim, type);
f = fopen(fname, 'r');
img(:) = fread(f, dim(1)*dim(2)*dim(3), ['*' type]);
return;
end
% check if image stored in one bubndle file or as several stacks
bundle = sum(ismember('#?', fname))==0;
if exist(fname, 'file')
bundle = length(imfinfo(fname))>1;
end
if ~bundle
% images stored in several 2D files ------------------------
% -> need to know numbers of slices to read.
%% Compute the base name of the image, by removing '#', '?' or '0'
% characters to replace with numbers
chars = '#?0';
index = [];
for c=1:length(chars)
% identify number of chars in file name
n=5;
while isempty(index) && n>1
n = n-1;
index = strfind(fname, repmat(chars(c), [1 n]));
end
% escape if special characters has been found
if ~isempty(index)
break;
end
end
% In the case of several '00' parts, consider only the last one
index = index(length(index));
% create file basename and endname
len = length(fname);
basename = fname(1:index-1);
endname = fname(index+n:len);
%% compute indices of slices to read
if ~isempty(varargin)
% slice indices are given as parameters
range=varargin{1};
else
% identify slices to read by detecting last index of slices
i=0;
while true
% check existence of file for given index
imgname = sprintf(['%s' sprintf('%%0%dd', n) '%s'], basename, i, endname);
if ~exist(imgname, 'file')
break;
end
i = i+1;
end
% read slices from the first one to the last existing one
range = 0:i-1;
end
%% Read each slice of the image
% read slice for each range index
string = [basename sprintf('%%0%dd', n) endname];
% adapt filename format to windows if needed
if ispc
string = strrep(string, '\', '\\');
end
% read the first image
img = imread(sprintf(string, range(1)));
% read each image one after the other
if length(size(img))==2
% allocate memory
img(1, 1, length(range))=0;
% read each gray scale image successively
for i=2:length(range)
img(:,:,i) = imread(sprintf(string, range(i)));
end
else
% pre-allocate memory
img(1, 1, 1, length(range))=0;
% read each color image successively
for i=2:length(range)
img(:,:,:,i) = imread(sprintf(string, range(i)));
end
end
else
% Image stored in one bundle file --------------------------
% get image dimensions
info = imfinfo(fname);
% If input argument is found, it is used as the number of slices to
% read. Anyway, read all the slices.
range = 1:length(info);
if ~isempty(varargin)
range = varargin{1};
end
% read each slice of the 3D image
img = imread(fname, range(1));
if length(size(img))==2 % read gray scale images -----
% pre-allocate memory
img(1, 1, length(range)) = 0;
% add each slice successively
for i=2:length(range)
img(:,:,i) = imread(fname, range(i));
end
else % read color images -----
% pre-allocate memory
img(1, 1, 1, length(range)) = 0;
% add each slice successively
for i=2:length(range)
img(:,:,:,i) = imread(fname, range(i));
end
end
end |
Partager