projects:otolaryngologist:task_calculate_volume

This is an old revision of the document!


Задача: расчёт объёма дыхательных пазух

Способ через 3D

В качестве 3D программы для пробы того, что будет ли способ вообще рабочим, был выбран Blender, так как он поддерживает множество форматов, а также является open source приложением.

Что было попробовано:

Преобразование nii в stl

Было попробовано преобразование nii в stl через данный метод:
http://wiki.osll.ru/doku.php/projects:otolaryngologist:nii_to_mesh

Вывод:

данная идея была сразу отброшена по данным причинам:

  • Сложно настраивать параметры, потому что нужно каждый раз запускать скрипты, чтобы увидеть результат, так ещё и через двойной прогон;

    Без настройки параметров можно увидеть множество шумов и дефектов.

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

Анализ библиотеки плагинов 3D Slicer'а и его самого

  • Были найдены библиотеки для Python для импорта/экспорта разных 3D форматов из сохранённой сегментации, но это всё не равно не удобно, ведь присутствует дополнительный шаг, хоть и эта библиотека работает с уже сегментированном форматом файлов, поэтому позволяет подготовить сегментацию в 3D Slicer;

    Вот пример:
    https://pypi.org/project/slicerio/
  • Также было найдено, что есть такой набор библиотек, как VTK. Он встроен в 3D Slicer, что позволяет вообще нативно проводить сегментацию снимков (с множеством настроек), а также имеется так нужный нам экспорт.
Вывод:

мы нашли способ позволяющий несколькими кликами экспортировать медицинские снимки в популярные 3D форматы файлов.

Инструкция по способам:

Давайте тут подробнее разберём шаги:

  1. Через 3D Slicer открываем наши снимки (пусть для примера это будут nii файл);
  2. Далее нам нужно сегментировать нашу область, поэтому мы открываем Segment Editor, который находится в списке всех модулей по такому пути: Segmentation/Segment Editor;
  3. Создаём области с помощью инструмента Threshold. Выбираем в нём любой алгоритм;
  4. Крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело;
  5. А на тех местах, где не дорисовывается стенка — мы используем инструмент Paint и дорисовываем;
  6. Затем мы переименовываем сегмент, как нам удобно и нажимаем на выдвигающиеся меню на кнопке с зелёной стрелкой. И выбираем пункт `Export to Files`. Выбираем разве что только путь, куда сохранится 3D объект и его формат (будем использовать `stl`);
  7. Уже в `Blender` удаляем внешние стенки (например через выделение через лассо с включенным `x-ray` с видом сверху);
  8. Затем удаляем аккруратно всё лишнее посередине через тот же способ, что и выше;
  9. Пользуемся функцией выделения сетки по соседям (Select Linked) на каждой из пазухи и делаем `Separate` в отдельные объекты;
  10. Подчищаем геометрию, если нужно. Можно даже подчистить с дырками;
  11. Ставим плагин под названием `Mesh: 3D-print Toolbox`;
  12. Открываем в свойствах объекта вкладку `3D-print` и пользуемся функцией `Clean Up/Make Manifold`, которая заделывает дырки;
  13. И нажимаем `Statistics/Volume` - и видим объём.

Проблемы и попытки их решить

3D объект получается большим

Из-за чего `Blender`'у немного тяжело работать в `Edit Mode` (может в среднем думать по 2-3 секунды), когда мы пытаемся сделать какие-нибудь преобразования над мешем.

  • Можно уменьшить кол-во сетки с помощью модификатор `Decimate` в Blender'е, но тогда мы можем потерять в точности вычисления объёма, поэтому мы отказались от такой идеи;
  • Можно в `3D Slicer`'е воспользоваться инструментом `Scissors`, и он нам помогает, но уже в `Blender` придётся аккуратнее тогда удалять стенки, которые появляются ещё в `3D Slicer`'е из-за логики работы сегментации. Ну и ножницами тоже надо аккуратнее пользоваться, чтобы не отрезать лишнего.
Невозможно подкрутить идеально Threshold в 3D Slicer'е.

На выбор у нас есть множество алгоритмов: Otsu, Huang, IsoData, Kittler-Illingworth, Maximum Entropy, Moments, Renyi entropy, Shanbhag, Triangle, Yen.

Мы попробовали их всех и пришли к таким выводам:

  1. В целом визуально примерно все давали одинаковые результаты, поэтому сложно было выбрать какой-то конкретный;
  2. Также во всех алгоритмах на некоторых снимках появлялись такие артефакты, как не бралась область, где на глаз должна быть стенка. Но когда мы увеличивали значение `threshold`'а, то брались области, где должна быть пустота.

Учитывая пункты выше было решено, что threshold` не надо завышать и легче воспользоваться инструментом `Paint` и провести стенки самим, там где они должны были быть. В основном это не надо делать больше, чем на нескольких снимках.

На чём остановились

projects/otolaryngologist/task_calculate_volume.1708206807.txt.gz · Last modified: 2024/02/18 00:53 by psamsonov