์น ์๋ฃ ์์ ๋ทฐ์ด์ ์ ํ์ค
Cornerstone3D ์์ ๋ถ์
์ํคํ ์ฒ, ๋ ๋๋ง ํ์ดํ๋ผ์ธ, ํจํค์ง ๊ตฌ์กฐ, ์ฅ๋จ์ ๊น์ง โ ์ง์ VTK.js๋ก ๋ทฐ์ด๋ฅผ ๋ง๋ ์๊ฐ์ผ๋ก ๋ถ์ํฉ๋๋ค.
Cornerstone3D๋?
Cornerstone3D๋ OHIF(Open Health Imaging Foundation)๊ฐ ์ฃผ๋ํ์ฌ ๊ฐ๋ฐํ ์น ๊ธฐ๋ฐ ์๋ฃ ์์ ๋ ๋๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. 2022๋ 4์์ ๊ณต๊ฐ๋ ์ดํ ๊ธฐ์กด Cornerstone(Legacy)์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , vtk.js๋ฅผ ๋ ๋๋ง ๋ฐฑ๋ณธ์ผ๋ก ์ฑํํ์ฌ GPU ๊ฐ์ ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์๋ฃ ์์ ๋ทฐ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋จ์ํ ๋ ๋๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ ์์ํฌ๋ก, DICOM ์ด๋ฏธ์ง ๋ก๋ฉ๋ถํฐ MPR, MIP, Volume Rendering, ์ธ๊ทธ๋ฉํ ์ด์ , ์ธก์ ๋๊ตฌ, ๋ทฐํฌํธ ๋๊ธฐํ๊น์ง ์๋ฃ ์์ ๋ทฐ์ด์ ํ์ํ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ด์ฅํฉ๋๋ค.
ํจํค์ง ๊ตฌ์กฐ
Cornerstone3D๋ ๊ด์ฌ์ฌ์ ๋ฐ๋ผ ๋ช ํํ ๋ถ๋ฆฌ๋ ๋ฉํฐ ํจํค์ง ๊ตฌ์กฐ๋ฅผ ์ฑํํฉ๋๋ค. ๊ฐ ํจํค์ง๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ค์นยท์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ธ ์ ์์ต๋๋ค.
๋ ๋๋ง ์์ง โ ํต์ฌ ํ์
Cornerstone3D์ ๊ฐ์ฅ ํฐ ๊ธฐ์ ์ ๋์ฝ์ ์คํ์คํฌ๋ฆฐ ๊ณต์ WebGL ์ปจํ ์คํธ์ ๋๋ค. ๊ธฐ์กด ๋ฐฉ์(๋ทฐํฌํธ๋ณ ๋ ๋ฆฝ WebGL ์ปจํ ์คํธ)์ ์ฑ๋ฅ ํ๊ณ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
๋ทฐํฌํธ๋ณ ๋ ๋ฆฝ ์ปจํ ์คํธ
- ๋ทฐํฌํธ๋ง๋ค ๋ณ๋ WebGL ์ปจํ ์คํธ ์์ฑ
- GPU ๋ฉ๋ชจ๋ฆฌ ์ค๋ณต ์ ์ (๋ณผ๋ฅจ N๊ฐ ๋ณต์ฌ)
- ๋ธ๋ผ์ฐ์ ์ปจํ ์คํธ ์ ์ ํ์ ์ทจ์ฝ
- PET/CT Fusion ๊ฐ์ ๋ณต์ก ๋ ์ด์์ ๋ถ๊ฐ
- ๋ทฐํฌํธ ์ฆ๊ฐ ์ ์ฑ๋ฅ ๊ธ๊ฒฉํ ์ ํ
๋จ์ผ ์คํ์คํฌ๋ฆฐ ๊ณต์ ์ปจํ ์คํธ
- ํ๋์ ์คํ์คํฌ๋ฆฐ ์บ๋ฒ์ค๋ก ์ ์ฒด ๋ทฐํฌํธ ๊ตฌ๋
- Shared Volume Mapper โ ํ ์ค์ฒ GPU์ 1๋ฒ๋ง ์ ๋ก๋
- ๋ทฐํฌํธ ์์ ๋ฌด๊ดํ๊ฒ ์ปจํ ์คํธ 1๊ฐ ์ ์ง
- 10๊ฐ ๋ทฐํฌํธ๋ ๋ณผ๋ฅจ 2๊ฐ(CT+PET)๋ง GPU์ ์ฌ๋ฆผ
- ์คํ์คํฌ๋ฆฐ โ ์จ์คํฌ๋ฆฐ ํฝ์ ๋ณต์ฌ๋ก ํ์
๋ฐ์ดํฐ ๋ก๋ฉ ํ์ดํ๋ผ์ธ
DICOMweb ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ๋ทฐํฌํธ์ ๋ ๋๋งํ๊ธฐ๊น์ง์ ํ๋ฆ์ ๋๋ค.
wadors:https://server/studies/.../frames/1 ํํ์ Image ID๋ก ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํฉ๋๋ค. MetaData Provider์์ PixelSpacing, ImagePosition ๋ฑ์ ์กฐํํฉ๋๋ค.์ฃผ์ ๊ธฐ๋ฅ ๋์กฐํ
Cornerstone3D์ ๋ด์ฅ ๊ธฐ๋ฅ๊ณผ ์ปค์คํ VTK.js ๊ตฌํ ๋ฐฉ์๊ณผ์ ์ฐจ์ด๋ฅผ ๋น๊ตํฉ๋๋ค.
| ๊ธฐ๋ฅ | Cornerstone3D | ์ปค์คํ VTK.js ๊ตฌํ | ๋์ด๋ ์ฐจ์ด |
|---|---|---|---|
| MPR (Axial/Sagittal/Coronal) | ๋ด์ฅ ์๋ ๊ตฌ์ฑ | vtkImageMapper + ์ขํ๊ณ ์ง์ ์ค์ | ์ฌ์ |
| MIP / Average Projection | ๋ด์ฅ BlendMode ํ ๊ธ | ์ง์ ๊ตฌํ ํ์ | ์ฌ์ |
| Volume Rendering | ๋ด์ฅ Transfer Function ํฌํจ | vtkVolumeMapper ์๋ ์ค์ | ๋ณดํต |
| ์ธ๊ทธ๋ฉํ ์ด์ ์ค๋ฒ๋ ์ด | ๋ด์ฅ Labelmap ยท Contour ยท Surface | RGBA ๋ณํ ํ vtkImageSlice | ์ฌ์ |
| ์ธ๊ทธ๋ฉํ ์ด์ ํธ์ง | ๋ด์ฅ Brush/Scissors/Threshold | ๋ณ๋ ๊ตฌํ ํ์ (๋งค์ฐ ๋ณต์ก) | ์ด๋ ค์ |
| ์ธก์ ๋๊ตฌ (Length, ROI) | ๋ด์ฅ SVG ์ด๋ ธํ ์ด์ + ๋ฌผ๋ฆฌ ๊ณต๊ฐ | SVG ์ค๋ฒ๋ ์ด + ์ขํ ๋ณํ ์ง์ ๊ตฌํ | ๋ณดํต |
| ํฌ๋ก์คํค์ด ๋๊ธฐํ | ๋ด์ฅ CrosshairsTool | ์ง์ ์ขํ ๋ณํ + ๋ ๋๋ฌ ์ฐ๋ | ๋ณดํต |
| ๋ทฐํฌํธ ๋๊ธฐํ | ๋ด์ฅ Synchronizer API | ์ง์ ์ด๋ฒคํธ ์ฐ๊ฒฐ | ๋ณดํต |
| DICOM ๋ก๋ฉ | ๋ด์ฅ DICOMweb ์์ ์ง์ | ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ | ์ฌ์ |
| ์ปค์คํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ | ์ ํ์ ์ถ์ํ ๋ ์ด์ด ๋ด๋ถ | VTK API ์ง์ ์ ์ด ๊ฐ๋ฅ | ์ด๋ ค์ |
| ๋นํ์ค ๋ฐ์ดํฐ ํฌ๋งท | ๋ถ๋ถ ์ง์ ํ๋ฌ๊ทธ์ธ ํํ | ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ๋ฅ | โ |
์ฅ์ ๊ณผ ๋จ์
- ๋น ๋ฅธ ๊ฐ๋ฐ ์๋
MPR, ์ธ๊ทธ๋ฉํ ์ด์ , ์ธก์ ๋๊ตฌ๊ฐ ๋ชจ๋ ๋ด์ฅ๋์ด ์๊ฐ์์น ์์ ์ด ์ค์น ํ ๋ฒ์ผ๋ก ํด๊ฒฐ๋ฉ๋๋ค. - ๊ณต์ GPU ํ
์ค์ฒ
Shared Volume Mapper๋ก ๋ณต์กํ PET-CT Fusion ๋ ์ด์์๋ ์ต์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ตฌ๋๋ฉ๋๋ค. - DICOM ํ์ค ์์ ์ง์
DICOMweb, WADO-RS/URI, DICOM SR ์ด๋ํฐ๊น์ง ์๋ฃ ํ์ค ์คํ์ด ๊ธฐ๋ณธ ํ์ฌ๋ฉ๋๋ค. - ์คํธ๋ฆฌ๋ฐ ๋ณผ๋ฅจ ๋ก๋
NIfTI/DICOM ๋ณผ๋ฅจ์ ์ฌ๋ผ์ด์ค ๋จ์๋ก ์ ์ง์ ์ผ๋ก ๋ก๋ํ์ฌ ์ด๊ธฐ ํ์ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. - AI ์ธ๊ทธ๋ฉํ
์ด์
๋ด์ฅ
SAM2 ๊ธฐ๋ฐ ์ค๋งํธ ์ธ๊ทธ๋ฉํ ์ด์ ์ด ๊ณต์ ํจํค์ง๋ก ์ ๊ณต๋ฉ๋๋ค. - OHIF Viewer ํตํฉ
์ํฐํ๋ผ์ด์ฆ๊ธ ๋ ํผ๋ฐ์ค ๋ทฐ์ด(OHIF)์ ๊ณต์ ํตํฉ CI/CD๊ฐ ์ด์๋ฉ๋๋ค. - SVG ์ด๋
ธํ
์ด์
๋ชจ๋ ์ธก์ ๋๊ตฌ๊ฐ SVG๋ก ๋ ๋๋ง๋์ด ์ด๋ค ํด์๋์์๋ ์ ๋ช ํ๊ฒ ํ์๋ฉ๋๋ค.
- ์ปค์คํฐ๋ง์ด์ง ํ๊ณ
์ถ์ํ ๋ ์ด์ด๊ฐ ๋๊บผ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ๊ธฐ ์ด๋ ต์ต๋๋ค. - ๋ฒ๋ค ํฌ๊ธฐ
vtk.js๋ฅผ ๋ด๋ถ์ ์ผ๋ก ํฌํจํ๋ฏ๋ก ๋ฒ๋ค์ด ํฝ๋๋ค. Tree-shaking ํจ๊ณผ๋ ์ ํ์ ์ ๋๋ค. - ๊ฐํ๋ฅธ ํ์ต ๊ณก์
RenderingEngine, Viewport, ToolGroup, Synchronizer ๋ฑ ๊ณ ์ ๊ฐ๋ ์ ์ต๋ํด์ผ ํฉ๋๋ค. - DICOM ์ค์ฌ ์ค๊ณ
NIfTI ๋ฑ ๋นํ์ค ํฌ๋งท ์ง์์ ๋ณ๋ ํจํค์ง๋ก ์ ๊ณต๋๋ฉฐ, REST API ๊ธฐ๋ฐ ์ปค์คํ ์ฐ๋์ ์ถ๊ฐ ์์ ์ด ํ์ํฉ๋๋ค. - API ๋ณ๊ฒฝ ์ฆ์
v1 โ v2 ๋ง์ด๊ทธ๋ ์ด์ ์์ ๋๊ท๋ชจ API ๊ฐํธ์ด ์์์ต๋๋ค. Breaking Change ๋น๋๊ฐ ๋์ต๋๋ค. - ๋๋ฒ๊น
๋์ด๋
vtk.js โ Cornerstone โ ๋๊ตฌ ๋ ์ด์ด์ 3์ค ์ถ์ํ๋ก ๋ฒ๊ทธ ์์ธ ์ถ์ ์ด ๋ณต์กํฉ๋๋ค.
์ธ์ Cornerstone3D๋ฅผ, ์ธ์ ์ปค์คํ VTK.js๋ฅผ?
| ์๋๋ฆฌ์ค | Cornerstone3D | ์ปค์คํ VTK.js |
|---|---|---|
| DICOM / DICOMweb ๊ธฐ๋ฐ ํ์ค ์ํฌํ๋ก | ๊ฐ๋ ฅ ์ถ์ฒ | ๋นํจ์จ |
| ๋น ๋ฅธ MVP, ์๊ท๋ชจ ํ | ์ ํฉ | ๋ฆฌ์์ค ๊ณผ๋ค |
| OHIF Viewer ๊ธฐ๋ฐ ํ์ฅ | ํ์ | ๋ถ๊ฐ |
| REST API ๊ธฐ๋ฐ ๋นํ์ค ๋ฐ์ดํฐ (NIfTI, .nii.gz) | ๊ฐ๋ฅ (ํ๋ฌ๊ทธ์ธ) | ์์ ๋กญ๊ฒ ๊ตฌํ |
| ๋ ์์ ์ธ ๋ทฐ ํ์ / ๋ ๋๋ง ๋ก์ง ํ์ | ์ ํ | ์ ํฉ |
| Canvas ๊ธฐ๋ฐ MIP / ์ปค์คํ ์ค๋ฒ๋ ์ด | ์ง์ ์ ๋จ | ์์ ๋กญ๊ฒ ๊ตฌํ |
| ์ธ๊ทธ๋ฉํ ์ด์ ํธ์ง ๋๊ตฌ (Brush, Scissors) | ๋ด์ฅ | ๊ตฌํ ๋์ด๋ ๋์ |
| ๋ฒ๋ค ํฌ๊ธฐ ์ต์ํ | ๋ถ๋ฆฌ | ์ ๋ฆฌ |
์ด๊ธฐํ ํ๋ฆ โ ์ฝ๋๋ก ๋ณด๊ธฐ
// 1. ํจํค์ง ์ค์น // pnpm add @cornerstonejs/core @cornerstonejs/tools @cornerstonejs/dicom-image-loader import * as cornerstone from '@cornerstonejs/core'; import * as cornerstoneTools from '@cornerstonejs/tools'; import dicomImageLoader from '@cornerstonejs/dicom-image-loader'; // 2. ์ด๊ธฐํ await cornerstone.init(); cornerstoneTools.init(); dicomImageLoader.init(); // 3. RenderingEngine ์์ฑ (๋จ์ผ WebGL ์ปจํ ์คํธ) const engine = new cornerstone.RenderingEngine('myEngine'); // 4. ๋ทฐํฌํธ ๊ตฌ์ฑ (MPR 3๋ถํ ) engine.setViewports([ { viewportId: 'axial', type: 'ORTHOGRAPHIC', element: divAxial, defaultOptions: { orientation: 'AXIAL' } }, { viewportId: 'sagittal', type: 'ORTHOGRAPHIC', element: divSagittal, defaultOptions: { orientation: 'SAGITTAL' } }, { viewportId: 'coronal', type: 'ORTHOGRAPHIC', element: divCoronal, defaultOptions: { orientation: 'CORONAL' } }, ]); // 5. ๋ณผ๋ฅจ ๋ก๋ (์คํธ๋ฆฌ๋ฐ) const volume = await cornerstone.volumeLoader.createAndCacheVolume( volumeId, { imageIds } ); await volume.load(); // ์ ์ง์ ๋ก๋ ์์ // 6. ๋๊ตฌ ๊ทธ๋ฃน ์ค์ const toolGroup = cornerstoneTools.ToolGroupManager.createToolGroup('tg'); toolGroup.addTool(cornerstoneTools.LengthTool.toolName); toolGroup.addViewport('axial', 'myEngine'); toolGroup.setToolActive(cornerstoneTools.LengthTool.toolName);
๊ฒฐ๋ก โ ์ด๋ค ์ ํ์ด ๋ง์๊น?
Cornerstone3D๋ ํ์ค DICOM ์ํฌํ๋ก๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํด์ผ ํ๋ ํ์๊ฒ๋ ํ์กดํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ ํ์ง์ ๋๋ค. ๊ณต์ GPU ํ ์ค์ฒ, ์คํธ๋ฆฌ๋ฐ ๋ณผ๋ฅจ ๋ก๋, ๋ด์ฅ ์ธ๊ทธ๋ฉํ ์ด์ ํธ์ง ๋๊ตฌ๋ ์ง์ ๊ตฌํํ๋ ค๋ฉด ์๊ฐ์์ด ๊ฑธ๋ฆฌ๋ ๊ธฐ๋ฅ๋ค์ ๋๋ค.
๋ฐ๋ฉด ๋นํ์ค ๋ฐ์ดํฐ ํฌ๋งท(NIfTI REST API), ๋ ์์ ๋ทฐ ํ์ , Canvas ๊ธฐ๋ฐ ์ปค์คํ ๋ ๋๋ง์ด ํต์ฌ์ธ ํ๋ก์ ํธ๋ผ๋ฉด ์ปค์คํ VTK.js ๊ตฌํ์ด ๋ ์ ํฉํฉ๋๋ค. Cornerstone3D์ ์ถ์ํ ๋ ์ด์ด๋ ์ด๋ฐ ๊ฒฝ์ฐ ์คํ๋ ค ๊ฑธ๋ฆผ๋์ด ๋ ์ ์์ต๋๋ค.