[의료영상] Dicom과 NIfTI

1. DICOM (Digital Imaging and Communications in Medicine)

"병원의 표준 언어"
병원에서 촬영된 모든 영상(MRI, CT, X-ray)이 생성되고 저장되는 국제 표준 규약입니다. 단순한 이미지 파일이 아니라, 환자 정보와 촬영 조건이 결합된 방대한 데이터 패킷에 가깝습니다.

  • 구조: Header(메타데이터) + Pixel Data(이미지)가 하나의 파일에 들어 있습니다.
  • 특징:
    • 2D Slice 기반: 보통 MRI를 찍으면 수백 장의 단면 이미지가 생성되는데, DICOM은 이 단면 하나하나가 각각의 파일(.dcm)로 저장됩니다. (예: 뇌 MRI 하나에 파일 200개)
    • 메타데이터 (DICOM Tags): 환자 이름, ID, 촬영 날짜, MRI 기기 모델명, 슬라이스 두께, 촬영 좌표 등 수천 가지 정보가 태그(Tag, 예: 0010,0010) 형태로 포함됩니다.
      • Dicom 헤더 : pydicom 라이브러리 사용하여 확인 가능
import pydicom

# 1. DICOM 파일 불러오기
# 실제 파일 경로로 변경해주세요
file_path = 'sample_brain.dcm' 
ds = pydicom.dcmread(file_path)

# 2. 전체 헤더 정보 출력 (Raw Data)
print("=== 전체 헤더 정보 ===")
print(ds)

# 3. 주요 정보만 골라서 확인 (Dot notation 사용)
print("\n=== 주요 메타데이터 확인 ===")
try:
    print(f"Patient ID       : {ds.PatientID}")
    print(f"Modality         : {ds.Modality}")          # 예: MR, CT
    print(f"Study Date       : {ds.StudyDate}")
    print(f"Series Desc      : {ds.SeriesDescription}") # 예: T1_3D_SAG
    print(f"Slice Thickness  : {ds.SliceThickness} mm")
    print(f"Manufacturer     : {ds.Manufacturer}")
except AttributeError:
    print("일부 태그가 이 파일에 존재하지 않습니다.")

# 4. (심화) 태그 번호(Tag ID)로 직접 접근하기
# 예: PatientName은 (0010, 0010)입니다.
print(f"\n환자 이름 (Tag로 접근): {ds[0x0010, 0x0010].value}")
  • 현실적인 문제: 파일 개수가 너무 많아 관리가 어렵고, 개인정보(PHI)가 포함되어 있어 익명화(De-identification) 과정이 필수적입니다.
  • 💡Dicom tag 리스트 확인 사이트 : https://www.dicomlibrary.com/dicom/dicom-tags/
 

DICOM Library - Anonymize, Share, View DICOM files ONLINE

www.dicomlibrary.com


2. NIfTI (Neuroimaging Informatics Technology Initiative)

"연구와 분석의 표준 언어"
DICOM의 복잡함을 해결하고, 뇌영상 분석(Neuroimaging)을 효율적으로 하기 위해 개발된 포맷입니다. SimNIBS, FreeSurfer, FSL, 그리고 대부분의 딥러닝 파이프라인은 이 포맷을 표준으로 사용합니다.

  • 확장자: .nii 또는 압축된 .nii.gz
  • 구조: Header + Image Data (보통 단일 파일)
  • 특징:
    • 3D Volume 기반: 수백 장의 DICOM Slice를 합쳐서 하나의 3D 파일로 만듭니다. 4D(시간 축 포함, fMRI나 DTI) 데이터도 파일 하나에 담을 수 있습니다.
    • 좌표계 중심 (Affine Matrix): NIfTI 헤더의 핵심은 영상 데이터(Voxel)가 실제 공간(World Coordinate)의 어디에 위치하는지 알려주는 4x4 행렬입니다. 3D 재구성 시 이 정보가 틀어지면 뇌의 좌우가 바뀌거나 위치가 어긋납니다.
    • 가벼움: 환자 개인정보 등 분석에 불필요한 태그는 대부분 제거하고, 영상 분석에 필요한 핵심 정보(차원, 방향, 복셀 크기)만 남깁니다.
    • NIfTI 헤더 : niabel 라이브러리 사용해서 확인 가능 https://nipy.org/nibabel/
