메디컬 이미지는 MRI, CT, X-ray, 초음파처럼 의료 장비로 획득한 영상 데이터로, 단순 시각 정보가 아니라 환자의 상태를 직접 반영하는 임상 데이터다. 같은 이미지 분석이라도 일반 비전 문제와는 데이터 구조, 라벨링 방식, 규제, 평가 기준이 완전히 다르다.
이번 글에서는 (1) 메디컬 이미지 개념, (2) 일반 이미지와의 차이, (3) 주요 포맷(DICOM, DICOM Data Dictionary, NIfTI, WSI), (4) pydicom 기반 DICOM 실습까지 한 번에 정리한다.
1. 메디컬 이미지
메디컬 이미지는 MRI, CT, X-ray, 초음파 등 의료 장비로 촬영된 영상으로, 환자의 신체 내부 구조와 질환 상태를 진단하고 치료 계획을 세우는 데 활용되는 특수한 이미지 데이터다. 일반적인 사진과 달리 메디컬 이미지는 대부분 흑백이거나 3차원 볼륨 데이터로 구성되며, 각 픽셀 값이 조직 밀도나 생리학적 의미를 담고 있어 단순한 색상 정보 이상을 제공한다.
이 데이터는 환자의 건강과 직접적으로 연결되기 때문에 민감한 개인정보 규제를 따르며, 라벨링 또한 의학적 전문 지식을 가진 의료진이 직접 수행해야 한다. 따라서 AI 연구에서 메디컬 이미지는 데이터 수집과 활용에 제한이 크지만, 정확한 분석은 생명과 직결되므로 높은 신뢰성과 설명 가능성이 요구되는 중요한 영역이다.
2. 일반 이미지와 메디컬 이미지의 차이
1) 이미지의 출처와 목적
- 일반 이미지: 카메라·스마트폰 사진, CCTV 영상, 인터넷 이미지 등. 보통 사물 인식, 얼굴 인식, 자율주행 객체 탐지 같은 일반 시각 문제를 다룬다.
- 메디컬 이미지: X-ray, CT, MRI, 초음파처럼 의학적 진단을 위한 영상. 질병 진단, 병변 탐지, 장기 세그멘테이션처럼 건강과 직접 연결된 목적을 가진다.
2) 데이터의 형태
- 일반 이미지: 대부분 3채널(RGB)의 2D 이미지이며, 크기가 다양하고 공개 데이터 접근이 쉽다.
- 메디컬 이미지:
- 흑백(1채널, Grayscale)이 많다 (예: X-ray)
- 3차원(3D) 형태가 많다 (CT/MRI는 슬라이스 스택 → 3D 볼륨)
- 픽셀 값이 물리적·생리학적 의미를 가진다 (예: CT의 HU 값)
- 대용량이 많아 압축/스트리밍 설계가 중요하다 (예: Pathology 10000 x 10000 해상도)
3) 라벨링 난이도
- 일반 이미지: 사람도 비교적 쉽게 라벨링할 수 있고 크라우드소싱이 가능하다.
- 메디컬 이미지: 전문의가 직접 주석해야 하는 경우가 많아 비용·시간이 크게 증가한다.
4) 민감성과 규제
- 일반 이미지: 개인정보 이슈는 있지만 공개 데이터셋이 비교적 많다.
- 메디컬 이미지: PHI와 결합되므로 보안·윤리·법 규제가 강하다. HIPAA, GDPR 같은 규제를 준수해야 하며 공개 데이터가 제한적이다.
5) 처리와 학습의 특수성
- 일반 이미지: CNN/Transformer를 바로 적용해도 성능이 잘 나오는 경우가 많다.
- 메디컬 이미지:
- 3D 데이터, DICOM 같은 특수 포맷으로 전처리가 복잡하다
- 데이터가 적어 전이학습과 데이터 증강이 특히 중요하다
- 결과 해석(왜 이렇게 판단했는가)이 필수라 Explainable AI 비중이 크다
6) 오류의 영향
- 일반 이미지: 오분류의 영향이 상대적으로 작다.
- 메디컬 이미지: 오진은 생명과 직결될 수 있어 민감도, 특이도, F1-score 등 다양한 지표로 엄격하게 평가해야 한다.
3. 메디컬 이미지 포맷
의료 영상은 일반 사진(JPEG, PNG)과 달리 진단용 데이터라는 특수성을 가지므로 저장 포맷도 다르다.
1) DICOM
DICOM(Digital Imaging and Communications in Medicine)은 CT, MRI, X-ray, 초음파 등 의료 영상을 저장·전송·관리하는 표준 포맷이다. 단순 픽셀만 담는 것이 아니라 환자 정보, 검사 일시, 장비 설정, 해상도 등 메타데이터를 함께 포함한다.
이 덕분에 영상과 진료 정보가 같은 표준으로 관리되고, PACS와 연계해 조회·공유·협진이 가능해진다. 의료 영상 AI에서도 가장 기본이 되는 핵심 데이터 형식이다.
PACS 시스템
PACS(Picture Archiving and Communication System)는 병원의 다양한 의료 영상을 디지털로 저장·관리·전송·조회하는 시스템이다. 과거 필름 기반 보관을 디지털화해 중앙 서버에 저장하고, 의료진이 네트워크를 통해 안전하게 접근할 수 있게 만든다.
PACS는 DICOM 표준을 기반으로 동작하며 EMR/HIS와 연계되어 진료 효율, 협진, 원격 진료에 활용된다.

