Matlab открывает только первый кадр многостраничного стека TIFF

Я создал многостраничные файлы tiff с помощью макроса в ImageJ, и теперь я пытаюсь открыть его с помощью Matlab, но я могу получить доступ только к первому кадру.

Вот результат imfinfo(имя файла). Соответственно, я получаю

length(imfinfo(filename)) = 1

Filename: [1x129 char]
              FileModDate: '28-nov-2013 12:27:51'
                 FileSize: 6.7905e+09
                   Format: 'tif'
            FormatVersion: []
                    Width: 512
                   Height: 512
                 BitDepth: 8
                ColorType: 'grayscale'
          FormatSignature: [77 77 0 42]
                ByteOrder: 'big-endian'
           NewSubFileType: 0
            BitsPerSample: 8
              Compression: 'Uncompressed'
PhotometricInterpretation: 'BlackIsZero'
             StripOffsets: 932625
          SamplesPerPixel: 1
             RowsPerStrip: 512
          StripByteCounts: 262144
              XResolution: []
              YResolution: []
           ResolutionUnit: 'None'
                 Colormap: []
      PlanarConfiguration: 'Chunky'
                TileWidth: []
               TileLength: []
              TileOffsets: []
           TileByteCounts: []
              Orientation: 1
                FillOrder: 1
         GrayResponseUnit: 0.0100
           MaxSampleValue: 255
           MinSampleValue: 0
             Thresholding: 1
                   Offset: 8
         ImageDescription: 'ImageJ=1.47q
 images=25900
 slices=25900
 loop=false

Однако, если я открою тот же файл tif в ImageJ, я смогу читать и прокручивать 25900 кадров... Странно то, что Matlab может читать предыдущий многостраничный tiff, который я создал в imageJ, без моего пакетного макроса...

Я не понимаю, что происходит... буду очень признателен за любую помощь! Спасибо, Стивен


person user3049481    schedule 29.11.2013    source источник


Ответы (2)


На самом деле это вина ImageJ. Для больших TIFF вместо использования стандарта BigTiff для сохранения стека ImageJ вместо этого сохраняет необработанный файл с фальшивым заголовком TIFF, содержащим первый кадр, и радостно называет его .tif. Вы можете обсудить с разработчиками ImageJ, почему они считают это хорошей идеей.

Чтобы прочитать эти стеки в Matlab, вы можете использовать memmapfile или MappedTensor.

person Dylan Richard Muir    schedule 30.01.2015
comment
Теперь в TIFFStack поддерживается поддельные TIF-файлы ImageJ: github.com/DylanMuir/TIFFStack. - person Dylan Richard Muir; 06.04.2016

Вы должны перебрать все изображения в стеке:

fname = 'my_file_with_lots_of_images.tif';
info = imfinfo(fname);
imageStack = [];
numberOfImages = length(info);
for k = 1:numberOfImages
    currentImage = imread(fname, k, 'Info', info);
    imageStack(:,:,k) = currentImage;
end 
person Olivier    schedule 29.11.2013
comment
Спасибо за ваш комментарий, но я уже делал это. На самом деле я понял, что эта ошибка была связана с большим размером стека tiff: всякий раз, когда он больше примерно 5 Гб, Matlab видит только первый кадр, но если я уменьшил размер, разделив файл, тогда он работает... Довольно раздражает, потому что мне пришлось переписать сценарий, но я не нашел другого решения... - person user3049481; 30.11.2013
comment
Этот процесс был бы намного быстрее при правильном предварительном распределении imageStac. Даже редактор MATLAB предупредит вас об увеличении размера матрицы внутри цикла. - person Cris Luengo; 16.12.2018