【问题标题】:What is the fastest way to load multiple image tiff file in matlab?在matlab中加载多个图像tiff文件的最快方法是什么?
【发布时间】:2020-04-17 05:54:54
【问题描述】:

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

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

有没有其他更快的方法?

【问题讨论】:

    标签: image matlab


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案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 
      

      【讨论】:

      • 你能给我一个“使用 R2011a,在循环内增长数组不是问题”的参考吗?
      • @RealReza:在 2011 年的版本中,Matlab 进行了一些性能改进,包括加快循环内数组的增长:blogs.mathworks.com/steve/2011/05/16/…
      【解决方案3】:

      我遇到了同样的问题,并使用我尝试了此代码找到了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);
      

      【讨论】:

        【解决方案4】:

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

        Load multi-page TIFF stacks into Matlab fast.

        或来自文件交换:

        Fast lazy-loading of TIFF stacks.

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2023-03-25
            • 2011-06-16
            • 2013-06-08
            • 1970-01-01
            • 2011-01-07
            • 1970-01-01
            • 1970-01-01
            • 2012-09-07
            • 2010-10-24
            相关资源
            最近更新 更多