projects:otolaryngologist:task_calculate_volume

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projects:otolaryngologist:task_calculate_volume [2024/02/23 22:34] – Добавил ещё один способ выделения пазух; Добавил описание расчёта объёма прямо в Slicer 3D и их сравнения в виде таблиц psamsonovprojects:otolaryngologist:task_calculate_volume [2024/05/06 20:48] (current) – Добавил финальный пайплайн и инструкцию по использованию psamsonov
Line 25: Line 25:
     - Создаём области с помощью инструмента **Threshold**: крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело;     - Создаём области с помощью инструмента **Threshold**: крутим нижний порог до того, чтобы на взгляд почти везде хорошо выглядело;
     - А на тех местах, где не дорисовывается стенка — мы используем инструмент **Paint** и дорисовываем;     - А на тех местах, где не дорисовывается стенка — мы используем инструмент **Paint** и дорисовываем;
-    - Затем мы переименовываем сегмент, как нам удобно и нажимаем на выдвигающиеся меню на кнопке с зелёной стрелкой. И выбираем пункт **Export to Files**. Выбираем разве что только путь, куда сохранится 3D объект и его формат (будем использовать **stl**); {{:projects:otolaryngologist:export_from_3d_slicer.png?400|}}+    - Затем мы переименовываем сегмент, как нам удобно и нажимаем на выдвигающиеся меню на кнопке с зелёной стрелкой. И выбираем пункт **Export to Files**. Выбираем разве что только путь, куда сохранится 3D объект и его формат (будем использовать **stl**); {{ :projects:otolaryngologist:export_from_3d_slicer.png?400 |}}
     - Уже в **Blender** удаляем внешние стенки (например через выделение через лассо с включенным **x-ray** с видом сверху);     - Уже в **Blender** удаляем внешние стенки (например через выделение через лассо с включенным **x-ray** с видом сверху);
     - Затем удаляем аккуратно всё лишнее посередине через тот же способ, что и выше;     - Затем удаляем аккуратно всё лишнее посередине через тот же способ, что и выше;
Line 67: Line 67:
     - Затем заходим в **Quantification/Segment Statistics** и выбираем в поле **Segmentation** нашу сегментацию с двумя сегментами (то есть нашими пазухами);     - Затем заходим в **Quantification/Segment Statistics** и выбираем в поле **Segmentation** нашу сегментацию с двумя сегментами (то есть нашими пазухами);
     - В `Advanced` по умолчанию настроено уже, как нам нужно, но можно на всякий случай убрать **Scalar Volume**, потому что там будут идентичные результаты с **Label Map** (хотя он и так работает только тогда, когда выбираешь **Scalar Volume** вместо **None**, поэтому и говорю, что и по умолчанию всё хорошо);<WRAP center round important>     - В `Advanced` по умолчанию настроено уже, как нам нужно, но можно на всякий случай убрать **Scalar Volume**, потому что там будут идентичные результаты с **Label Map** (хотя он и так работает только тогда, когда выбираешь **Scalar Volume** вместо **None**, поэтому и говорю, что и по умолчанию всё хорошо);<WRAP center round important>
-Не знаю почему, но **Closed Surface** работает только тогда, когда в **Segment Editor** включено **Show 3D**.+Для работы **Closed Surface** нужно, чтобы в **Segment Editor** было включено **Show 3D**.
 </WRAP> </WRAP>
     - Нажимаем **Apply** и видим результаты. Их разбор будет пунктом ниже.     - Нажимаем **Apply** и видим результаты. Их разбор будет пунктом ниже.
Line 76: Line 76:
  
 **Результаты:** **Результаты:**
