[Medical Image] DICOM(Digital Imaging and Communications in Medicine)
어제 landmark들의 위치 평균을 내보기에 앞서, 모든 landmark를 시각화 해보았는데, 의료영상에 대한 Header정보가 중요하다는 것을 다시 한 번 느낄만한 일이 발생했다. 다행히도 교수님께서 바로 설명해주셔서 의문은 해결되었는데..
나아가 미뤄왔던 DICOM에 대해서 공부를 시작해야겠다는 생각이 들었다.
병원에서 의료 영상이 어떻게 취득되고 서버에 저장되는지 그리고 의사들에게 어떻게 보여지는지 살펴보자.
병원에는 보통 PACS(의료영상저장전송시스템)
라고 하는 시스템이 설치되어있다.
Medical Image 장비(X-ray, CT, MRI .. 등)으로 의료영상을 찍으면, 그 영상이 DICOM
format으로 변환이 된다.
그러면 PACS 서버에 저장이 되고, 의사분(end user)들께서 의료 영상을 보고싶을 때 서버에 있는 데이터들을 visualization해서 볼 수 있다.
DICOM(Digital Imaging and Communications in Medicine)이란
DICOM
은 의료용 디지털 영상의 저장, 출력 및 전송에 사용 되는 여러가지 표준을 총칭하는 말로, 의료영상의 저장형식과 통신방법을 규정한다.
RSNA에서 1990년대에 medical image에 대한 국제 표준으로 정하였다.(International standard for medical images)
DICOM 표준을 따르는 파일의 확장자는 .dcm을 사용하며 이 파일내에는 영상정보와 clinical information(촬영된 날짜, 촬영장비의 이름, 환자 이름 등의 정보)역시도 들어가있다. (formats of medical images with clinical information)
※ 그외 다른 영상이미지 파일 포맷- 보통 파일이 2개로 나눠져 있는 경우에는 한 파일에는 영상 정보, 다른 파일에는 header정보들이 들어간다.
- Dicom(dcm)
- Analyze(hdr/img)
- Raw data(mhd/raw)
- Nifti(nii, nii.gz)
DICOM의 필요성
아래 사진처럼 DICOM 도입 전에는 촬영기기의 제조사마다 각기 다른 방식으로 영상정보를 저장하고 관리했기 때문에 그에 따라 각기 다른 뷰어를 통해서만 확인해야 하는 불편함이 있다.
촬영장비가 더욱 다양해지고, X-ray 촬영, 초음파 검사, CT 촬영, MRI 촬영 등 다양한 의료용 디지털 영상 촬영 장비가 개발됨에 따라 각 장비에서 촬영한 영상을 효율적으로 통합하여 관리 및 조회할 필요가 생겼고, 서로 다른 제조사 간의 호환성 문제가 대두되었다. 즉, '표준'이 필요해진 것이다.
또한 의료 영상은 일반적인 영상과 달리 환자 정보, 검사 정보 등 의료 영상으로서 효과적으로 사용하기 위해 영상 자체 정보 외에 고유한 정보들을 함께 저장해야 한다.
그리고 촬영 장비, OCS(처방전달시스템), PACS(의료영상저장전송시스템), 아카이브, 프린터 등 의료 영상과 관련한 다양한 장비들간의 통신을 위해서는 네트워크 프로토콜도 필요하다. (의료용 영상은 환자의 개인정보가 있어 보안 이슈가 중요하여 독립된 프로토콜이 필요) 이러한 목적을 위해 새로운 표준의 개발이 필요했으며 그렇게 개발된 것이 DICOM이다.
DICOM 도입 후에는
서로 다른 기기에서 촬영된 영상이라도 표준을 준수하고 있기 때문에 PACS에서 의료 영상 관리가 가능해졌다. 그리고 의료영상 전송도 매우 편리해서, A병원에서 촬영한 의료영상을 B병원으로 바로 전송 할 수도 있다.
앞서 DICOM에 대해서 알아본 것을 한마디로 정리하면 1) 의료영상의 저장형식과 2) 통신방법을 규정한 표준이라고 할 수 있다.
이 각각에 대해서 공부하는 것이 중요할 듯 하다.
DICOM File의 구성요소
1) IOD(Information Object Definitions)와 IE(Information Entity)
IOD
라고 하는 Information Object Definition은 정보교환을 위한 정보의 내용과 형식을 표준화하는 데에 사용된다.
구조적으로는 IOD는 IE
(Information Entity)로 구성 -> , IE는 다시 모듈로, -> 모듈은 개별적인 속성들로 구성되어 있다.
예)
MR 영상을 위한 MR IOD는 환자정보 IE, 검사정보 IE, 시리즈정보 IE, 영상정보 IE 등으로 구성되어 있고, 영상정보 IE는 다시 영상의 일반적인 내용을 다루는 모듈과 MR 영상의 특수한 특성에 대해 다루는 모듈로 구성이 되어 있고, 각각의 모듈에는 개별적인 세부 속성들이 정의되어있다.
2) Attributes
Attributes
는 Information Entity의 구체적인 정보이며, 환자의 신상 정보, 수행한 검사 정보, 영상 자체의 정보 등 '의료용 영상 파일" 데이터를 규정하기 위해 필요한 다양한 Attribute들이 존재한다. DICOM 표준에서는 Attributes에 대하여 아래와 같이 정의하고 있다.
Unique Attribute Name(human readable)
: 속성 이름Unique Attribute Tag(Information system readable)
: 시스템이 해당 속성을 식별하는 용도로 사용하는 4byte의 값Type classification
: 속성 입력의 필수/선택 여부 관련 정보 1, 1C, 2, 2C, 3Attribute description(semantics)
: 해당 속성에 대한 상세한 설명
DICOM Data Format
File Preamble
(128byte) : 특별한 사용이나 application profile을 위해 사용될 수 있음DICOM prefix
(4byte) : File Preamble 다음에 나오는 prefix로 해당 파일이 DICOM이라는 것을 명시함File Meta elements
: 파일에 대한 Attribute를 Data element의 모음으로 나타냄Information object
: 이미지/영상 데이터
DICOM 영상에 들어있는 모든 개별 Attribute들은 모두가 각각 tag, length, value, VR(option)을 가진다.
Tag
(4byte): Attribute가무엇인지를 나타낸다.length
(2 or 4byte): 각 Attribute의 길이value
: 실제 Attribute의 내용VR
(Value Representation)(2 byte): Attribute 값의 타입을 명시(VR 리스트 : NEMA DICOM 표준 문서 - Part 5.Data Structures and Encoding)
Pydicom으로 DICOM 파일 다루기
+ 아래 코드는 예전에 참여한 의료정보 분석 전문가 심화과정에서 <의료영상>에 대해 배운 것이다.
import matplotlib.pyplot as plt
import pydicom
from pydicom.data import get_testdata_files
filename = '/content/drive/My Drive/Practices using Colab/MedicalImage/Colab Notebooks/Colab Notebooks/DICOM_CT.dcm'
dataset = pydicom.dcmread(filename) #DICOM 파일을 읽어온다. pydicom.read_file()또는 pydicom.dcmread()를 사용해준다.
# Normal mode:
print()
print("Filename.........:", filename)
print("Storage type.....:", dataset.SOPClassUID)
print()
print("Patient's name...:", dataset.PatientName)
print("Patient id.......:", dataset.PatientID)
print("Modality.........:", dataset.Modality)
print("Study Date.......:", dataset.StudyDate)
if 'PixelData' in dataset:
rows = int(dataset.Rows)
cols = int(dataset.Columns)
print("Image size.......: {rows:d} x {cols:d}, {size:d} bytes".format(
rows=rows, cols=cols, size=len(dataset.PixelData)))
if 'PixelSpacing' in dataset:
print("Pixel spacing....:", dataset.PixelSpacing)
# use .get() if not sure the item exists, and want a default value if missing
print("Slice location...:", dataset.get('SliceLocation', "(missing)"))
# plot the image using matplotlib
plt.imshow(dataset.pixel_array, cmap=plt.cm.gray)
plt.show()
아직 DICOM의 File와 담고 있는 정보의 활용, 그리고 통신 방법에 대해서 너무나 모르는 것이 많지만 아래 귀중한 reference를 찾게 되었다는 것만으로도 다행이라 생각한다.(특히 DICOM Cookbook 번역본이 정말 잘 되어있는 듯 하다.) 공부는 앞으로 해가면 되는 거니까..!
다음에는 DICOM Network
에 대해서 한번 알아보고 정리해보고싶다.
reference
컴퓨터비전, 머신러닝, 딥러닝을 이용한 의료영상분석 - DGIST 박상현 교수님 4.PACS/DICOM/Visualization