메디컬 인공지능(Medical AI) 연구의 시작은 데이터의 특성을 정확히 이해하는 것에서 출발합니다. MRI, CT와 같은 의료 영상 데이터가 일반 이미지와 어떻게 다른지, 그리고 이를 처리하기 위한 표준 규격인 DICOM을 어떻게 다루는지 상세히 살펴보겠습니다.
1. 메디컬 이미지의 정의와 특성
메디컬 이미지는 MRI, CT, X-ray, 초음파 등 의료 장비로 촬영된 영상 데이터로, 환자의 신체 내부 구조와 질환 상태를 진단하고 치료 계획을 수립하는 데 사용됩니다. 일반적인 사진과 달리 다음과 같은 특수성을 가집니다.
- 데이터 구성: 흑백(Grayscale) 또는 3차원 볼륨 데이터로 구성됩니다.
- 정보의 깊이: 각 픽셀 값이 단순한 색상이 아니라 조직 밀도나 생리학적 의미를 담고 있습니다.
- 규제 및 보안: 환자의 건강과 직결된 민감 정보이기에 HIPAA, GDPR 등 엄격한 규제를 따릅니다.
- 전문성: 라벨링 과정에서 의료진의 직접적인 참여가 필수적이며, AI 모델에 높은 신뢰성과 설명 가능성(Explainable AI)이 요구됩니다.
2. 일반 이미지 vs 메디컬 이미지 차이점
학습 모델을 설계하기 전, 두 데이터군의 공학적 차이를 명확히 인지해야 합니다.
| 구분 | 일반 이미지 | 메디컬 이미지 |
| 출처 및 목적 | 스마트폰, CCTV 등. 사물/얼굴 인식, 자율주행 등 일반 시각 문제 해결. | X-ray, CT, MRI 등 의료 장비. 질병 진단, 병변 탐지, 장기 세그멘테이션 등 진단 목적. |
| 데이터 형태 | 대부분 3채널(RGB) 2D 이미지. 인터넷에서 쉽게 확보 가능. | 흑백(Grayscale) 또는 3D 볼륨 데이터. 픽셀 값이 물리적/생리학적 의미(HU 등)를 가짐. 용량이 매우 큼. |
| 라벨링 난이도 | 비전문가 크라우드소싱 가능. | 방사선과 전문의 등 의료진의 직접적인 Annotation 필요. 비용과 시간 소요가 매우 큼. |
| 민감성 및 규제 | 공개 데이터셋(ImageNet 등) 풍부. | 환자 개인정보(PHI)와 연결됨. HIPAA, GDPR 등 강력한 보안 규제 적용. 공개 데이터셋이 제한적임. |
| 처리 및 학습 | CNN, Transformer 등 일반 모델 직접 적용 가능. | 3D 데이터 및 DICOM 포맷으로 전처리 복잡. 전이학습 및 데이터 증강이 핵심. 결과 해석(XAI) 필수. |
| 오류의 영향 | 분류 오류 시 서비스 불편 수준. | 오진 시 생명과 직결됨. 민감도, 특이도, F1-score 등 다각도의 평가 지표 요구. |
3. 메디컬 이미지 포맷 및 인프라 시스템
의료 현장에서 데이터를 효율적으로 관리하기 위해 표준화된 포맷과 시스템을 사용합니다.
1) DICOM (Digital Imaging and Communications in Medicine)
의료 영상의 국제 표준 포맷입니다. 영상 픽셀 데이터 외에도 환자 정보, 검사 일시, 장비 설정값 등 방대한 메타데이터를 포함합니다. 확장자는 .dcm이며 PACS 시스템과 연계됩니다.
2) PACS (Picture Archiving and Communication System)
병원 내 의료 영상을 디지털로 저장, 관리, 전송, 조회하는 시스템입니다. 네트워크를 통해 어디서나 안전하게 영상에 접근하게 함으로써 진료 효율을 극대화합니다.

3) DICOM Data Dictionary
표준에 정의된 데이터 요소 목록으로, 다음 다섯 가지 핵심 요소로 구성됩니다.
- Tag: (Group, Element) 쌍의 고유 번호 (예: (0010,0010))
- Name: 설명형 이름 (예: Patient's Name)
- Keyword: 코드용 CamelCase 식별자 (예: PatientName)
- VR (Value Representation): 데이터 형식 (예: PN, DA, UI)
- VM (Value Multiplicity): 값의 개수 정의

4) NIfTI (Neuroimaging Informatics Technology Initiative)
주로 뇌 MRI 연구에 사용되는 형식으로, 3D/4D 영상과 공간 좌표 정보를 단일 파일(.nii)에 통합하여 연구 및 통계 분석에 최적화되어 있습니다.


5) WSI (Whole Slide Imaging)
병리 유리 슬라이드를 고배율로 스캔한 기가픽셀급 이미지입니다. 타일형 피라미드 구조로 저장되어 대용량 데이터를 빠르게 처리할 수 있습니다.


6) Radiology(영상의학) vs Pathology(병리학)
- 영상의학: 비침습적 촬영(X-ray, CT)을 통해 내부 이상 소견을 판독합니다.
- 병리학: 조직·세포를 현미경으로 분석하여 질병을 확정 진단합니다. WSI는 병리학의 디지털화를 이끄는 핵심 기술입니다.

