본문 바로가기
카테고리 없음

NifTI, DICOM header 정보 읽어오기

by Hangii 2024. 7. 23.

의료 영상을 다루다 보면, 촬영날짜, 나이, 영상 reconstruction parameter 등 굉장히 많은 정보가 파일의 header에 저장되어 있음을 알 수 있다. 그래서 의료 영상 처리의 가장 기본 중 하나는 header 정보를 읽어오는 것이다. Axial slice 단위로 영상을 나누어 저장한 형태를 DICOM, 파일 하나에 전체 3D 정보를 담은 형태를 NifTI라고 하는데, 이 둘의 header 내용과 읽어오는 방식에 대해 설명하고자 한다.

 

cf) Axial이란?

          3D 영상의 수평면을 말한다. 즉, 우리가 흔히 생각하는 z축에 수직인 방향으로 영상을 잘랐을 때 보이는 면을 axial plane이라고 한다. Sagittal과 Coronal 방향도 존재하는데, 이들은 축에 비유하기 보다는 촬영한 환자 기준으로 이해하는 게 편하다. Brain을 촬영했다고 가정했을 때, 머리의 양옆을 지나는 면을 coronal , 앞뒤를 지나는 면을 sagittal이라고 부른다. 

NifTI header 읽기

NifTI 영상은 ITK-snap 등의 뷰어로 열어볼 수 있는데, 뷰어 UI에서도 header를 확인 할 수는 있다. 그런데 코드를 통해 헤더를 읽고 싶다면 어떻게 해야 할까? nibabel 라이브러리를 사용하면 아주 쉽게 읽을 수 있다. 의료 영상 처리를 한다면 nibabel 라이브러리는 매우 자주 쓰이니 참고하길 바란다. (https://nipy.org/nibabel/)

import nibabel as nib
path = 'nifti 영상 경로'
nii = nib.load(path).header

 

nii를 프린트해보면 저장되어 있는 모든 헤더 값이 출력된다. 


이 중에서 voxel size를 읽어오는 'pixdim' 값만 가져오고 싶다고 하자. pixdim 헤더의 경우 인덱스 값을 통해 어떤 dimension의 voxel size를 가져올 지 설정할 수 있는데, x-dim, y-dim, z-dim의 voxel 크기는 각각 pixdim의 1,2,3번 인덱스에 해당한다. 각 값은 다음과 같이, 인덱스로 불러오면 된다.

x_dim = nii['pixdim'][1]
y_dim = nii['pixdim'][2]
z_dim = nii['pixdim'][3]

 

pixdim 이외에도 영상 크기를 가리키는 dim, affine matrix, datatype 등이 영상 전처리 시 자주 사용하는 값들이 정의되어 있다.

 

DICOM header 읽기

DICOM에는 영상 촬영 날짜, 환자 이름, 총 촬영 시간, 방사성동위원소의 반감기, 기계의 관전류 등, NifTI보다 훨씬 다양한 header 정보가 담겨 있다.

DICOM 헤더 일부

여기서 확인되는 정보 중 어떤 것들은 task의 성능에 중대한 영향을 끼칠 수 있으므로 중요한 정보들은 데이터 수집 단계에서 정리해두는 것을 추천한다. 헤더 값은 pydicom 라이브러리를 사용하면 쉽게 읽을 수 있다. 기본적으로 dicom file마다 header값이 정의되어 있기 때문에, 아래 코드는 하나의 dicom file의 header를 읽는다.

import os
import pydicom
dicom_path = '다이콤 파일들이 저장된 폴더'
dicom_file = os.listdir(dicom_path)[0])
dcm = pydicom.dcmread(dicom_file)
studyDate = dcm.StudyDate
weight = dcm.PatientWeight

코드에서는 header 이름을 가지고 값에 접근했지만, header 번호를 알고 있다면 해당 번호를 사용해서 접근할 수도 있다. 예를 들어, 위에서는 촬영 날짜를 접근할 때 'StudyDate' 키워드를 사용했지만, 이것 대신 dcm[0x0008, 0x0020].value를 사용할 수도 있다. 

또 한 가지 알아두면 좋은 점은, 간혹 header 값이 nested 형태일 때가 있는데, 이 때는 상위 항목에 먼저 접근을 한 다음 원하는 것에 접근해야 한다. 예를 들어, 다음과 같이 생긴 header 정보 중 (0018,1075) Radionuclie Half Life의 값을 가져오고 싶다면, dcm.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose로 접근할 수 있다.

 

영상의 header 값의 정보는 voxel spacing이나 decay correction 등의 전처리를 할 때 자주 사용되므로 읽어오는 방법을 익혀두면 도움이 된다.

댓글