๐Ÿง 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์—์„œ ํ•˜๋ฏ€๋กœ ๋ฒ„์ „ ์ฐจ์ด๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
SUVr ๊ณ„์‚ฐ ์ „์ฒด ํ๋ฆ„๋„ (ํ•œ๋ˆˆ์— ๋ณด๊ธฐ)
PETStandardUptakeValueComputation ๋ชจ๋“ˆ ์‹คํ–‰
↓
๊ฐ ์˜์—ญ๋ณ„ SUV min/max/mean์ด CSV๋กœ ์ €์žฅ๋จ
↓
CSV ํŒŒ์ผ ์—ด๊ธฐ (Excel ๋˜๋Š” Google Sheets)
↓
์†Œ๋‡Œ ์˜์—ญ SUV mean ๊ฐ’ ์ฐพ๊ธฐ
↓
๊ฐ ์˜์—ญ SUV mean ÷ ์†Œ๋‡Œ SUV mean = SUVr
↓
์ƒˆ ์—ด์— SUVr ๊ฐ’ ์ž…๋ ฅ ํ›„ ์ €์žฅ
1๋‹จ๊ณ„: PETStandardUptakeValueComputation ๋ชจ๋“ˆ์—์„œ CSV ํŒŒ์ผ ์–ป๊ธฐ(์ด๋ฏธ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰ํ–ˆ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์€ ๊ฑด๋„ˆ๋›ฐ์„ธ์š”)
  1. Slicer์—์„œ PETStandardUptakeValueComputation ๋ชจ๋“ˆ ์—ด๊ธฐ
    → View → Modules → ๊ฒ€์ƒ‰์ฐฝ์— “PETStandardUptakeValueComputation” ์ž…๋ ฅ → ์„ ํƒ
  2. ์ž…๋ ฅ ์„ค์ • ํ™•์ธ
    • PET Volume: ๋“ฑ๋ก·์ •๊ทœํ™”๋œ PET ๋ณผ๋ฅจ ์„ ํƒ
    • VOI Volume: segment ํŒŒ์ผ(.seg.nrrd) ์„ ํƒ
    • PET DICOM Path: ์›๋ณธ PET DICOM ํด๋” ๊ฒฝ๋กœ ์ž…๋ ฅ (ํ—ค๋” ์ •๋ณด ํ•„์ˆ˜)
  3. Output CSV ์ฒดํฌ๋ฐ•์Šค ๊ผญ ์ฒดํฌ!
    → ์ฒดํฌ ์•ˆ ํ•˜๋ฉด CSV ํŒŒ์ผ์ด ์•ˆ ๋งŒ๋“ค์–ด์ ธ์š”.
  4. Compute ๋ฒ„ํŠผ ํด๋ฆญ → ์ง„ํ–‰ ๋ฐ” ๋๋‚˜๋ฉด
    → ์˜ค๋ฅธ์ชฝ ํŒจ๋„์— SUV ๊ฐ’ ๋ฌธ์ž์—ด ์ถœ๋ ฅ
    → CSV ํŒŒ์ผ์€ Slicer ์‹คํ–‰ ํด๋” ๋˜๋Š” ์ง€์ • ๊ฒฝ๋กœ์— ์ €์žฅ๋จ
    (์˜ˆ: C:\Users\YourName\Documents\Slicer\SUV_values_2025-02-01.csv)
ํŒ
CSV ํŒŒ์ผ์ด ์•ˆ ๋ณด์ด๋ฉด Slicer ์ข…๋ฃŒ ํ›„ ๋‹ค์‹œ ์—ด์–ด๋ณด์„ธ์š”.
ํŒŒ์ผ ์ด๋ฆ„์— ๋‚ ์งœ·์‹œ๊ฐ„์ด ๋ถ™์–ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
2๋‹จ๊ณ„: CSV ํŒŒ์ผ ์—ด๊ธฐ & ์†Œ๋‡Œ SUV mean ๊ฐ’ ์ฐพ๊ธฐ
  1. ์ปดํ“จํ„ฐ์—์„œ CSV ํŒŒ์ผ ๋”๋ธ”ํด๋ฆญ → Excel ๋˜๋Š” Google Sheets ๋˜๋Š” LibreOffice Calc๋กœ ์—ด๊ธฐ
  2. ์—ด ์ œ๋ชฉ ํ™•์ธ
    • ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค:
      LabelID | LabelName | SUVMin | SUVMax | SUVMean | PatientID | StudyDate ๋“ฑ
  3. ์†Œ๋‡Œ ์˜์—ญ ์ฐพ๊ธฐ
    • LabelName ์—ด์—์„œ “Cerebellum” ๋˜๋Š” “์†Œ๋‡Œ” ๋˜๋Š” atlas์— ๋”ฐ๋ผ
      “Left-Cerebellum-Cortex”, “Right-Cerebellum-Cortex” ๋“ฑ์„ ๊ฒ€์ƒ‰
    • ํ•ด๋‹น ํ–‰์˜ SUVMean ์—ด ๊ฐ’ ๋ณต์‚ฌ
      ์˜ˆ: ์†Œ๋‡Œ SUVMean = 2.15 (B10 ์…€์ด๋ผ๊ณ  ๊ฐ€์ •)