-| Segment | Voxel count | Volume mm3 (LM) | Volume cm3 (LM) | Surface mm2 | Volume mm3 (CS) | Volume cm3 (CS) +| Segment | Voxel count | Surface mm2 | Volume cm3 | 
-| Left    | 152976      | 19122           | 19.122          | 4232.45     | 19179           | 19.179          +| Left    | 152976      | 4232.45     | 19.179     
-| Right   | 136020      | 17002.5         | 17.0025         | 4071.59     | 17056.4         | 17.0564         |+| Right   | 136020      | 4071.59     | 17.0564    |
 **Вывод:** Это не удобно и очень муторно. **Вывод:** Это не удобно и очень муторно.
 </WRAP> </WRAP>
Line 85: Line 85:
  
 **Результаты:** **Результаты:**
-| Segment | Voxel count | Volume mm3 (LM) | Volume cm3 (LM) | Surface mm2 | Volume mm3 (CS) | Volume cm3 (CS) +| Segment | Voxel count | Surface mm2 | Volume cm3 | 
-| Left    | 121637      | 15204.6         | 15.2046         | 4759.2      | 15287.7         | 15.2877         +| Left    | 121637      | 4759.2      | 15.2877    
-| Right   | 118842      | 14855.2         | 14.8552         | 4451.78     | 14916.7         | 14.9167         |+| Right   | 118842      | 4451.78     | 14.9167    |
 **Вывод:** имеет смысл, но результаты получаются не такими точными и красивыми, как хотелось бы. **Вывод:** имеет смысл, но результаты получаются не такими точными и красивыми, как хотелось бы.
 </WRAP> </WRAP>
Line 95: Line 95:
  
 **Результаты:** **Результаты:**
-| Segment | Voxel count | Volume mm3 (LM) | Volume cm3 (LM) | Surface mm2 | Volume mm3 (CS) | Volume cm3 (CS) +| Segment | Voxel count | Surface mm2 | Volume cm3 | 
-| Left    | 135528      | 16941           | 16.941          | 3913.61     | 16994           | 16.994          +| Left    | 135528      | 3913.61     | 16.994     
-| Right   | 132024      | 16503           | 16.503          | 3928.04     | 16556.9         | 16.5569         |+| Right   | 132024      | 3928.04     | 16.5569    |
 **Вывод:** уже в разы лучше. **Вывод:** уже в разы лучше.
 </WRAP> </WRAP>
Line 109: Line 109:
  
 **Результаты только с Margin:** **Результаты только с Margin:**
-| Segment | Voxel count | Volume mm3 (LM) | Volume cm3 (LM) | Surface mm2 | Volume mm3 (CS) | Volume cm3 (CS) +| Segment | Voxel count | Surface mm2 | Volume cm3 | 
-| Left    | 145906      | 18238.2         | 18.2383         | 4250.16     | 18284.2         | 18.2842         +| Left    | 145906      | 4250.16     | 18.2842    
-| Right   | 141524      | 17690.5         | 17.6905         | 4202.23     | 17743           | 17.743          |+| Right   | 141524      | 4202.23     | 17.743     |
  
 **Результаты также ещё и с Closing (fill holes) (5.00mm):** **Результаты также ещё и с Closing (fill holes) (5.00mm):**
