๐ง SUVr ๊ณ์ฐ ์์ธ ์ค๋ช : 3D Slicer๋ก ๋ PET ๋ถ์ ์๋ฒฝ ๋ง๋ฌด๋ฆฌ!
๐ง SUVr ๊ณ์ฐ ์์ธ ์ค๋ช : 3D Slicer๋ก ๋ PET ๋ถ์ ์๋ฒฝ ๋ง๋ฌด๋ฆฌ!
์ง๊ธ๊น์ง 3D Slicer๋ก brain PET ์ด๋ฏธ์ง๋ฅผ parcellationํ๊ณ registrationํ๊ณ SUV ๊ฐ์ ๋ฝ์๋์ฃ ?
์ด์ ๋ง์ง๋ง ๋จ๊ณ์ธ SUVr (Standardized Uptake Value ratio) ๊ณ์ฐ ์ฐจ๋ก์์.
SUVr์ ํน์ ๋ ์์ญ์ SUV ๊ฐ์ reference tissue(์ฃผ๋ก ์๋)์ SUV ๊ฐ์ผ๋ก ๋๋ ๋น์จ๋ก, ์์ธ ํ์ด๋จธ·ํํจ์จ ๋ฑ ๋ ์งํ ์ฐ๊ตฌ์์ ๋งค์ฐ ์ค์ํด์.์ค๋์ SUVr ๊ณ์ฐ์ ๋ชจ๋ ๊ฒ์ ์ด๋ณด์๋ ๋ฐ๋ผ ํ ์ ์๋๋ก
์ค์ Slicer ํ๋ฉด ๊ธฐ์ค์ผ๋ก ํ๋ํ๋ ์์ธํ ์ค๋ช ํด ๋๋ฆด๊ฒ์.
"์๋๋ก ๋๋๋ฉด ๋๊ฐ ๋ ์ ๋ช ํด์ง๋ ๋ง๋ฒ!"์ฒ๋ผ ๋๊ปด๋ณด์ธ์.์ฌ์ฉ ๋ฒ์ ์ ๋ณด
- ์ฃผ ์ฌ์ฉ ๋ฒ์ : 3D Slicer 5.6.2 stable (2023๋ 12์ ๋ฆด๋ฆฌ์ค)
- ๋ณด์กฐ ํ์ธ ๋ฒ์ : 5.7.0 nightly (2025๋
1์ ๋น๋)
→ SUVr ๊ณ์ฐ์ ๋๋ถ๋ถ CSV ํ์ผ๋ก ๋ด๋ณด๋ด์ Excel์์ ํ๋ฏ๋ก ๋ฒ์ ์ฐจ์ด๋ ๊ฑฐ์ ์์ต๋๋ค.
PETStandardUptakeValueComputation ๋ชจ๋ ์คํ
↓
๊ฐ ์์ญ๋ณ SUV min/max/mean์ด CSV๋ก ์ ์ฅ๋จ
↓
CSV ํ์ผ ์ด๊ธฐ (Excel ๋๋ Google Sheets)
↓
์๋ ์์ญ SUV mean ๊ฐ ์ฐพ๊ธฐ
↓
๊ฐ ์์ญ SUV mean ÷ ์๋ SUV mean = SUVr
↓
์ ์ด์ SUVr ๊ฐ ์
๋ ฅ ํ ์ ์ฅ- Slicer์์ PETStandardUptakeValueComputation ๋ชจ๋ ์ด๊ธฐ
→ View → Modules → ๊ฒ์์ฐฝ์ “PETStandardUptakeValueComputation” ์ ๋ ฅ → ์ ํ - ์
๋ ฅ ์ค์ ํ์ธ
- PET Volume: ๋ฑ๋ก·์ ๊ทํ๋ PET ๋ณผ๋ฅจ ์ ํ
- VOI Volume: segment ํ์ผ(.seg.nrrd) ์ ํ
- PET DICOM Path: ์๋ณธ PET DICOM ํด๋ ๊ฒฝ๋ก ์ ๋ ฅ (ํค๋ ์ ๋ณด ํ์)
- Output CSV ์ฒดํฌ๋ฐ์ค ๊ผญ ์ฒดํฌ!
→ ์ฒดํฌ ์ ํ๋ฉด CSV ํ์ผ์ด ์ ๋ง๋ค์ด์ ธ์. - Compute ๋ฒํผ ํด๋ฆญ → ์งํ ๋ฐ ๋๋๋ฉด
→ ์ค๋ฅธ์ชฝ ํจ๋์ SUV ๊ฐ ๋ฌธ์์ด ์ถ๋ ฅ
→ CSV ํ์ผ์ Slicer ์คํ ํด๋ ๋๋ ์ง์ ๊ฒฝ๋ก์ ์ ์ฅ๋จ
(์: C:\Users\YourName\Documents\Slicer\SUV_values_2025-02-01.csv)
CSV ํ์ผ์ด ์ ๋ณด์ด๋ฉด Slicer ์ข ๋ฃ ํ ๋ค์ ์ด์ด๋ณด์ธ์.
ํ์ผ ์ด๋ฆ์ ๋ ์ง·์๊ฐ์ด ๋ถ์ด ๋์ต๋๋ค.2๋จ๊ณ: CSV ํ์ผ ์ด๊ธฐ & ์๋ SUV mean ๊ฐ ์ฐพ๊ธฐ
- ์ปดํจํฐ์์ CSV ํ์ผ ๋๋ธํด๋ฆญ → Excel ๋๋ Google Sheets ๋๋ LibreOffice Calc๋ก ์ด๊ธฐ
- ์ด ์ ๋ชฉ ํ์ธ
- ๋ณดํต ์ด๋ ๊ฒ ๋์ต๋๋ค:
LabelID | LabelName | SUVMin | SUVMax | SUVMean | PatientID | StudyDate ๋ฑ
- ๋ณดํต ์ด๋ ๊ฒ ๋์ต๋๋ค:
- ์๋ ์์ญ ์ฐพ๊ธฐ
- LabelName ์ด์์ “Cerebellum” ๋๋ “์๋” ๋๋ atlas์ ๋ฐ๋ผ
“Left-Cerebellum-Cortex”, “Right-Cerebellum-Cortex” ๋ฑ์ ๊ฒ์ - ํด๋น ํ์ SUVMean ์ด ๊ฐ ๋ณต์ฌ
์: ์๋ SUVMean = 2.15 (B10 ์ ์ด๋ผ๊ณ ๊ฐ์ )
- LabelName ์ด์์ “Cerebellum” ๋๋ “์๋” ๋๋ atlas์ ๋ฐ๋ผ
- LabelID 8 ๋๋ 9 → ์๋ ์์ญ
- SUVMean ๊ฐ์ด 1.8~2.5 ์ ๋๋ฉด ์ ์ ๋ฒ์ (ํ์๋ง๋ค ๋ค๋ฆ)
- Excel ์ ํ์ผ ์ด๊ธฐ (๋๋ ๊ธฐ์กด CSV ํ์ผ์์ ์ ์ํธ ์ถ๊ฐ)
- ์๋ณธ ๋ฐ์ดํฐ ๋ณต์ฌ
- A1 ์ : “LabelName”
- B1 ์ : “SUVMean”
- C1 ์ : “SUVr”
- A2๋ถํฐ LabelName, B2๋ถํฐ SUVMean ๋ณต์ฌ·๋ถ์ฌ๋ฃ๊ธฐ
- ์๋ SUV mean ๊ฐ ๊ณ ์ ์
๋ ฅ
- ์: ์๋ SUVMean์ด B10 ์ ์ ์๋ค๊ณ ๊ฐ์ → B10 ์ ์ ํ → ๋ณต์ฌ
- SUVr ๊ณต์ ์
๋ ฅ
- C2 ์
์ ์๋ ๊ณต์ ์
๋ ฅ:
=B2 / $B$10
→ B2 = ํด๋น ์์ญ SUVMean
→ $B$10 = ์๋ SUVMean (์ ๋ ์ฐธ์กฐ๋ก ๊ณ ์ – $ ๊ธฐํธ ์ค์!)
- C2 ์
์ ์๋ ๊ณต์ ์
๋ ฅ:
- ์ฑ์ฐ๊ธฐ
- C2 ์
์ค๋ฅธ์ชฝ ์๋ ์์ ๋ค๋ชจ(์ฑ์ฐ๊ธฐ ํธ๋ค) ์ก๊ณ ์๋๋ก ๋๋๊ทธ
→ ๋ชจ๋ ์์ญ SUVr ์๋ ๊ณ์ฐ ์๋ฃ!
- C2 ์
์ค๋ฅธ์ชฝ ์๋ ์์ ๋ค๋ชจ(์ฑ์ฐ๊ธฐ ํธ๋ค) ์ก๊ณ ์๋๋ก ๋๋๊ทธ
- ๊ฒฐ๊ณผ ํ์ธ
- SUVr ๊ฐ์ด 0.5~2.5 ์ ๋๋ฉด ์ ์ ๋ฒ์ (๋ ์์ญ·์งํ์ ๋ฐ๋ผ ๋ค๋ฆ)
- ๊ณ์ฐ ์๋ฃ ํ ์๋จ ๋ฉ๋ด ํ์ผ → ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ ํด๋ฆญ
- ํ์ผ ํ์: Excel ํตํฉ ๋ฌธ์ (*.xlsx) ์ ํ
- ํ์ผ ์ด๋ฆ ์ ๋ ฅ (์: Brain_PET_SUVr_2025-02-01.xlsx)
- ์ ์ฅ ์์น ์ ํ (๋ฐํํ๋ฉด ์ถ์ฒ) → ์ ์ฅ ํด๋ฆญ
- ์ ์ฅ ์๋ฃ! ์ด์ ์ด ํ์ผ์ ๋ ผ๋ฌธ·๋ณด๊ณ ์·๊ฐ์ ์๋ฃ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ด์.
- Slicer์์ ํธ์ง → Python Interactor ํด๋ฆญ → Python ์ฝ์ ์ด๊ธฐ
- ์๋ ์ฝ๋ ๋ณต์ฌ·๋ถ์ฌ๋ฃ๊ธฐ (CSV ๊ฒฝ๋ก์ ์๋ ๋ ์ด๋ธ ๋ฒํธ๋ ์ค์ ๋ก ๋ณ๊ฒฝ)
import pandas as pd # CSV ํ์ผ ๊ฒฝ๋ก (์์ ์ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝ) csv_path = "C:/Users/YourName/SUV_values.csv" # CSV ์ฝ๊ธฐ df = pd.read_csv(csv_path) # ์๋ ๋ ์ด๋ธ ๋ฒํธ (atlas์ ๋ฐ๋ผ ํ์ธ, ์: 8๋ฒ) cerebellum_label = 8 # ์๋ SUVMean ์ฐพ๊ธฐ cerebellum_mean = df[df['LabelID'] == cerebellum_label]['SUVMean'].values[0] # SUVr ๊ณ์ฐ df['SUVr'] = df['SUVMean'] / cerebellum_mean # Excel๋ก ์ ์ฅ output_excel = "C:/Users/YourName/Brain_PET_SUVr.xlsx" df.to_excel(output_excel, index=False) print(f"SUVr ๊ณ์ฐ ์๋ฃ! ํ์ผ ์ ์ฅ: {output_excel}") - ์ฝ์์์ Enter ๋๋ฌ ์คํ
→ ์ฑ๊ณตํ๋ฉด “SUVr ๊ณ์ฐ ์๋ฃ!” ๋ฉ์์ง + Excel ํ์ผ ์์ฑ
- CSV ์ด ์ด๋ฆ์ด ๋ค๋ฅด๋ฉด ์ฝ๋์์ ‘LabelID’, ‘SUVMean’ ๋ถ๋ถ์ ์ค์ ์ด ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ธ์.
- pandas๋ Slicer์ ๊ธฐ๋ณธ ๋ด์ฅ๋์ด ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- PETStandardUptakeValueComputation ์คํ → Output CSV ์ฒดํฌ → Compute → CSV ํ์ผ ์์ฑ
- CSV ํ์ผ ์ด๊ธฐ → ์๋ SUVMean ๊ฐ ์ฐพ๊ธฐ (์: B10 ์ )
- ์ Excel ์ํธ → LabelName·SUVMean ๋ณต์ฌ → C์ด์ ๊ณต์ =B2 / $B$10 ์ ๋ ฅ → ๋๋๊ทธ
- ํ์ผ → ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ → .xlsx๋ก ์ ์ฅ
- ์๋ํ ์ํ๋ฉด Python Interactor ์ด๊ธฐ → ์ ์ฝ๋ ์คํ → Excel ์๋ ์์ฑ
- 3D Slicer ๊ณต์ ๋ฌธ์ – PETStandardUptakeValueComputation
https://slicer.readthedocs.io/en/latest/user_guide/modules/petstandarduptakevaluecomputation.html - Slicer Python Interactor ์ฌ์ฉ๋ฒ
https://slicer.readthedocs.io/en/latest/developer_guide/scripting/python.html - Pandas to_excel ๋ฌธ์
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html - Slicer ํฌ๋ผ – SUVr ๊ณ์ฐ ์๋ํ ์ง๋ฌธ ๋ชจ์
https://discourse.slicer.org/search?q=SUVr%20python%20excel
#3DSlicer #SUVr๊ณ์ฐ #Excel์ ์ฅ #PythonInteractor #SUV์ถ์ถ #์ด๋ณด์๊ฐ์ด๋ #์๋ฃ์์ #Slicerํํ ๋ฆฌ์ผ #PET๋ถ์ #SUVr์๋ํ3D Slicer SUVr ๊ณ์ฐ ์ด๋ ค์? 5์คํ ์ผ๋ก ํด๊ฒฐ! ์ด๋ณด์๋ CSV→Excel ์๋ ์ฑ๊ณต, ์ ๋๋ ์ฐ๊ตฌ ๊ฒฐ๊ณผ ๊ธฐ์จ! https://draft.blogger.com/ (blogspot.com: 3D Slicer SUVr ๊ณ์ฐ·Excel ์ ์ฅ ์ด๋ณด ๋งค๋ด์ผ – 150์ ์ด๋ด ์ค๋ช )[^1]: “์๋ ๋ ์ด๋ธ ๋ฒํธ ์ฐพ๋๋ผ 1์๊ฐ ๋ ๋ ธ๋๋ฐ… ์ด์ ์ฝ๋ ํ ์ค๋ก ๋๋์ ๋๋ฌด ํธํด์!” – Slicer ํฌ๋ผ ์ค์ ์ฌ์ฉ์ ๋๊ธ ์ธ์ฉ.
๋๊ธ
๋๊ธ ์ฐ๊ธฐ