2) DICOM Data Dictionary
DICOM 표준에서 정의한 데이터 요소(Data Element) 목록이다. 각 요소의 의미, 형식, 식별자를 체계적으로 정리한 사전으로 보면 된다.

- Tag (태그)
- 데이터 요소 식별용 고유 번호. (Group, Element) 쌍으로 표현
- 예: (0010,0010) -> Patient's Name
- Name
- 사람이 읽기 쉬운 설명형 이름
- 예: "Patient's Name", "Study Date", "Series Description"
- Keyword
- 공백 없는 CamelCase 식별자
- 예: PatientName, StudyDate, SeriesDescription
- VR (Value Representation)
- 데이터 값의 형식(Type)
- 예: PN, DA, UI, US
- VM (Value Multiplicity)
- 값 개수 제한
- 예: 1, 1-n
- Description
- 해당 데이터 요소의 용도 설명
3) NIfTI
NIfTI(Neuroimaging Informatics Technology Initiative)는 뇌 MRI 같은 연구용 의료 영상에서 널리 쓰는 포맷이다. .nii 또는 .nii.gz 파일 하나에 3D(또는 4D) 볼륨과 좌표 정보, voxel 크기 등을 담아 분석 파이프라인에서 다루기 쉽게 만든다.
쉽게 말해, 진단 중심 DICOM을 연구·학습에 활용하기 좋게 정리한 형태다. nibabel 같은 라이브러리로 열고 저장하기 편해 딥러닝 실험에서 자주 사용된다.


4) WSI
WSI(Whole Slide Imaging, 전절편 디지털화)는 병리 슬라이드 전체를 고배율(보통 20x·40x)로 스캔해 기가픽셀급 이미지로 만드는 기술이다. 결과는 타일형 피라미드 구조(SVS, NDPI, MRXS, SCN, DICOM-WSI 등)로 저장되어 확대·이동을 빠르게 처리한다.
메타데이터에는 픽셀 크기(um/px), 배율, 염색(H&E), 조직 위치 등이 포함되며, 원격 판독·교육·품질관리뿐 아니라 세포/조직 분할, 종양 분류 같은 디지털 병리 AI에 폭넓게 활용된다.
파일 크기가 매우 크기 때문에 QuPath 같은 뷰어, OpenSlide 같은 라이브러리, 그리고 비식별화·스토리지·네트워크 정책을 함께 설계해야 한다.


- Radiology(영상의학): X-ray, CT, MRI, 초음파, PET로 인체 내부를 비침습적으로 판독
- Pathology(병리학): 조직/세포를 현미경 및 분자검사로 분석해 확정 진단