์‹ค์ œ ์˜ˆ์‹œ (Harvard-Oxford atlas ๊ธฐ์ค€)
  • LabelID 8 ๋˜๋Š” 9 → ์†Œ๋‡Œ ์˜์—ญ
  • SUVMean ๊ฐ’์ด 1.8~2.5 ์ •๋„๋ฉด ์ •์ƒ ๋ฒ”์œ„ (ํ™˜์ž๋งˆ๋‹ค ๋‹ค๋ฆ„)
3๋‹จ๊ณ„: ์ƒˆ Excel ์‹œํŠธ์—์„œ SUVr ๊ณ„์‚ฐ
  1. Excel ์ƒˆ ํŒŒ์ผ ์—ด๊ธฐ (๋˜๋Š” ๊ธฐ์กด CSV ํŒŒ์ผ์—์„œ ์ƒˆ ์‹œํŠธ ์ถ”๊ฐ€)
  2. ์›๋ณธ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
    • A1 ์…€: “LabelName”
    • B1 ์…€: “SUVMean”
    • C1 ์…€: “SUVr”
    • A2๋ถ€ํ„ฐ LabelName, B2๋ถ€ํ„ฐ SUVMean ๋ณต์‚ฌ·๋ถ™์—ฌ๋„ฃ๊ธฐ
  3. ์†Œ๋‡Œ SUV mean ๊ฐ’ ๊ณ ์ • ์ž…๋ ฅ
    • ์˜ˆ: ์†Œ๋‡Œ SUVMean์ด B10 ์…€์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ • → B10 ์…€ ์„ ํƒ → ๋ณต์‚ฌ
  4. SUVr ๊ณต์‹ ์ž…๋ ฅ
    • C2 ์…€์— ์•„๋ž˜ ๊ณต์‹ ์ž…๋ ฅ:
      =B2 / $B$10
      → B2 = ํ•ด๋‹น ์˜์—ญ SUVMean
      → $B$10 = ์†Œ๋‡Œ SUVMean (์ ˆ๋Œ€ ์ฐธ์กฐ๋กœ ๊ณ ์ • – $ ๊ธฐํ˜ธ ์ค‘์š”!)
  5. ์ฑ„์šฐ๊ธฐ
    • C2 ์…€ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ž‘์€ ๋„ค๋ชจ(์ฑ„์šฐ๊ธฐ ํ•ธ๋“ค) ์žก๊ณ  ์•„๋ž˜๋กœ ๋“œ๋ž˜๊ทธ
      → ๋ชจ๋“  ์˜์—ญ SUVr ์ž๋™ ๊ณ„์‚ฐ ์™„๋ฃŒ!
  6. ๊ฒฐ๊ณผ ํ™•์ธ
    • SUVr ๊ฐ’์ด 0.5~2.5 ์ •๋„๋ฉด ์ •์ƒ ๋ฒ”์œ„ (๋‡Œ ์˜์—ญ·์งˆํ™˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)
4๋‹จ๊ณ„: Excel ํŒŒ์ผ ์ €์žฅ
  1. ๊ณ„์‚ฐ ์™„๋ฃŒ ํ›„ ์ƒ๋‹จ ๋ฉ”๋‰ด ํŒŒ์ผ → ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ ํด๋ฆญ
  2. ํŒŒ์ผ ํ˜•์‹: Excel ํ†ตํ•ฉ ๋ฌธ์„œ (*.xlsx) ์„ ํƒ
  3. ํŒŒ์ผ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: Brain_PET_SUVr_2025-02-01.xlsx)
  4. ์ €์žฅ ์œ„์น˜ ์„ ํƒ (๋ฐ”ํƒ•ํ™”๋ฉด ์ถ”์ฒœ) → ์ €์žฅ ํด๋ฆญ
  5. ์ €์žฅ ์™„๋ฃŒ! ์ด์ œ ์ด ํŒŒ์ผ์„ ๋…ผ๋ฌธ·๋ณด๊ณ ์„œ·๊ฐ•์˜ ์ž๋ฃŒ์— ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
