8월달부터 시작한 인턴생활을 조금 더 효율적으로 관리해보고자 9월부터 시작한 인턴일지가 벌써 열 번째가 되었습니다... 사실 매일 쓰는 것을 생각했는데, 회사에서 이것저것 일하다보니 시간이 안나더라구요 열 번째만 해도 대단할지도...?
오늘은 의료 영상 처리를 하시는 분들이라면 무조건 들어봤을 법 한 Dicom 파일에 대해 알아보겠습니다. 기존에는 사원분께서 .dcm 파일을 .png로 변경하여 저장해주셔서, png파일로 프로젝트를 진행했었는데, 이번에 새롭게 맡게 된 프로젝트는 Dicom 파일을 먼저 다루게 되어 이렇게 공부하며 포스팅을 올리게 되었습니다...
Dicom file이란
Dicom은 Digital Imaging and Communications in Medicines의 약자로, 의료 영상을 저장하는 파일입니다. 원문으로 된 Dicom의 정의는 다음과 같습니다.
DICOM is the international standard for medical images and related information. It defines the formats for medical images that can be exchanged with the data and quality necessary for clinical use.
위 정의에서 빨간 색으로 써 둔 "연관된 정보"와 "데이터의 교환"은 가장 중요한 단어이자 Dicom 파일이 만들어지게 된 이유이다.
Dicom 파일이 있기 전 의료계에는 딱히 정해진 표준이 없었습니다. 이때문에 예를 들어 A 병원에서 CT를 찍으면 B병원에서는 A병원의 CT파일을 열 수 없어, B병원에서 CT파일을 다시 찍어야 하는 불상사도 많이 생겨났습니다. 거의 모든 병원에서 CT, MRI등을 사용하게 되면서 이러한 불편함을 없애기 위해 CT,MRI등 병원 내에서 사용하는 영상을 하나로 통일시키기 시작했습니다.
의료영상은 일반 영상과 다르게, 파일 내에 여러 meta data를 포함하고 있습니다. meta data는 촬영한 기기, 병원, 담당의, 환자이름 등 중요한 정보들이 들어가기 때문에 손실되면 안됩니다. 그래서 Dicom 파일에서는 영상과 함께 연관된 정보로 meta data를 가지고 있습니다.
의료 영상의 또 하나 특징은 보안이 매우 중요하다는 점입니다. 병원에서는 환자 정보가 절대 유출되지 않아야 하는 개인정보이기 때문에, 병원 내 프로토콜을 따로 사용합니다. Dicom 파일은 이 프로토콜 내에서 데이터를 바로 교환할 수 있도록 합니다.
Python Dicom 읽기
파이썬으로 Dicom file을 handling하는 건 생각보다 쉽습니다. 여러 모듈이 있지만, 저는 pydicom이라는 모듈을 사용하였습니다.
pydicom 다운로드는 다음과 같이 사용합니다.
pip install pydicom
또는
conda install -c conda-forge pydicom
간단하게 dicom 파일을 읽어보겠습니다.
input_dir = '.\\dicom_folder'
#다이콤 파일 경로 설정
dicom_path = os.path.join(input_dir,"0000.dcm")
#다이콤 파일 읽기
dcm = pydicom.dcmread(dicom_path)
#다이콤에서 이미지 부분을 떼오기
img = dcm.pixel_array
#matplotlib을 사용하여 image show
plt.imshow(img,cmap=plt.cm.bone)
plt.show()
Dicom 고차원 파일로 만들어 읽기
우리가 CT를 한 번 찍으면 사진이 딱 한 장이 나오는 것이 아니라 300~500장 정도 엄청난 양의 사진을 찍습니다. 그 후에, 해당 사진들을 바탕으로 환자의 부위를 3D로 보게 되는데요, 이를 위해선 고차원의 Dicom 파일을 3D로 읽어들여야 합니다.
제가 가지고 있는 데이터는 한 환자의 dicom 파일이 한 폴더에 여러 장 들어있었습니다. 그래서 우선, 해당 파일들을 한 array로 합치는 작업을 진행했습니다.
i = 0
#dicom 폴더에 있는 전체 dicom 파일 한 array로 만들기
for dcm_file in os.listdir(input_dir):
dcm_path = os.path.join(input_dir,dcm_file) #각 dcm파일의 path 만들기
dcm = pydicom.dcmread(dcm_path)
img = dcm.pixel_array
if i==0:
dcm_img = img #첫 파일 설정
elif i==1:
dcm_img = np.array([dcm_img,img]) #두 번째 파일 사용해서 차원 확장하기
else:
dcm_img = np.concatenate([dcm_img,[img]]) #나머지 파일은 확장한 차원 기준으로 붙이기
i+=1
Dicom file opencv로 읽기
Dicom 파일에 영상 처리를 해야 하는 과제를 받았기 때문에, 영상처리에 가장 많이 쓰이는 모듈인 opencv로 우선 출력을 해보겠습니다.
input_dir = 'C:\\Users\\fasol\\Desktop\\youda\\2.치의학\\ct20221125_145456_0000'
dicom_path = os.path.join(input_dir,"0344.dcm")
dcm = pydicom.dcmread(dicom_path)
#적당히 사진 보이도록 수 곱해주기
img = dcm.pixel_array * 8
cv2.imshow("image", img)
cv2.waitKey()
처음에 img를 그냥 출력했을 때, 사진이 거의 안보여서 일단 눈으로 사진을 볼 수 있으면서, 가장 dicom reader로 봤을 때랑 비슷하게 나오는 숫자를 찾아 곱해주었습니다.
딥러닝 학습 영상으로 받은 CT 파일이기 때문에, 개인정보 방침 상 사진을 직접적으로 올리지는 못했습니다. ..
출처
'인턴일지' 카테고리의 다른 글
[인턴일지] 아홉번째 인턴일지 : segmentation (0) | 2023.12.06 |
---|---|
[인턴일지] 여덟 번째 인턴일지 : 과적합 줄이기 (2) | 2023.11.22 |
[인턴일지] 일곱번째 인턴일지 : 전이학습 (1) | 2023.11.20 |
[인턴일지] 여섯번째 인턴일지 : 7개월 중 3개월이 지난 시점의 회고록 (0) | 2023.11.07 |
[인턴일지] 다섯번째 인턴일지 : pytorch ResNet50 grayscale 이미지 학습시키기 (0) | 2023.10.27 |