projects:otolaryngologist:task_calculate_volume
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
projects:otolaryngologist:task_calculate_volume [2024/02/18 11:26] – kel | projects:otolaryngologist:task_calculate_volume [2024/05/06 20:48] (current) – Добавил финальный пайплайн и инструкцию по использованию psamsonov | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Расчёт объёма дыхательных пазух: выбор алгоритма/ | ====== Расчёт объёма дыхательных пазух: выбор алгоритма/ | ||
- | ===== Способ через 3D ===== | + | ===== Способ через |
В качестве 3D программы для пробы того, что будет ли способ вообще рабочим, | В качестве 3D программы для пробы того, что будет ли способ вообще рабочим, | ||
- | ==== Что было попробовано: | + | ==== Преобразование nii в stl ==== |
- | + | ||
- | === Преобразование nii в stl === | + | |
Было попробовано преобразование **nii** в **stl** через данный метод: \\ http:// | Было попробовано преобразование **nii** в **stl** через данный метод: \\ http:// | ||
- | == Вывод: == | + | === Вывод: |
данная идея была сразу отброшена по данным причинам: | данная идея была сразу отброшена по данным причинам: | ||
* Сложно настраивать параметры, | * Сложно настраивать параметры, | ||
* Также способ сам по себе не удобен и долгий, | * Также способ сам по себе не удобен и долгий, | ||
- | === Анализ библиотеки плагинов 3D Slicer' | + | ==== Анализ библиотек плагинов 3D Slicer' |
- | * Были найдены библиотеки для Python для импорта/ | + | * Были найдены библиотеки для Python для импорта/ |
* Также было найдено, | * Также было найдено, | ||
- | == Вывод: == | + | === Вывод: |
мы нашли способ позволяющий несколькими кликами экспортировать медицинские снимки в популярные 3D форматы файлов. | мы нашли способ позволяющий несколькими кликами экспортировать медицинские снимки в популярные 3D форматы файлов. | ||
- | == Инструкция по способам: | + | === Инструкция по способам: |
Давайте тут подробнее разберём шаги: | Давайте тут подробнее разберём шаги: | ||
- Через **3D Slicer** открываем наши снимки (пусть для примера это будут **nii** файл); | - Через **3D Slicer** открываем наши снимки (пусть для примера это будут **nii** файл); | ||
- Далее нам нужно сегментировать нашу область, | - Далее нам нужно сегментировать нашу область, | ||
- | - Создаём области с помощью инструмента **Threshold**. Выбираем в нём любой алгоритм; | + | - Создаём области с помощью инструмента **Threshold**: крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело; |
- | - Крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело; | + | |
- А на тех местах, | - А на тех местах, | ||
- | - Затем мы переименовываем сегмент, | + | - Затем мы переименовываем сегмент, |
- | - Уже в `Blender` удаляем внешние стенки (например через выделение через лассо с включенным | + | - Уже в **Blender** удаляем внешние стенки (например через выделение через лассо с включенным |
- | - Затем удаляем аккруратно всё лишнее посередине через тот же способ, | + | - Затем удаляем аккуратно всё лишнее посередине через тот же способ, |
- | - Пользуемся функцией выделения сетки по соседям (Select Linked) на каждой из пазухи и делаем | + | - Пользуемся функцией выделения сетки по соседям (Select Linked) на каждой из пазухи и делаем |
- Подчищаем геометрию, | - Подчищаем геометрию, | ||
- | - Ставим плагин под названием | + | - Ставим плагин под названием |
- | - Открываем в свойствах объекта вкладку | + | - Открываем в свойствах объекта вкладку |
- | - И нажимаем | + | - И нажимаем |
- | === Проблемы и попытки их решить === | + | ==== Проблемы и попытки их решить |
- | == 3D объект получается большим == | + | === 3D объект получается большим |
- | Из-за чего | + | Из-за чего |
- | * Можно уменьшить кол-во сетки с помощью модификатор | + | * Можно уменьшить кол-во сетки с помощью модификатор |
- | * Можно в `3D Slicer`'е воспользоваться инструментом | + | * Можно в **3D Slicer**'е воспользоваться инструментом |
- | == Невозможно подкрутить идеально Threshold в 3D Slicer' | + | === Невозможно подкрутить идеально Threshold в 3D Slicer' |
- | На выбор у нас есть множество | + | На выбор у нас есть множество |
- | Мы попробовали их всех и пришли к таким выводам: | + | Но если даже двигать их вручную, то появлялись такие артефакты, |
- | - В целом | + | |
- | - Также во всех алгоритмах на некоторых снимках | + | |
- | Учитывая пункты выше | + | Учитывая пункты выше |
+ | - **threshold** не надо завышать и нужно будет воспользоваться инструментом | ||
+ | - Либо же чуток завышаем **threshold**, | ||
- | + | ===== Только встроенными инструментами 3D Slicer' | |
- | ===== На чём остановились ===== | + | |
+ | ==== С использованием только лишь встроенного функционала | ||
+ | Был проанализирован функционал **3D Slicer**' | ||
+ | - Инструмент под названием **Islands** в модуле **Segment Editor**; | ||
+ | - Модуль **Segment Statistics**, | ||
+ | |||
+ | Сочетание этих двух инструментов открыл ещё более быстрый и удобный путь для получения объёма. | ||
+ | |||
+ | === Инструкция по нему === | ||
+ | - Первые шаги по открытии и выбора модуля **Segmentation/ | ||
+ | - Выбираем один из способов выделения областей описанных после данной инструкции и применяем его; | ||
+ | - Далее выбираем инструмент **Islands** и далее выбираем **Split Islands to segments**. В **Minumum Size** ставим, | ||
+ | - Возможно перед следующим шагом надо будет применить ещё какие-то инструкции из способов ниже; | ||
+ | - Тут у нас должны остаться лишь 3 сегмента: | ||
+ | - Затем заходим в **Quantification/ | ||
+ | - В `Advanced` по умолчанию настроено уже, как нам нужно, но можно на всякий случай убрать **Scalar Volume**, потому что там будут идентичные результаты с **Label Map** (хотя он и так работает только тогда, когда выбираешь **Scalar Volume** вместо **None**, поэтому и говорю, | ||
+ | Для работы **Closed Surface** нужно, чтобы в **Segment Editor** было включено **Show 3D**. | ||
+ | </ | ||
+ | - Нажимаем **Apply** и видим результаты. Их разбор будет пунктом ниже. | ||
+ | |||
+ | === Алгоритмы выбора сегментов === | ||
+ | - Вручную дополнять: | ||
+ | Это случай с завышением **Threshold**' | ||
+ | |||
+ | **Результаты: | ||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 152976 | ||
+ | | Right | 136020 | ||
+ | **Вывод: | ||
+ | </ | ||
+ | - Завысить Threshold: \\ < | ||
+ | Главное, | ||
+ | |||
+ | **Результаты: | ||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 121637 | ||
+ | | Right | 118842 | ||
+ | **Вывод: | ||
+ | </ | ||
+ | - Завысить Threshold c Smoothing \\ < | ||
+ | Инструкция: | ||
+ | - после применения инструмента **Islands** мы для **каждой** из пазух применяем инструмент **Smoothing** в режиме **Closing (fill holes)** (я выбрал **10.00mm**); | ||
+ | |||
+ | **Результаты: | ||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 135528 | ||
+ | | Right | 132024 | ||
+ | **Вывод: | ||
+ | </ | ||
+ | - С использованием Margin и опционально Smoothing \\ < | ||
+ | Инструкция: | ||
+ | - Тут мы можем взять такой **Threshold**, | ||
+ | - Затем мы выбираем инструмент **Margin** и выбираем в **Operation**: | ||
+ | - Далее используем инструмент **Islands** по инструкции выше; | ||
+ | - И теперь применяем обратно **Margin** с таким же размером, | ||
+ | - Опционально ещё можем применить инструмент **Smoothing** в режиме **Closing (fill holes)**, например, | ||
+ | |||
+ | **Результаты только с Margin:** | ||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 145906 | ||
+ | | Right | 141524 | ||
+ | |||
+ | **Результаты также ещё и с Closing (fill holes) (5.00mm): | ||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 148392 | ||
+ | | Right | 143420 | ||
+ | |||
+ | **Выводы: | ||
+ | По результатам можно увидеть, что **Smoothing** (остальные алгоритмы я тоже пробовал, | ||
+ | </ | ||
+ | |||
+ | - Окончательный алгоритм: | ||
+ | Этапы: | ||
+ | - Создаём сегмент для маски, которую мы будем в дальнейшем использовать и делаем её активной; | ||
+ | - Применяем инструмент **Threshold** (параметры для него задаёт пользователь и подробнее про них будет ниже) в качестве **MinimumThreshold**; | ||
+ | - Затем применяем **Smoothing** с параметрами: | ||
+ | - Затем инвертируем сегмент маски; | ||
+ | - Переключаемся на первоначальный сегмент, | ||
+ | - Применяем **Local Threshold** (инструмент из данного пакета: | ||
+ | - Теперь мы выполнили всю работу с маской, | ||
+ | - Далее применяем **Islands** с режимом удаления мелких островков и с параметром **MinimumSize**=3000, чтобы отбросить лишнее, | ||
+ | - Под конец я применяем **Smoothing** с параметрами: | ||
+ | |||
+ | | Segment | Voxel count | Surface mm2 | Volume cm3 | | ||
+ | | Left | 156162 | ||
+ | | Right | 141382 | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | === Выводы | ||
+ | На основе всех вычислений выше (и на основе вычислений значений на других наборах слайсов), | ||
+ | |||
+ | ===== Инструкция по использованию ===== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | - Раскрывает/ | ||
+ | - Можно выбрать/ | ||
+ | - Можно выбрать тот объём слайсов с которым будет производится работа; | ||
+ | - Можно настроить отклонение порога, | ||
+ | - Позволяет выбрать алгоритм, | ||
+ | - Переключает отображение 3D; | ||
+ | - Является переключателем, | ||
+ | - Список имён, которое переключает выбранный сегмент сегментации; | ||
+ | - Можно выбрать таблицу, | ||
+ | - Подсчитывает результаты и отображает их внизу экрана. |
projects/otolaryngologist/task_calculate_volume.1708244794.txt.gz · Last modified: 2024/02/18 11:26 by kel