Расчёт объёма дыхательных пазух: выбор алгоритма/подхода

Способ через 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 и дорисовываем;

Затем мы переименовываем сегмент, как нам удобно и нажимаем на выдвигающиеся меню на кнопке с зелёной стрелкой. И выбираем пункт `Export to Files`. Выбираем разве что только путь, куда сохранится 3D объект и его формат (будем использовать `stl`);

Уже в `Blender` удаляем внешние стенки (например через выделение через лассо с включенным `x-ray` с видом сверху);

Затем удаляем аккруратно всё лишнее посередине через тот же способ, что и выше;

Пользуемся функцией выделения сетки по соседям (Select Linked) на каждой из пазухи и делаем `Separate` в отдельные объекты;

Подчищаем геометрию, если нужно. Можно даже подчистить с дырками;

Ставим плагин под названием `Mesh: 3D-print Toolbox`;

Открываем в свойствах объекта вкладку `3D-print` и пользуемся функцией `Clean Up/Make Manifold`, которая заделывает дырки;

И нажимаем `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.

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

В целом визуально примерно все давали одинаковые результаты, поэтому сложно было выбрать какой-то конкретный;

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

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

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