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



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

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

还有其他更快的方法吗?

IMREAD的TIFF特定语法列表对'Info'参数表示如下:

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

结合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

您可能需要预先分配阵列Movie(或使用R2011a,在循环中增加阵列不太成问题)

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

我遇到了同样的问题,并在尝试此代码时发现了这个问题。我得到的时间和他不一样,但它仍然比其他图像格式好得多。对于最后一种方法,您应该在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:ntt%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:ntt%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:ntt%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);

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

将多页TIFF堆栈快速加载到Matlab中。

或从文件交换:

TIFF堆栈的快速延迟加载。

我发现避免使用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

最新更新