5๋‹จ๊ณ„: ์ž๋™ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? Slicer Python์œผ๋กœ ํ•œ ๋ฒˆ์— SUVr ๊ณ„์‚ฐ
  1. Slicer์—์„œ ํŽธ์ง‘ → Python Interactor ํด๋ฆญ → Python ์ฝ˜์†” ์—ด๊ธฐ
  2. ์•„๋ž˜ ์ฝ”๋“œ ๋ณต์‚ฌ·๋ถ™์—ฌ๋„ฃ๊ธฐ (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}")
  3. ์ฝ˜์†”์—์„œ Enter ๋ˆŒ๋Ÿฌ ์‹คํ–‰
    → ์„ฑ๊ณตํ•˜๋ฉด “SUVr ๊ณ„์‚ฐ ์™„๋ฃŒ!” ๋ฉ”์‹œ์ง€ + Excel ํŒŒ์ผ ์ƒ์„ฑ
ํŒ
  • CSV ์—ด ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด ์ฝ”๋“œ์—์„œ ‘LabelID’, ‘SUVMean’ ๋ถ€๋ถ„์„ ์‹ค์ œ ์—ด ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.
  • pandas๋Š” Slicer์— ๊ธฐ๋ณธ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์š”์•ฝ – SUVr ๊ณ„์‚ฐ & Excel ์ €์žฅ ์ „์ฒด ํด๋ฆญ ์ˆœ์„œ
  1. PETStandardUptakeValueComputation ์‹คํ–‰ → Output CSV ์ฒดํฌ → Compute → CSV ํŒŒ์ผ ์ƒ์„ฑ
  2. CSV ํŒŒ์ผ ์—ด๊ธฐ → ์†Œ๋‡Œ SUVMean ๊ฐ’ ์ฐพ๊ธฐ (์˜ˆ: B10 ์…€)
  3. ์ƒˆ Excel ์‹œํŠธ → LabelName·SUVMean ๋ณต์‚ฌ → C์—ด์— ๊ณต์‹ =B2 / $B$10 ์ž…๋ ฅ → ๋“œ๋ž˜๊ทธ
  4. ํŒŒ์ผ → ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ → .xlsx๋กœ ์ €์žฅ
  5. ์ž๋™ํ™” ์›ํ•˜๋ฉด Python Interactor ์—ด๊ธฐ → ์œ„ ์ฝ”๋“œ ์‹คํ–‰ → Excel ์ž๋™ ์ƒ์„ฑ
์ด ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋ฉด ์ค‘๊ฐ„์— ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  SUVr ๊ฐ’ ๊ณ„์‚ฐ๊ณผ Excel ์ €์žฅ๊นŒ์ง€ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”!์ฐธ๊ณ ๋ฌธํ—Œ & ์œ ์šฉํ•œ ๋งํฌํƒœ๊ทธ ๊ฒ€์ƒ‰
#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 ํฌ๋Ÿผ ์‹ค์ œ ์‚ฌ์šฉ์ž ๋Œ“๊ธ€ ์ธ์šฉ.

๋Œ“๊ธ€

์ด ๋ธ”๋กœ๊ทธ์˜ ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

ํžˆ๋ธŒ๋ฆฌ์ธ, ์ด์Šค๋ผ์—˜์ธ, ์œ ๋Œ€์ธ ์„ฑ๊ฒฝ ์† ์ด๋ฆ„์— ์ˆจ๊ฒจ์ง„ ์†Œ๋ฆ„ ๋‹๋Š” ๋น„๋ฐ€

์ž‘์€ ํ‹ˆ์ด ๋ฌด๋„ˆ๋œจ๋ฆฐ๋‹ค ์™œ ์šฐ๋ฆฌ๋Š” ‘์‚ฌ์†Œํ•œ ๋ถ„์—ด’์„ ๊ทน๋„๋กœ ๊ฒฝ๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€

์ž‘์€ ํ‹ˆ์ด ๋ฌด๋„ˆ๋œจ๋ฆฐ๋‹ค ์™œ ์„ฑ๊ฒฝ์€ ‘๋ถ„์—ด์˜ ์‹œ์ž‘’์„ ๊ทธ๋ ‡๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋Š”๊ฐ€