4. DICOM 이미지 실습 (pydicom)
reference: https://www.kaggle.com/code/micheldc55/how-to-read-dcm-dicom-data
!pip install pydicom
!unzip -q "/content/drive/MyDrive/랭체인 AI 영상객체탐지분석 플랫폼 구축/14. 메디컬 이미지/data/dicom_sample.zip"
import pydicom
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from pydicom.data import get_testdata_file
import logging
import sys
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]
dicom_img_list[:2]
number_img = 0
# force=True: 표준 위반/헤더 손상 파일도 강제로 읽기
dcm_img = pydicom.dcmread(dicom_img_list[number_img], force=True)
dcm_img
4-1. File Meta Data에서 자주 보는 항목
- (0002,0000) File Meta Information Group Length
- 메타 정보 그룹 전체 바이트 길이
- (0002,0002) Media Storage SOP Class UID
- DICOM 객체 종류 식별
- (0002,0010) Transfer Syntax UID
- 픽셀 데이터의 저장/압축 방식 (예: JPEG Baseline)
4-2. Dataset 본문에서 자주 보는 항목
- (0008,0005) Specific Character Set
- 문자 인코딩 방식
- (0008,0020) Study Date
- 검사 날짜 (익명화 시 더미값 가능)
- (0008,0050) Accession Number
- 접수 번호
- (0008,0060) Modality
- 촬영 모달리티 (예: CR = X-ray)
- (0008,0064) Conversion Type
- 변환된 이미지 유형
- (0008,0090) Referring Physician's Name
- 의뢰 의사 이름
- (0008,103E) Series Description
- 시리즈 설명 (예: view: PA)
- (0010,0010) Patient's Name
- 환자 이름 (익명화 UUID 가능)
- (0018,0015) Body Part Examined
- 검사 부위 (예: CHEST)
- (0018,5101) View Position
- 촬영 자세 (예: PA)
- (0020,000D) Study Instance UID
- 검사 단위 고유 ID
- (0020,0011) Series Number
- (0020,0013) Instance Number
- (0028,0002) Samples per Pixel
- 1: grayscale, 3: color
- (0028,0004) Photometric Interpretation
- MONOCHROME1/2로 반전 여부 확인
- (0028,0010)/(0028,0011) Rows/Columns
- 이미지 크기
- (0028,0030) Pixel Spacing
- 픽셀 간 실제 거리(mm)
- (0028,2110) Lossy Image Compression
- 손실 압축 여부
4-3. DICOM 정보 출력/시각화 코드
def show_dcm_info(dataset):
print(f"{' [ DICOM Information ] ':=^50}")
print(f"Filename............: {dataset.filename if hasattr(dataset, 'filename') else 'N/A'}")
print(f"Storage Type........: {dataset.SOPClassUID}")
print("-" * 50)
print(f"Patient's Name......: {dataset.PatientName}")
print(f"Patient ID..........: {dataset.PatientID}")
print(f"Patient's Age.......: {dataset.get('PatientAge', 'N/A')}")
print(f"Patient's Sex.......: {dataset.get('PatientSex', 'N/A')}")
print("-" * 50)
print(f"Modality............: {dataset.Modality}")
print(f"Body Part Examined..: {dataset.BodyPartExamined}")
print(f"View Position.......: {dataset.ViewPosition}")
print(f"Image Size..........: {dataset.Rows} x {dataset.Columns}")
print(f"Pixel Spacing.......: {dataset.get('PixelSpacing', 'N/A')}")
print(f"Lossy Compression...: {dataset.get('LossyImageCompression', '00')}")
print("=" * 50)
def plot_pixel_array(dataset, figsize=(10, 10)):
pixel_data = dataset.pixel_array
plt.figure(figsize=figsize)
cmap = plt.cm.bone
plt.imshow(pixel_data, cmap=cmap)
plt.title(f"DICOM Image - Modality: {dataset.Modality}, View: {dataset.ViewPosition}")
plt.axis('off')
plt.show()
show_dcm_info(dcm_img)
plot_pixel_array(dcm_img)
4-4. 강의 코드 버전
def show_dcm_info(dataset):
print("Filename.........:", dicom_img_list[number_img])
print("Storage type.....:", dataset.SOPClassUID)
print()
pat_name = dataset.PatientName
display_name = pat_name.family_name + ", " + pat_name.given_name
print("Patient's name......:", display_name)
print("Patient id..........:", dataset.get("PatientID"))
print("Patient's Age.......:", dataset.get("PatientAge"))
print("Patient's Sex.......:", dataset.get("PatientSex"))
print("Modality............:", dataset.get("Modality"))
print("Body Part Examined..:", dataset.get("BodyPartExamined"))
print("View Position.......:", dataset.get("ViewPosition"))
print("Image position......:", dataset.get("ImagePositionPatient"))
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)
def plot_pixel_array(dataset, figsize=(10,10)):
plt.figure(figsize=figsize)
plt.imshow(dataset.pixel_array, cmap=plt.cm.bone)
plt.show()
show_dcm_info(dcm_img)
plot_pixel_array(dcm_img)
fig, axs = plt.subplots(2, 5, figsize=(30, 10))
for idx, ax in zip(range(10), axs.flatten()):
dcm_img = pydicom.dcmread(dicom_img_list[idx])
img = dcm_img.pixel_array
ax.imshow(img, cmap='bone')
마치며
- 메디컬 이미지는 일반 이미지와 달리 데이터 의미, 규제, 라벨링 난이도, 오분류 리스크가 모두 더 무겁다.
- DICOM은 임상 워크플로우의 표준이고, NIfTI/WSI는 연구 및 디지털 병리에서 중요한 역할을 가진다.
- DICOM 실습에서는 픽셀 배열만 보는 것이 아니라 Tag, VR, Pixel Spacing, Compression 여부까지 함께 읽어야 해석 품질이 올라간다.
- 다음에는 DICOM 전처리(윈도잉, 정규화, 익명화)와 간단한 분류/세그멘테이션 파이프라인까지 이어서 정리해보면 흐름이 더 잘 잡힌다.
참고
'AI·머신러닝 > 딥러닝·비전' 카테고리의 다른 글
| 병리 WSI 실습 - OpenSlide, read_region, 피라미드 레벨 (0) | 2026.04.23 |
|---|---|
| 메디컬 이미지 NIfTI 실습 - DICOM montage, 변환, 3D 슬라이스 GIF (0) | 2026.04.21 |
| 오토인코더 - 개념, MNIST·CIFAR10 구현, Denoising과 유사 이미지 탐색 (0) | 2026.02.04 |
| WLASL 수화 인식 실습 - VideoDataset, R3D, 학습과 추론 (0) | 2026.02.03 |
| 동영상 데이터와 수화 인식 - 시공간 분석, 3D CNN, WLASL 데이터셋 (0) | 2026.01.28 |