Cornerstone3D์์ NIfTI๋ฅผ ์ด๋ค๋ฉด?
1024ร1024 ํด์๋๊น์ง
DICOM ๋ฉํ๋ฐ์ดํฐ ์์ด NIfTI ํ์ผ์ Cornerstone3D์ ๋ก๋ํ ๋ ๋ฐ์ํ๋ ๊ตฌ์กฐ์ ์ฐจ์ด, ์ ์ฝ์ฌํญ, ๊ทธ๋ฆฌ๊ณ 1024ร1024 ๊ณ ํด์๋ ๋ก๋ ์ ์์๋๋ ๋ฌธ์ ๋ฅผ ๊ธฐ์ ์ ์ผ๋ก ๊ฒํ ํฉ๋๋ค.
์ ์ด ๊ฒํ ๊ฐ ํ์ํ๊ฐ
Cornerstone3D๋ DICOM์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ ํ๋ ์์ํฌ์ ๋๋ค. ๋ด๋ถ ๋ ๋๋ง ํ์ดํ๋ผ์ธ, ๋ฉํ๋ฐ์ดํฐ ์์คํ , ์ธก์ ๋๊ตฌ, ์ด๋ ธํ ์ด์ ์ ์ฅ ๋ชจ๋ DICOM ํ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ ์ ๋ก ๋์ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ AI ์ถ๋ก ๊ฒฐ๊ณผ๋ฌผ, ์ฐ๊ตฌ์ฉ ๋ฐ์ดํฐ, ๋์์ ๋ถ์ ๋ฑ ๋ค์ํ ์๋๋ฆฌ์ค์์ DICOM์ด ์๋ NIfTI(.nii, .nii.gz) ํฌ๋งท์ Cornerstone3D๋ก ๋ ๋๋งํด์ผ ํ๋ ์๊ตฌ๊ฐ ์๊น๋๋ค.
์ฌ๊ธฐ์ 1024ร1024 ํด์๋๋ผ๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋๋ฉด, ์ผ๋ฐ CT ํ์ค(512ร512)์ 4๋ฐฐ ํฝ์ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ GPU ํ ์ค์ฒ์ ์ด๋ค ์๋ฐ์ ์ฃผ๋์ง๋ ํจ๊ป ๋ถ์ํด์ผ ํฉ๋๋ค. ์ด ๊ธ์ ํด๋น ์กฐํฉ์ด ์ค์ ํ๋ก๋์ ์์ ์ด๋ค ๋ฆฌ์คํฌ๋ฅผ ๋ดํฌํ๋์ง ๊ธฐ์ ์ ์ผ๋ก ์ ๊ฒํฉ๋๋ค.
NIfTI์ DICOM โ ๊ตฌ์กฐ์ ์ฐจ์ด
๋ ํฌ๋งท์ ์ค๊ณ ์ฒ ํ์ด ๋ค๋ฆ ๋๋ค. DICOM์ ์์ ํ๊ฒฝ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๋ ํฌ๊ด์ ํ์ค์ด๊ณ , NIfTI๋ ์ ๊ฒฝ์์ ์ฐ๊ตฌ์๋ฅผ ์ํ ๋ฏธ๋๋ฉํ ํฌ๋งท์ ๋๋ค. Cornerstone3D๊ฐ ์ ์ ํ๋ ๋ฉํ๋ฐ์ดํฐ์ ์๋น์๊ฐ NIfTI์๋ ์กด์ฌํ์ง ์์ต๋๋ค.
| ํญ๋ชฉ | DICOM | NIfTI | Cornerstone3D ์ํฅ |
|---|---|---|---|
| ํ์ผ ๊ตฌ์กฐ | ์ฌ๋ผ์ด์ค๋น 1๊ฐ ํ์ผ | ๋ณผ๋ฅจ ์ ์ฒด 1๊ฐ ํ์ผ | ImageId ์์ฑ ๋ฐฉ์ ์์ด |
| ํ์ ์ ๋ณด | PatientName, PatientID, StudyDate ๋ฑ | ์์ | ๋ทฐํฌํธ ์ค๋ฒ๋ ์ด ํ์ ๋ถ๊ฐ |
| ๋ชจ๋ฌ๋ฆฌํฐ | CT, MR, PET ๋ฑ ๋ช ์ | ์์ | ์๋ W/L ํ๋ฆฌ์ ์ ์ฉ ๋ถ๊ฐ |
| Window/Level | WindowCenter, WindowWidth ํ๊ทธ | ์์ | ์ง์ ๊ณ์ฐํด์ ์ฃผ์ ํ์ |
| ์ขํ๊ณ | LPS (Left-Posterior-Superior) | RAS (Right-Anterior-Superior) | ์ถ ๋ฐ์ ์์ผ๋ฉด ์ข์ฐ ๋ค์งํ |
| Spacing/Origin | PixelSpacing, ImagePosition | pixdim, sform/qform ํ๋ ฌ | ๋ณํ ์ฒ๋ฆฌ ํ์ |
| ์ฌ๋ผ์ด์ค ์์ | SliceLocation์ผ๋ก ๋ช ์ | ๋ฐฐ์ด ์์ ์์กด | MPR ๋ฐฉํฅ ์ค๋ฅ ๊ฐ๋ฅ์ฑ |
| ์์ถ | HTJ2K, JPEG2K ๋ฑ (Progressive ์ง์) | gzip ์ ์ฒด ์์ถ๋ง | Progressive Loading ๋ถ๊ฐ |
| ์ธก์ ๊ฐ ์ ์ฅ | DICOM SR ํ์ค ํ์ | ์์ | ์ด๋ ธํ ์ด์ ํ์ค ์ ์ฅ ๋ถ๊ฐ |
| ์ธ๊ทธ๋ฉํ ์ด์ | DICOM SEG ํ์ค | ๋ณ๋ .nii ํ์ผ | CS3D SEG ์ด๋ํฐ ์ฐ๋ ๋ถ๊ฐ |
์ขํ๊ณ ์ถฉ๋ โ RAS vs LPS
๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ๊ธฐ์ ์ ํจ์ ์ ๋๋ค. DICOM์ LPS(Left-Posterior-Superior), NIfTI๋ RAS(Right-Anterior-Superior)๋ฅผ ์ฌ์ฉํฉ๋๋ค. X์ถ๊ณผ Y์ถ ๋ฐฉํฅ์ด ์ ๋ฐ๋์ฌ์, ๋ณํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ๋ทฐํฌํธ์์ ์ด๋ฏธ์ง๊ฐ ์ข์ฐยท์ ํ ๋ฐ์ ๋์ด ๋ํ๋ฉ๋๋ค.
Cornerstone3D์ @cornerstonejs/nifti-volume-loader๋ v2.0๋ถํฐ sform/qform ํ๋ ฌ์ ์ฝ์ด LPS๋ก ์๋ ๋ณํ์ ์๋ํฉ๋๋ค. ๋จ, ๋นํ์ค์ ์ผ๋ก ์์ฑ๋ NIfTI ํ์ผ์ sform_code๊ฐ 0์ด๊ฑฐ๋ ํ๋ ฌ์ด ์๋ชป ์ค์ ๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์๋ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
๋ฉํ๋ฐ์ดํฐ ๋ถ์ฌ๊ฐ ๋ง๋๋ ๊ธฐ๋ฅ ๊ณต๋ฐฑ
DICOM์ ์๋ฐฑ ๊ฐ ํ๊ทธ์ ๋ฌ๋ฆฌ NIfTI ํค๋๋ ๊ณต๊ฐ ์ ๋ณด(spacing, origin, direction)์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ง ํฌํจํฉ๋๋ค. Cornerstone3D๊ฐ DICOM ํ๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ด ํ๋์ฉ ๋ฌด๋์ง๋๋ค.
Cornerstone3D์ NIfTI ๋ก๋ ์ํคํ ์ฒ
@cornerstonejs/nifti-volume-loader๋ v2.0์์ imageId-first ๋ฐฉ์์ผ๋ก ์ ๋ฉด ์ฌ์ค๊ณ๋์์ต๋๋ค. ๊ธฐ์กด volume-first ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ NIfTI ํ์ผ์ ์ฌ๋ผ์ด์ค ๋จ์ imageId๋ก ๋ถํดํ์ฌ ์ผ๋ฐ DICOM ๋ณผ๋ฅจ๊ณผ ๋์ผํ ํ์ดํ๋ผ์ธ์์ ์ฒ๋ฆฌํฉ๋๋ค.
nifti:https://server/file.nii.gz#0, #1, ... ํํ๋ก ๊ฐ ์ฌ๋ผ์ด์ค๋ฅผ imageId๋ก ๋ถํดํฉ๋๋ค. DICOM๊ณผ ๋์ผํ imageId ๊ธฐ๋ฐ ์์คํ
์ ์ฌ์ฌ์ฉํฉ๋๋ค.// @cornerstonejs/nifti-volume-loader v2 ์ฌ์ฉ๋ฒ import { cornerstoneNiftiImageLoader, createNiftiImageIdsAndCacheMetadata, } from '@cornerstonejs/nifti-volume-loader'; import { imageLoader, volumeLoader } from '@cornerstonejs/core'; // 1. NIfTI ์ด๋ฏธ์ง ๋ก๋ ๋ฑ๋ก imageLoader.registerImageLoader('nifti', cornerstoneNiftiImageLoader); // 2. ํค๋ ํ์ฑ & imageId ๋ฐฐ์ด ์์ฑ (์ฌ๋ผ์ด์ค ์๋งํผ ์์ฑ๋จ) const imageIds = await createNiftiImageIdsAndCacheMetadata({ url: 'https://server/brain_1024.nii.gz', }); // โ ['nifti:https://...#0', 'nifti:https://...#1', ... '#N'] // 3. Stack Viewport (v2 ์ ๊ท โ Volume ์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ) viewport.setStack(imageIds); // 4. Volume Viewport (๊ธฐ์กด ๋ฐฉ์) const volume = await volumeLoader.createAndCacheVolume(volumeId, { imageIds }); await volume.load(); // โ ๏ธ Window/Level์ ์ง์ ๊ณ์ฐ ํ ์ค์ ํ์ viewport.setProperties({ voiRange: { lower: -1000, upper: 3000 } });
1024ร1024 ํด์๋ โ ๋ฉ๋ชจ๋ฆฌ ์ค์ธก ๊ณ์ฐ
ํ์ค CT๋ 512ร512 ํด์๋์ ๋๋ค. 1024ร1024๋ ํฝ์ ์๊ฐ 4๋ฐฐ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ๋ ๋จ์ํ 4๋ฐฐ๊ฐ ์๋๋ผ CPU + GPU ์์ชฝ์์ ๋ณตํฉ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
* CPU + GPU ํฉ์ฐ / 300์ฌ๋ผ์ด์ค ๊ธฐ์ค
WebGL 3D ํ ์ค์ฒ ํ๊ณ โ ๊ฐ์ฅ ๋จผ์ ๋งํ๋ ๋ฒฝ
๋ฉ๋ชจ๋ฆฌ ์ด์ ์ WebGL 3D ํ ์ค์ฒ ํฌ๊ธฐ ์ ํ์ด ๋จผ์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ GPU์ ๋ฐ๋ผ ์ต๋ ํ ์ค์ฒ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉฐ, 1024ร1024ร300 ๋ณผ๋ฅจ์ ๋จ์ผ 3D ํ ์ค์ฒ๋ก ์ฌ๋ฆฌ๋ ค๊ณ ํ๋ฉด ๋ด์ฅ ๊ทธ๋ํฝ ํ๊ฒฝ์์ ์คํจํ ์ ์์ต๋๋ค.
| ํ๊ฒฝ | MAX_3D_TEXTURE_SIZE | 1024ร1024ร300 ๊ฐ๋ฅ ์ฌ๋ถ | ๋น๊ณ |
|---|---|---|---|
| ์ธ์ฅ GPU (๋ฐ์คํฌํ) | 2048 ~ 16384 | ๋๋ถ๋ถ ๊ฐ๋ฅ | ๊ณ ์ฑ๋ฅ GPU๋ ๋ฌธ์ ์์ |
| ๋ด์ฅ GPU (Intel/AMD) | 512 ~ 2048 | ํ๊ฒฝ ์์กด | 512 ์ ํ ์ ์คํจ |
| Apple Silicon (M1/M2) | 2048 | ๊ฐ๋ฅ | ํตํฉ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ |
| ๋ชจ๋ฐ์ผ (iOS Safari) | 512 ~ 1024 | ์ํ | OOM ํฌ๋์ ๋น๋ฒ |
| ๋ชจ๋ฐ์ผ (Android Chrome) | 512 ~ 2048 | ๊ธฐ๊ธฐ ์์กด | ๋ฉ๋ชจ๋ฆฌ ์๋ฐ ์ฌ๊ฐ |
gl.MAX_3D_TEXTURE_SIZE๊ฐ 512์ธ ๊ธฐ๊ธฐ์ 1024ร1024 ํ
์ค์ฒ๋ฅผ ์ฌ๋ฆฌ๋ ค ํ๋ฉด GL_INVALID_VALUE ์๋ฌ์ ํจ๊ป ํ
์ค์ฒ ์์ฑ์ด ์คํจํฉ๋๋ค. Cornerstone3D๋ ์ด ์ํฉ์์ ๋ ๋๋ง์ด ์์ ํ ์ค๋จ๋ฉ๋๋ค. ํ๋ก๋์
๋ฐฐํฌ ์ ๋ฐ๋์ ์ต์ ์ฌ์ ๊ธฐ๊ธฐ์์ ๊ฒ์ฆํ์ธ์.
// ๋ฐํ์์์ WebGL ์ต๋ ํ ์ค์ฒ ํฌ๊ธฐ ํ์ธ const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl2'); const maxTexSize = gl.getParameter(gl.MAX_3D_TEXTURE_SIZE); console.log(`MAX_3D_TEXTURE_SIZE: ${maxTexSize}`); // 1024ร1024 ์ ์ฌ ๊ฐ๋ฅ ์ฌ๋ถ ์ฌ์ ์ฒดํฌ if (maxTexSize < 1024) { // ๋ค์ด์ํ ๋ฒ์ ์ผ๋ก ํด๋ฐฑ loadLowResolutionVolume(); } else { loadFullResolutionVolume(); }
NIfTI 1024ร1024 โ ์ฅ์ ๊ณผ ๋จ์ ์ข ํฉ
- AI ํ์ดํ๋ผ์ธ๊ณผ์ ์ง์ ์ฐ๊ฒฐ
AI ๋ชจ๋ธ์ด NIfTI๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ ๋ณํ ์์ด ๋ฐ๋ก ๋ ๋๋ง ๊ฐ๋ฅ - ๋จ์ผ ํ์ผ ๊ด๋ฆฌ
DICOM์ฒ๋ผ ์ฌ๋ผ์ด์ค๋ง๋ค ํ์ผ์ด ๋ถ๋ฆฌ๋์ง ์์ ํ์ผ ๊ด๋ฆฌ๊ฐ ๋จ์ - ๊ณ ํด์๋ ์ธ๋ถ ํํ
1024ร1024๋ 512ร512 ๋๋น ๋ฏธ์ธ ๊ตฌ์กฐ(ํ๊ด, ๋ณ๋ณ ๊ฒฝ๊ณ) ํํ๋ ฅ 4๋ฐฐ ํฅ์ - ์ฐ๊ตฌ/๋ถ์ ๋๊ตฌ ํธํ์ฑ
FSL, FreeSurfer, ANTs ๋ฑ ์ ๊ฒฝ์์ ๋ถ์ ๋๊ตฌ์ ํฌ๋งท ์ผ์น
- ๋ฉ๋ชจ๋ฆฌ 2~4GB ์๊ตฌ
์ธ๊ทธ๋ฉํ ์ด์ ํฌํจ ์ ์ ์ฌ์ ๊ธฐ๊ธฐ์์ ํญ ํฌ๋์ ์ํ - Progressive Loading ๋ถ๊ฐ
gzip ์ ์ฒด ์์ถ ํน์ฑ์ ์ ์ง์ ๋ ๋๋ง ์์ด ์ด๊ธฐ ๋ก๋ฉ ๋๋ฆผ - ์ขํ๊ณ ๋ณํ ์ค๋ฅ ์ํ
sform/qform ๋นํ์ค ํ์ผ ์ ์์ ์ข์ฐ ๋ฐ์ ๋ฑ ์์์ ์ค๋ฅ - ์์ ๋ฉํ๋ฐ์ดํฐ ์์ ๋ถ์ฌ
ํ์ ์ ๋ณด, W/L ํ๋ฆฌ์ , ๋ชจ๋ฌ๋ฆฌํฐ ๊ธฐ๋ฐ ๊ธฐ๋ฅ ๋ชจ๋ ์๋ ๊ตฌํ - DICOM ํ์ค ๋๊ตฌ ๋ฏธํธํ
์ธก์ ๊ฐ SR ์ ์ฅ, DICOM SEG ์ฐ๋, PACS ์ฐ๋ ๋ถ๊ฐ - WebGL ํ
์ค์ฒ ํ๊ณ ์ถฉ๋
๋ด์ฅ ๊ทธ๋ํฝยท๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ํ ์ค์ฒ ์์ฑ ์คํจ ๊ฐ๋ฅ
์์ ๋ฌธ์ ์ ๊ณผ ๋์ ์ ๋ต
๋์: ์๋ฒ์์
Content-Encoding: gzip์ผ๋ก ์ ์กํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ํด์ ํ๋ฏ๋ก nifti-reader-js์ JS gzip ํด์ ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋๋ ์๋ฒ์์ Progressive ๋ฐฉ์ ๋ค์ด์ํ ๋ฒ์ (256ร256)์ ๋จผ์ ์ ๊ณตํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ ํด์๋๋ฅผ ๋ก๋ํ๋ 2๋จ๊ณ ์ ๋ต์ ๋์
ํฉ๋๋ค.๋์: ์ธ๊ทธ๋ฉํ ์ด์ ์ ํฝ์ ๋ฐ์ดํฐ๋ก ์ฌ๋ฆฌ์ง ์๊ณ BBox/Contour ์ขํ JSON์ผ๋ก ๋ฐ์ Canvas 2D๋ก ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ ํํฉ๋๋ค(์ด์ Cornerstone3D ๋ ผ์์์ ๊ฒํ ํ ์ ๊ทผ). ์ธ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ค์ 0์ ๊ฐ๊น๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋์: ๋ณผ๋ฅจ ๋ก๋ ํ ์ํ๋ง ๊ธฐ๋ฐ ๋ฐฑ๋ถ์์ ๊ณ์ฐ์ผ๋ก W/L์ ์๋ ์ถ์ ํฉ๋๋ค. ๋๋ ์๋ฒ์์ W/L ์ถ์ฒ๊ฐ์ JSON ์ฌ์ด๋์นด๋ก ํจ๊ป ์ ๊ณตํ๊ณ Cornerstone3D MetaData Provider์ ๋ฑ๋กํฉ๋๋ค.
๋์: ๋ก๋ ํ ๋ฐ๋์ ํด๋ถํ์ ๋๋๋งํฌ(์ฝ, ๊ท ๋ฑ)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ทฐํฌํธ ๋ฐฉํฅ์ ์๊ฐ์ ์ผ๋ก ๊ฒ์ฆํ๋ QA ๋จ๊ณ๋ฅผ ์ถ๊ฐํฉ๋๋ค. L/R ๋ฐฉํฅ ๋ ์ด๋ธ ํ์ ์ฌ๋ถ๋ฅผ ์๋ ํ ์คํธ์ ํฌํจ์ํต๋๋ค.
๋์: ์๋ฒ์
Accept-Ranges: bytes ํค๋ ์ง์์ ๋ฐ๋์ ์ถ๊ฐํ๊ฑฐ๋, Range Request ๋ฏธ์ง์ ์ ์ ์ฒด ํ์ผ 1ํ ๋ค์ด๋ก๋ ํ ํด๋ผ์ด์ธํธ์์ ์ฌ๋ผ์ด์ค ๋ถํ ํ๋ ํด๋ฐฑ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.๊ธฐ์ ๊ฒํ ๊ฒฐ๋ก โ ๋์ ๊ฐ๋ฅํ์ง๋ง ์กฐ๊ฑด๋ถ
Cornerstone3D์์ NIfTI + 1024ร1024 ์กฐํฉ์ ๊ธฐ์ ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ์ง ์์ต๋๋ค. @cornerstonejs/nifti-volume-loader v2๊ฐ imageId-first ๋ฐฉ์์ผ๋ก ์ฌ์ค๊ณ๋๋ฉด์ DICOM ํ์ดํ๋ผ์ธ๊ณผ ์๋น ๋ถ๋ถ ํตํฉ๋์์ต๋๋ค. ๋จ, ์๋ ์ ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ด์ผ ํ๋ก๋์
์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
| ํญ๋ชฉ | ์ํ | ํ์ ์กฐ์น |
|---|---|---|
| ๊ธฐ๋ณธ ๋ ๋๋ง (MPR) | ๊ฐ๋ฅ | nifti-volume-loader ์ค์น + imageId ๋ฑ๋ก |
| ์ขํ๊ณ (LPS ๋ณํ) | ์ฃผ์ | sform/qform ์ ํจ์ฑ ๊ฒ์ฆ + ์๊ฐ QA ํ์ |
| Window/Level | ์๋ ํ์ | ๋ฐฑ๋ถ์์ ์ถ์ or ์๋ฒ JSON ์ฌ์ด๋์นด |
| Progressive Loading | ๋ถ๊ฐ | 2๋จ๊ณ ํด์๋ ์ ๋ต(256โ1024) ์ค๊ณ ํ์ |
| ๋ฉ๋ชจ๋ฆฌ (1024ร1024) | ์ํ | ๋์ ๊ธฐ๊ธฐ ์ต์ ์ฌ์ ์ ์ + OOM ํด๋ฐฑ ํ์ |
| GPU ํ ์ค์ฒ ํ๊ณ | ๊ธฐ๊ธฐ ์์กด | ๋ฐํ์ MAX_3D_TEXTURE_SIZE ์ฒดํฌ + ํด๋ฐฑ |
| ์ธ๊ทธ๋ฉํ ์ด์ ์ค๋ฒ๋ ์ด | ๋ฉ๋ชจ๋ฆฌ ์ํ | ํฝ์ ๋์ BBox/Contour JSON ๋ฐฉ์ ์ ํ ๊ฒํ |
| DICOM SR ์ธก์ ์ ์ฅ | ๋ถ๊ฐ | ์์ฒด JSON ํฌ๋งท์ผ๋ก ์ด๋ ธํ ์ด์ ๊ด๋ฆฌ |
| Range Request ์๋ฒ | ์๋ฒ ์ค์ ํ์ | Accept-Ranges: bytes ํค๋ ์ง์ ์ถ๊ฐ |