This is an old revision of the document!
Table of Contents
Расчёт объёма дыхательных пазух: выбор алгоритма/подхода
Способ через 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 форматы файлов.
Инструкция по способам:
Давайте тут подробнее разберём шаги:
- Через 3D Slicer открываем наши снимки (пусть для примера это будут nii файл);
- Далее нам нужно сегментировать нашу область, поэтому мы открываем Segment Editor, который находится в списке всех модулей по такому пути: Segmentation/Segment Editor;
- Создаём области с помощью инструмента Threshold. Выбираем в нём любой алгоритм;
- Крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело;
- А на тех местах, где не дорисовывается стенка — мы используем инструмент Paint и дорисовываем;
- Уже в `Blender` удаляем внешние стенки (например через выделение через лассо с включенным `x-ray` с видом сверху);
- Затем удаляем аккруратно всё лишнее посередине через тот же способ, что и выше;
- Пользуемся функцией выделения сетки по соседям (Select Linked) на каждой из пазухи и делаем `Separate` в отдельные объекты;
- Подчищаем геометрию, если нужно. Можно даже подчистить с дырками;
- Ставим плагин под названием `Mesh: 3D-print Toolbox`;
- Открываем в свойствах объекта вкладку `3D-print` и пользуемся функцией `Clean Up/Make Manifold`, которая заделывает дырки;
Проблемы и попытки их решить
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.
Мы попробовали их всех и пришли к таким выводам:
- В целом визуально примерно все давали одинаковые результаты, поэтому сложно было выбрать какой-то конкретный;
- Также во всех алгоритмах на некоторых снимках появлялись такие артефакты, как не бралась область, где на глаз должна быть стенка. Но когда мы увеличивали значение `threshold`'а, то брались области, где должна быть пустота.
Учитывая пункты выше было решено, что threshold` не надо завышать и легче воспользоваться инструментом `Paint` и провести стенки самим, там где они должны были быть. В основном это не надо делать больше, чем на нескольких снимках.