-| Segment | Voxel count | Volume mm3 (LM) | Volume cm3 (LM) | Surface mm2 | Volume mm3 (CS) | Volume cm3 (CS) +| Segment | Voxel count | Surface mm2 | Volume cm3 | 
-| Left    | 148392      | 18549           | 18.549          | 4114.5      | 18608.2         | 18.6082         +| Left    | 148392      | 4114.5      | 18.6082    
-| Right   | 143420      | 17927.5         | 17.9275         | 4130.2      | 17986.9         | 17.9869         |+| Right   | 143420      | 4130.2      | 17.9869    |
  
 **Выводы:** **Выводы:**
 По результатам можно увидеть, что **Smoothing** (остальные алгоритмы я тоже пробовал, но они визуально работали хуже) не особо что-то меняет, потому что и без него получается очень приближённо к настоящим результатам, но при этом он бывает сглаживает не в тех местах, из-за чего, например, **Right** и повысился. Поэтому данный способ лучше юзать без сглаживания (либо с небольшим сглаживанием, но результаты тогда будут на уровне +1-2%). По результатам можно увидеть, что **Smoothing** (остальные алгоритмы я тоже пробовал, но они визуально работали хуже) не особо что-то меняет, потому что и без него получается очень приближённо к настоящим результатам, но при этом он бывает сглаживает не в тех местах, из-за чего, например, **Right** и повысился. Поэтому данный способ лучше юзать без сглаживания (либо с небольшим сглаживанием, но результаты тогда будут на уровне +1-2%).
 +</WRAP>
 +
 +    - Окончательный алгоритм: \\ <WRAP>
 +Этапы:
 +    - Создаём сегмент для маски, которую мы будем в дальнейшем использовать и делаем её активной;
 +    - Применяем инструмент **Threshold** (параметры для него задаёт пользователь и подробнее про них будет ниже) в качестве **MinimumThreshold**;
 +    - Затем применяем **Smoothing** с параметрами: **Closing (fill holes)** и 1.5mm;
 +    - Затем инвертируем сегмент маски;
 +    - Переключаемся на первоначальный сегмент, а также выставляем в качестве маски, тот сегмент маски, с которым мы работали до этого;
 +    - Применяем **Local Threshold** (инструмент из данного пакета: [[https://github.com/lassoan/SlicerSegmentEditorExtraEffects|ссылка]]) и затем задаём такие параметры: в качестве уже **MaximumThreshold** ставим параметр от пользователя, в качестве **SegmentationAlgorithm** выбираем **GrowCut**, а в качестве **MinimumDiameterMm** 1.0mm;
 +    - Теперь мы выполнили всю работу с маской, тем самым можем удалить эту маску;
 +    - Далее применяем **Islands** с режимом удаления мелких островков и с параметром **MinimumSize**=3000, чтобы отбросить лишнее, если оно будет;
 +    - Под конец я применяем **Smoothing** с параметрами: **Closing (fill holes)** и 1.5mm, чтобы соединить те части, которые могли потенциально разъединиться от шагов выше.
 +
 +| Segment | Voxel count | Surface mm2 | Volume cm3 |
 +| Left    | 156162      | 4492.03     | 19.5664    |
 +| Right   | 141382      | 4258.5      | 17.7276    |
 +
 +
 </WRAP> </WRAP>
  
 === Выводы === === Выводы ===
-Лучше всего показал себя последний способ с использованием **Margin** и без **Smoothing**. И если я правильно вручную выбрал пазухи, то отставание получается в примерно 5%.+На основе всех вычислений выше (и на основе вычислений значений на других наборах слайсов), и так как это был наихудший пример — было принято взять последний алгоритм, так как он работал более стабильнее. 
 + 
 +===== Инструкция по использованию ===== 
 + 
 +{{ :projects:otolaryngologist:instruction_calculator_volume.png?600 |}}
  
-===== На чём остановились =====+    - Раскрывает/закрывает работу с пазухами; 
 +    - Можно выбрать/создать/переименовать ноду сегментации; 
 +    - Можно выбрать тот объём слайсов с которым будет производится работа; 
 +    - Можно настроить отклонение порога, где базовым значение является значение выставленное алгоритмом в следующем пункте; 
 +    - Позволяет выбрать алгоритм, который будет выставлять базовое значение порога; 
 +    - Переключает отображение 3D; 
 +    - Является переключателем, показывающим примерную область, которая будет выделена при нажатии на слайс; 
 +    - Список имён, которое переключает выбранный сегмент сегментации; 
 +    - Можно выбрать таблицу, куда будут экспортированы данные; 
 +    - Подсчитывает результаты и отображает их внизу экрана.
projects/otolaryngologist/task_calculate_volume.1708716888.txt.gz · Last modified: 2024/02/23 22:34 by psamsonov