4. [실습] Python을 이용한 DICOM 데이터 분석
pydicom 라이브러리를 활용하여 실제 의료 영상을 로드하고 분석하는 과정입니다.
import pydicom
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
# 1. DICOM 파일 경로 설정 및 로드
BASE_PATH = '/content/dicom_sample/pneumothorax/dicom-images-test'
SAMPLE_IMAGE_PATH = list(Path(BASE_PATH).glob("*"))
dicom_img_list = [list(i.glob("*/*.dcm"))[0] for i in SAMPLE_IMAGE_PATH]
# force=True 옵션으로 비표준 파일 대응
dcm_img = pydicom.dcmread(dicom_img_list[0], force=True)
# 2. 메타데이터 및 이미지 정보 출력 함수
def show_dcm_info(dataset):
print("Filename.........:", dicom_img_list[0])
print("Storage type.....:", dataset.SOPClassUID)
print()
pat_name = dataset.PatientName
display_name = f"{pat_name.family_name}, {pat_name.given_name}"
print("Patient's name......:", display_name)
print("Patient id..........:", dataset.get("PatientID"))
print("Modality............:", dataset.get("Modality"))
print("Body Part Examined..:", dataset.get("BodyPartExamined"))
if 'PixelData' in dataset:
rows, cols = int(dataset.Rows), int(dataset.Columns)
print(f"Image size.......: {rows} x {cols}, {len(dataset.PixelData)} bytes")
if 'PixelSpacing' in dataset:
print("Pixel spacing....:", dataset.PixelSpacing)
# 3. 시각화 함수
def plot_pixel_array(dataset, figsize=(10,10)):
plt.figure(figsize=figsize)
# 의료 영상 전용 'bone' 컬러맵 사용
plt.imshow(dataset.pixel_array, cmap=plt.cm.bone)
plt.show()
show_dcm_info(dcm_img)
plot_pixel_array(dcm_img)

5. 핵심 DICOM 태그 상세 분석
AI 모델 개발 시 데이터 전처리 파이프라인에서 반드시 확인해야 할 태그들입니다.
1) 환자 및 검사 식별 (Identification)
| Tag | Keyword | VR | 설명 |
| (0010,0010) | PatientName | PN | 환자 이름 (학습 시 익명화 필수) |
| (0008,0060) | Modality | CS | 촬영 장비 (CR, CT, MR 등) |
| (0020,000D) | StudyInstanceUID | UI | 특정 검사 단위 고유 ID |
2) 기하학적 정보 (Geometry)
| Tag | Keyword | VR | 설명 |
| (0028,0030) | PixelSpacing | DS | 픽셀 간 실제 물리적 거리 (mm) |
| (0018,0088) | SliceThickness | DS | 단면 두께. 3D 재구성 시 필수 |
| (0020,0032) | ImagePositionPatient | DS | 환자 좌표계 기준 이미지 시작 위치 |
3) 픽셀 표현 방식 (Representation)
| Tag | Keyword | VR | 설명 |
| (0028,0004) | PhotometricInterpretation | CS | 흑백 반전 여부 확인 (MONOCHROME2 등) |
| (0028,1050/1051) | WindowCenter/Width | DS | 밝기 대비(Contrast) 조절 기준값 |
6. 데이터 전처리 및 변환 실습
모델 학습을 위해 원본 데이터를 가공하는 고도화된 기법들입니다.
1) HU(Hounsfield Unit) 변환
CT 영상의 픽셀 값은 장비 사양에 따라 다르므로 표준 단위인 HU로 변환해야 합니다. 변환 공식은 다음과 같습니다.
def get_pixel_array_and_scale(dcm_img):
pixel_array = dcm_img.pixel_array
slope = float(getattr(dcm_img, 'RescaleSlope', 1))
intercept = float(getattr(dcm_img, 'RescaleIntercept', 0))
hu_values = pixel_array.astype(np.float64) * slope + intercept
return hu_values, slope, intercept
2) 3D 볼륨 재구성
슬라이드 단위의 2D 데이터를 위치 정보(ImagePositionPatient)에 따라 정렬하여 3D 배열로 병합합니다.
def build_3d_volume(dicom_dir):
dicom_files = [pydicom.dcmread(f) for f in Path(dicom_dir).glob('**/*.dcm')]
# Z축 좌표 기준으로 정렬
dicom_files.sort(key=lambda x: float(x.ImagePositionPatient[2]))
volume = np.stack([d.pixel_array for d in dicom_files])
return volume
3) NIfTI 형식 저장
nibabel을 사용하여 연구용 표준 포맷으로 변환합니다.
import nibabel as nib
def save_to_nifti(volume, affine_matrix, output_path):
nifti_img = nib.Nifti1Image(volume.astype(np.float32), affine_matrix)
nib.save(nifti_img, output_path)
7. 메디컬 이미지 처리 Best Practice
프로젝트의 안정성과 정확도를 높이기 위한 네 가지 핵심 원칙입니다.
- 데이터 익명화 (De-identification): PatientName 등 PHI는 반드시 제거하거나 UUID로 대체하십시오.
- 좌표계 일치 (Orientation): 장비마다 다른 방향성(RAS 등)을 모델 학습 전 하나로 통일해야 합니다.
- 윈도우링 (Windowing): 타겟 조직(폐, 뇌 등)에 맞는 Window Center/Width를 적용하여 특징 추출 성능을 최적화하십시오.
- 데이터 품질 검증: 메타데이터 누락이나 오류가 빈번하므로, 전처리 단계에서 예외 처리 로직을 반드시 포함해야 합니다.
'개념 정리 step2 > 메디컬 이미지' 카테고리의 다른 글
| [메디컬] 의료 인공지능을 위한 신호 처리 개념 정리 및 전처리 (0) | 2026.04.23 |
|---|---|
| [딥러닝 전처리] DICOM MRI 데이터를 NIfTI로 변환하고 3D 볼륨을 GIF로 시각화하기 (0) | 2026.04.06 |