import nibabel as nib

# 1. NIfTI 파일 불러오기 (.nii 또는 .nii.gz)
file_path = 'sample_brain.nii.gz'
img = nib.load(file_path)

# 2. 이미지 데이터 객체와 헤더 분리
header = img.header

print(f"=== 파일 정보: {file_path} ===")

# [중요] 1. 이미지 차원 (Dimension)
# 예: (240, 240, 155) -> 가로, 세로, 높이 슬라이스 수
print(f"Data Shape (차원)    : {img.shape}")

# [중요] 2. 복셀 크기 (Resolution)
# 예: (1.0, 1.0, 1.0) -> 1mm 등방성(Isotropic) 데이터인지 확인 필수
print(f"Voxel Size (해상도)  : {header.get_zooms()}")

# [중요] 3. 데이터 타입
# 예: int16, float32 (딥러닝 입력 시 타입 확인 중요)
print(f"Data Type (자료형)   : {header.get_data_dtype()}")

# [중요] 4. 아핀 행렬 (Affine Matrix)
# 3D 공간상의 위치와 방향을 결정하는 4x4 행렬
print("\n=== Affine Matrix (좌표계 정보) ===")
print(img.affine)

# (심화) 방향 정보 문자열로 확인 (예: RAS, LPS)
# 3D Recon 시 좌우 반전 여부를 체크할 때 유용합니다.
ornt = nib.orientations.io_orientation(img.affine)
ornt_code = nib.orientations.ornt2axcodes(ornt)
print(f"\nOrientation Code     : {ornt_code}") # 예: ('R', 'A', 'S')

 


3. DICOM vs NIfTI 비교 요약

구분DICOM (.dcm)NIfTI (.nii / .nii.gz)

주 사용처 병원 PACS, 임상 진단 AI 연구, 뇌영상 분석, 수술 시뮬레이션
데이터 형태 2D 슬라이스 (파일 수백 개) 3D 볼륨 (파일 1개)
좌표계 LPS (Left-Posterior-Superior) RAS (Right-Anterior-Superior) 주로 사용
개인정보 포함 (환자 이름, ID 등) 보통 제거됨 (익명화 용이)
Python 라이브러리 pydicom nibabel, SimpleITK

 


4. 연구자를 위한 핵심 주의사항 (좌표계 이슈)

SimNIBS로 3D Recon을 하거나 딥러닝 모델에 넣을 때 가장 조심해야 할 부분입니다.

  1. LPS vs RAS:
    • DICOM은 주로 LPS 좌표계를 씁니다. (X축이 환자의 왼쪽, Y축이 뒤쪽, Z축이 머리 쪽으로 증가)
    • NIfTI는 주로 RAS 좌표계를 씁니다. (X축이 환자의 오른쪽으로 증가)
    • 변환의 중요성: DICOM을 NIfTI로 변환할 때 이 좌우 정보(Left/Right)가 제대로 뒤집히지 않으면, 뇌종양이 실제로는 왼쪽에 있는데 3D 모델에서는 오른쪽에 있는 치명적인 오류가 발생합니다.

 

Medical Image Coordinate Systems - MATLAB & Simulink

Learn how image locations are defined in the intrinsic and patient coordinate systems.

www.mathworks.com

 

  • 이러한 좌표계 변환을 자동으로, 가장 정확하게 해주는 툴 중 dicom2nifti가 있습니다. (단순히 파이썬 코드로 픽셀 값만 옮기면 좌표 정보가 날아갈 위험이 큽니다.)

 

반응형