Nano Hash - криптовалюты, майнинг, программирование

Извлеките изображение всего масштаба из файла формата SVS в C++

Я пытаюсь извлечь изображение всего масштаба из файла SVS на С++.

Я видел объяснение на на главной странице OpenSlide. В нем говорится, что формат SVS - это «однофайловый пирамидальный мозаичный TIFF».

Поэтому я попытался извлечь полномасштабное изображение, как я сделал для изображения TIFF: я прочитал все IFD из файла SVS, но нет тега 273, который содержит адрес, указывающий на полномасштабное изображение.

Вот почему я сейчас немного запутался, формат SVS не имеет внутри файла полномасштабного изображения?

Я нашел неопределенный частный тег в файле SVS с номером 34675. Этот тег предназначен для полноразмерного изображения? Или есть правильный способ извлечь его?


Ответы:


1

Aperio SVS — это мозаичный формат. Все уровни пирамиды представляют собой мозаичные изображения. Базовый уровень — это первый каталог TIFF. На этой странице документации LibTiff показано, как читать мозаичные изображения.

Короче, нужно искать тег 324 (TIFFTAG_TILEOFFSETS), а также теги 322 и 323 (TIFFTAG_TILEWIDTH, TIFFTAG_TILELENGTH). Я настоятельно рекомендую вам использовать для этого LibTiff и не пытаться создавать свои собственные.

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

