projects:otolaryngologist:task_calculate_volume
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| projects:otolaryngologist:task_calculate_volume [2024/02/18 00:28] – created psamsonov | 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.1708205291.txt.gz · Last modified: 2024/02/18 00:28 by psamsonov