Какой самый быстрый способ загрузить несколько изображений TIFF в Matlab? - PullRequest
4 голосов
/ 28 мая 2011

У меня есть несколько файлов изображений (например, 3000 кадров), и я хочу загрузить каждое изображение в Matlab (сейчас я использую 2010a). Но я обнаружил, что чтение изображений занимает больше времени, так как увеличивается индекс кадра. Ниже приведен код, который я использую сейчас

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

Есть ли другой способ сделать это быстрее?

Ответы [ 4 ]

3 голосов
/ 28 мая 2011

Список синтаксиса, специфичный для TIFF для IMREAD , говорит о следующем для параметра 'Info':

При чтении изображений из файла TIFF с несколькими изображениями, передавая выходные данныеimfinfo, поскольку значение аргумента 'Info' помогает imread быстрее находить изображения в файле.

В сочетании с Предварительное выделение массива ячеек, предложенное Джонасом , это должно ускорить процесс:

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
2 голосов
/ 28 мая 2011

Возможно, вы захотите предварительно назначить массив Movie (или использовать R2011a, где рост массива внутри цикла не так уж важен)

Movie = cell(no_frame,1);
for i=1:no_frame;
   IM=imread('movie.tif',i);
   IM=double(IM);
   Movie{i}=IM;    
end 
0 голосов
/ 27 января 2015

Я написал класс Matlab для эффективного и быстрого чтения стеков TIFF.

Загрузка многостраничных стеков TIFF в Matlab fast.

или из обмена файлами:

Быстрая отложенная загрузка стеков TIFF.

0 голосов
/ 12 ноября 2012

У меня была такая же проблема, и я нашел этот , используя этот код. Я получаю другое время, чем он, но это все же намного лучше, чем другие форматы изображений. Чтобы последний метод работал, вы должны найти tifflib.mexa64 в вашем каталоге Matlab и скопировать его в свой рабочий каталог.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...