17.11.2018
  • Я понимаю. Спасибо за ответ @Cris Luengo. Итак, нет способа извлечь все изображение сразу, я прав? Я все равно должен извлечь все плитки и соединить плитки, создающие целое изображение. Я думал, что первая страница всех tiff-файлов — это полномасштабное изображение. но это не относится к формату файла svs. я правильно понимаю? Большое спасибо вперед. P.S› И я также хочу, чтобы вы дали мне знать, что такое тег 34675. В описании сказано, что это профиль TIFF Tag ICC. Я не понимаю, что это значит. 18.11.2018
  • @YJJ: вы не можете извлечь его за один вызов функции, но это верно и для полосатых файлов TIFF (там вы должны прочитать каждую полосу и скомпоновать их в изображение). В мозаичном TIFF вы читаете каждую плитку и составляете из них изображение. Как и следовало ожидать, первая страница файла SVS представляет собой полномасштабное изображение (базовый слой). Но каждая страница любого файла TIFF состоит либо из одной или нескольких полос, либо из одной или нескольких плиток. TIFF просто любит разбивать пиксельные данные таким образом. 18.11.2018
  • @YJJ: профили ICC описывают, как вы должны изменить цвета в файле, чтобы они выглядели так же на вашем мониторе, как и на физическом слайде. Для этого вам необходимо объединить ICC-профиль сканера (хранящийся в файле SVS) с ICC-профилем монитора. См. здесь: en.wikipedia.org/wiki/ICC_profile -- но лучше игнорировать профиль ICC, если вы проводите анализ слайда. Это полезно только для отображения. 18.11.2018
  • Большое спасибо за ваш ответ. Итак, на первой странице изображение в натуральную величину, а не с одним массивом. полномасштабное изображение делится на плитки или полосы. Интересно, все файлы svs имеют тайлы для составления полномасштабного изображения, а не полоски? теперь я кодирую для извлечения файла в формате JPEG2000 из файла svs и преобразования JPEG2000 в обычный JPEG. Итак, теперь мне не нужно думать о полосах в файле svs, просто использовать информацию о плитке для создания полномасштабного изображения? 18.11.2018
  • Если вы не возражаете, я также хочу попросить вас, чтобы после того, как я вытащил полномасштабное изображение, состоящее из всех тайлов, это был буферный массив. есть ли правильный способ сохранить массив буферов в формате файла JP2? 18.11.2018
  • @YJJ: Да, все файлы TIFF делят изображение на полосы или плитки, а не на то и другое (хотя для небольших изображений может быть только одна полоса или одна плитка). Да, все файлы SVS используют плитки для всех слоев пирамиды. Изображение макроса и изображение этикетки используют полосы (они находятся в каталогах в конце файла SVS, вы, вероятно, захотите их игнорировать). Извините, я ничего не знаю о формате файла JP2. 18.11.2018
  • Я попытался использовать libtiff и получил эту ошибку: Схема сжатия 33005 декодирование тайла не реализовано. Я думаю, это потому, что формат svs использует JPEG2000 в качестве метода сжатия. Что я действительно хочу сделать, так это просто сохранить полномасштабное изображение в любом формате. Похоже, что современный libtiff все еще не поддерживает формат JPEG2000. это означает, что я должен сделать свое собственное решение. какой тип следует использовать для составления всех изображений плитки? после создания изображения я думаю, что просто сохраню буферный массив с помощью ofstream. 18.11.2018
  • @YJJ: JPEG2000 - это специальное дополнение к стандарту TIFF, очень немногие программы чтения TIFF поддерживают его. Я думаю, что можно настроить LibTiff для его использования (при компиляции библиотеки), но вам не нужно: используйте TIFFReadRawTile для чтения данных тайла, затем распаковывайте с помощью вашей библиотеки декомпрессии jpeg2k. Затем запишите данные плитки в увеличенное изображение. 18.11.2018
  • Привет, @Крис Луенго. Поскольку я никогда не использовал libtiff, у меня есть некоторые проблемы. После того, как я прочитал файл svs, который я хочу использовать, я установил такие поля, как image_width, image_length, tile_width, tile_length, sample_per_pixel, bits_per_sample. Я сделал ‹code› for (int tile = 0; tile ‹ TIFFNumberOfTiles(tiff_in); tile++){ TIFFReadRawTile(tiff_in, tile, buf, (tsize_t)-1); TIFFWriteRawTile (tiff_out, tile, buf, (tsize_t) sizeof (buf)); } ‹code/› Но после этого я получил только исходный исходный файл размером 43 КБ из файла svs размером 152 МБ. должны быть какие-то ошибки. Должен ли я писать плитки после того, как сначала прочитаю их все? Спасибо 21.11.2018
  • @YJJ: Сначала вам нужно настроить выходной каталог TIFF: установить размеры изображения, установить его в мозаичный режим, установить размеры плитки, установить сжатие, установить фотометрическую интерпретацию и т. Д. После этого вы можете писать плитки. Я предполагаю, что это то, что не так, но я не могу быть уверен с небольшим фрагментом, которым вы поделились. Почему бы вам не сделать новый вопрос для этого? 21.11.2018
  • Спасибо @Крис Луенго. Я подтвердил, что теги разрешения X и разрешения Y не установлены в файлах svs, которые у меня есть. Есть ли другие способы получить информацию о dpi без использования TIFFGetField? 21.01.2019
  • @YJJ: файлы SVS имеют настраиваемый тег в первом каталоге, который содержит блок метаданных в формате XML. Вы можете получить информацию о DPI оттуда. Прочитайте пользовательский тег, проанализируйте XML, получите значение в соответствующем поле. Если вы выгрузите данные, вы быстро узнаете, что это за тег и какое поле XML нужно искать. Используйте утилиты командной строки tiffinfo и tuffdump для проверки TIFF-файла. 21.01.2019
  • Привет, @Крис Луенго. Я получил тег ImageDescription из файла svs, не было пары ключ-значение с именем разрешения. Но я обнаружил, что есть MPP = 0,5030. Это может быть значение разрешения? или я должен прочитать другой тег? 21.01.2019
  • @YJJ: Да, это он. Это означает «микрон на пиксель». 21.01.2019
  • @YJJ: нет, микрон крошечный. В каждом см их 10000. 0,5 мкм = 0,000,5 мм = 0,000,05 см. Вы можете использовать Google для преобразования таких единиц, если вы не уверены. Найдите «0,5 микрона в см». 21.01.2019
  • 0,000,05 см на пиксель кажется очень маленьким. это действительное значение для разрешения? 21.01.2019
  • @YJJ: Да. Это микроскоп. Конечно он маленький. В этом суть микроскопа... Скажем, сканируемый срез ткани имеет ширину 2 см. Таким образом, вы получаете 2,0 см / 0,000,05 см/пиксель = 40 000 пикселей. Это звучит правильно? 21.01.2019
  • Ага, понятно. уровень разрешения невероятен. Спасибо, что всегда отвечаете мне много раз. Вы определенно мне очень помогаете. Я ценю это. 21.01.2019

  • 2

    Вы можете прочитать уменьшенное изображение (это то, что вы имеете в виду под полноразмерным изображением?) как изображение, связанное с openslide.

    Например, libvips имеет удобную привязку к openslide, написанную авторами openslide:

    $ vipsheader -f slide-associated-images CMU-1.svs
    label, macro, thumbnail
    

    Список изображений в файле SVS. macro — это огромная пирамида, которую вы получаете по умолчанию, thumbnail — это небольшой обзор, label — снимок метки слайда.

    Получите миниатюру следующим образом:

    $ vips copy CMU-1.svs[associated=thumbnail] x.jpg
    

    Читать как изображение JPG.

    В С++ вы можете написать:

    VImage thumb = VImage::new_from_file("CMU-1.svs", 
        VImage::option()->set("associated", "thumbnail"));
    thumb.write_to_file("x.jpg");
    
    22.11.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..