在matlab中加载多个图像tiff文件的最快方法是什么?

时间:2011-05-27 20:55:52

标签: image matlab

我有一个多图像tiff文件(例如3000帧),并希望将每个图像加载到matlab(我现在使用的是2010a)。但我发现随着帧的索引增加,读取图像需要更长的时间。以下是我现在使用的代码

   for i=1:no_frame;
   IM=imread('movie.tif',i);
   IM=double(IM);
   Movie{i}=IM;    
   end 

还有其他方法可以更快地完成吗?

5 个答案:

答案 0 :(得分:3)

TIFF-specific syntax list for IMREAD'Info'参数说明了以下内容:

  

从多图像中读取图像时   TIFF文件,传递输出   imfinfo作为'Info'的值   参数帮助imread定位   文件中的图像更快。

结合preallocation of the cell array suggested by Jonas,这可以加快你的速度:

fileName = 'movie.tif';
tiffInfo = imfinfo(fileName);  %# Get the TIFF file information
no_frame = numel(tiffInfo);    %# Get the number of images in the file
Movie = cell(no_frame,1);      %# Preallocate the cell array
for iFrame = 1:no_frame
  Movie{iFrame} = double(imread(fileName,'Index',iFrame,'Info',tiffInfo));
end

答案 1 :(得分:2)

你可能想要预先分配数组Movie(或使用R2011a,在循环中增长数组不是问题)

Movie = cell(no_frame,1);
for i=1:no_frame;
   IM=imread('movie.tif',i);
   IM=double(IM);
   Movie{i}=IM;    
end 

答案 2 :(得分:0)

我遇到了同样的问题并发现this使用了我尝试过的代码。我得到的时间与他不同,但它仍然比其他图像格式好得多。要使用最后一个方法,您应该在matlab目录中找到tifflib.mexa64并将其复制到工作目录中。

FileTif='myfile.tif';
InfoImage=imfinfo(FileTif);
mImage=InfoImage(1).Width;
nImage=InfoImage(1).Height;
NumberImages=length(InfoImage);

t=zeros(1,1000);

FinalImage=zeros(nImage,mImage,3,NumberImages,'uint8');
for i=1:NumberImages
tic 
FinalImage(:,:,:,i)=imread(FileTif,'Index',i);
t(i)=toc;
end
%disp(sprintf('test1 timing result:\n\t\t%d',toc));
mean(t)
clear

%%

FileTif='myfile.tif';
InfoImage=imfinfo(FileTif);
mImage=InfoImage(1).Width;
nImage=InfoImage(1).Height;
NumberImages=length(InfoImage);
FinalImage=zeros(nImage,mImage,3,NumberImages,'uint8');

t=zeros(1,1000);
for i=1:NumberImages
   tic
FinalImage(:,:,:,i)=imread(FileTif,'Index',i,'Info',InfoImage);
t(i) = toc;
end
%disp(sprintf('test2 timing result:\n\t\t%d',toc));
mean(t)
clear

%%

FileTif='myfile.tif';
InfoImage=imfinfo(FileTif);
mImage=InfoImage(1).Width;
nImage=InfoImage(1).Height;
NumberImages=length(InfoImage);
FinalImage=zeros(nImage,mImage,3,NumberImages,'uint8');

t=zeros(1,1000);

TifLink = Tiff(FileTif, 'r');
for i=1:NumberImages
tic
TifLink.setDirectory(i);
FinalImage(:,:,:,i)=TifLink.read();
t(i) = toc;
end
TifLink.close();

%disp(sprintf('test3 timing result:\n\t\t%d',toc));
mean(t)
clear

%%


FileTif='myfile.tif';
InfoImage=imfinfo(FileTif);
mImage=InfoImage(1).Width;
nImage=InfoImage(1).Height;
NumberImages=length(InfoImage);
FinalImage=zeros(nImage,mImage,3,NumberImages,'uint8');
FileID = tifflib('open',FileTif,'r');
rps = tifflib('getField',FileID,Tiff.TagID.RowsPerStrip);
 t=zeros(1,1000);
for i=1:NumberImages

tic
tifflib('setDirectory',FileID,i);
% Go through each strip of data.
rps = min(rps,nImage);
for r = 1:rps:nImage
  row_inds = r:min(mImage,r+rps-1);
  stripNum = tifflib('computeStrip',FileID,r);
  FinalImage(row_inds,:,:,i) = tifflib('readEncodedStrip',FileID,stripNum);
end
t(i)=toc;
end
mean(t)
tifflib('close',FileID);

答案 3 :(得分:0)

我写了一个Matlab类来高效快速地读取TIFF堆栈。

Load multi-page TIFF stacks into Matlab fast.

或来自文件交换:

Fast lazy-loading of TIFF stacks.

答案 4 :(得分:0)

我发现避免使用imread的速度要快得多。试试这个:

function data = FastTiff(filename) warning('off','all') % Suppress all the tiff warnings tstack = Tiff(filename); [I,J] = size(tstack.read()); K = length(imfinfo(filename)); data = zeros(I,J,K); data(:,:,1) = tstack.read(); for n = 2:K tstack.nextDirectory() data(:,:,n) = tstack.read(); end warning('on','all') end