2017-02-14 3 views
2

Я занимаюсь обработкой изображений на проекционных изображениях компьютерной томографии. Исходное изображение представляет собой .tiff выход CT-machine. Я импортирую его в Matlab, где обрабатываю его и сохраняю выводное изображение с помощью imwrite().Скрытый бренд TIFF Matlab?

Программное обеспечение, которое я использую для реконструирования CT-изображений, является патентованным, но поддерживает восстановление любых изображений .tiff, если они соответствуют определенному стандарту. По-видимому, Matlab не следует этому стандарту, поскольку он, кажется, отражает все .tiff-изображения, которые он сохраняет в некотором роде. Я могу обойти это, загрузив все изображения третьим программным обеспечением и снова сохраним их, что, похоже, стирает тег и позволяет восстановить. Это утомительно и требует много времени, поскольку мне придется делать это несколько раз в день.

Я попытался загрузить как обычный, так и «очищенный» .tiff, используя класс Matlab Tiff. Я просмотрел все поля в структуре вручную и не нашел никакой разницы, хотя другой не будет загружаться в CT-программу, а другой - в порядке.

Есть ли скрытый способ, которым Matlab каким-то образом маркирует эти изображения? Возможно ли очистить эти изображения внутри Matlab?

+2

В процессе работы ** ImageMagick ** игнорирует или подавляет нежелательные теги TIFF, и вы можете запланировать повторную запись нескольких изображений TIFF параллельно в простом скрипте. Кроме того, вы можете использовать свою программу 'ident' для проверки ваших файлов и посмотреть, что такое * брендинг *, - используйте' ident-overbose someImage.tif', или если у вас есть v7 или более новый, префикс этой команды с помощью 'magick ... ' –

+1

Если вы устанавливаете' libtiff' - что я делаю на Mac, используя ** homebrew ** - вы получаете программу под названием 'tiffdump', которая также расскажет вам все, что вы когда-либо хотели узнать о файлах TIF. –

+2

Если проприетарное программное обеспечение - это то, что ограничивает ваше исследование, у вас всегда есть другой вариант: с открытым исходным кодом. Существует много свободного программного обеспечения для реконструкции 2D CT и для 3D-реконструкции (я предполагаю, что это ваш случай, потому что '.tif') ASTRA и TIGRE, я считаю, отличные варианты. Оба могут восстанавливать изображения с компьютеров CT. Отказ от ответственности: я запрограммировал TIGRE. –

ответ

3

Я не могу быть абсолютно уверен, но маловероятно, что Matlab добавляет скрытый бренд.

В соответствии со стандартом tiff, добавив скрытый бренд в файл tif, не приведет к сбою программы чтения tiff.

См Частных тегов раздела:

Разработчики могут применять для блока «частных тегов», чтобы они могли включать свою собственную конфиденциальную информацию внутри файла TIFF, не вызывая проблемы для обмена файлов. TIFF читатели должны игнорировать тег, которые они не распознают, и частные тег зарегистрированного разработчика гарантируется не конфликтовать с кем-то еще тегами или со стандартным набором тегов, определенных в спецификации ...

Это выглядит как программное обеспечение CT-изображений, которое вы используете, не соответствует стандарту tiff.

Это может быть (но маловероятно), что программное обеспечение соответствует более старой версии tiff (версия 5.0 вместо версии 6.0).

Одной из причин отказа может быть то, что Matalb создает очень большие полосы и не соответствует рекомендациям 8K байтов.
Обратитесь к https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf:

Использование одной полосы не рекомендуется. Выберите RowsPerStrip таким образом, чтобы каждая полоса была около 8K байтов, даже если данные не сжаты, так как она делает буферизацию более простой для читателей. Значение «8K» довольно произвольно, но, похоже, работает хорошо.

Проверьте следующий код (я отправил here):

%Simulate large image (to be saved as tiff later) 
I = imread('peppers.png'); 
I = repmat(I, [4, 4]); 

t = Tiff('I.tif', 'w'); 

width = size(I, 2); 
height = size(I, 1); 
rows_per_strip = 1; %Select 1 row per strip (assume image row is less then 8K bytes). 

setTag(t, 'ImageLength', height) 
setTag(t, 'ImageWidth', width) 
setTag(t, 'Photometric', Tiff.Photometric.RGB) 
setTag(t, 'BitsPerSample', 8) 
setTag(t, 'SamplesPerPixel', 3) 
setTag(t, 'RowsPerStrip', rows_per_strip) 
setTag(t, 'PlanarConfiguration', Tiff.PlanarConfiguration.Chunky) 
%setTag(t, 'Compression', Tiff.Compression.LZW) 
setTag(t, 'Compression', Tiff.Compression.None) %Try without compression 

n_strips = ceil(height/rows_per_strip); %Total number of strips. 

h = waitbar(0, 'In process'); 

%Write the tiff image strip by strip (and advance the waitbar). 
for i = 1:n_strips 
    y0 = (i-1)*rows_per_strip + 1; %First row of current strip. 
    y1 = min(y0 + rows_per_strip - 1, height); %Last row of current strip. 
    writeEncodedStrip(t, i, I(y0:y1, :, :)) %Write strip rows y0 to y1. 
    waitbar(i/n_strips, h); %Update waitbar. 
    drawnow %Force GUI refresh. 
end 

close(t) 
close(h) 

Там может быть много других причин для отказа, потому что формат TIFF очень сложно (особенно со стороны читателя).

+0

Я пробовал ваш код, это не помогло. Я думаю, вы, вероятно, правы в том, что проблема в конце CT-программного обеспечения. – Tapio

+0

На самом деле, да. Я нашел еще одну программу, которая неправильно отображала бы imwrite() -tiffs. Я расстроился и решил попробовать еще раз, и заметил, что я ошибся в коде в последний раз. Использование вышеприведенного кода (но изменение цикла на write()) решило проблему, и теперь обе программы могут нормально взаимодействовать с tiffs. – Tapio

Смежные вопросы