AI 모델에 의료영상 데이터를 적용하거나, DICOM 메타데이터를 분석해야 하는 상황에서는
전문 소프트웨어 없이 코드로 직접 DICOM 파일을 다룰 수 있는 방법이 필요하다.
Python 기반의 오픈소스 라이브러리인 Pydicom은 이러한 요구를 충족시키며,
DICOM 파일을 간단하게 읽고, 태그를 확인하고, 수정하고, 저장하는 작업을 빠르게 수행할 수 있다.
특히 AI 연구자나 의료영상 전처리 담당자에게는 GUI 기반 도구보다 훨씬 유연하고 자동화가 가능한 장점이 있다.
이번 글에서는 Pydicom의 기본적인 사용법을 예제 코드 중심으로 설명하며, 실제 데이터셋 처리에 바로 적용할 수 있도록 구성했다.
1. Pydicom 설치
pip install pydicom
// 추가 이미지 처리 필요한 경우
pip install matplotlib numpy
- 추가로 이미지 처리까지 하고 싶다면 matplotlib, numpy 설치 필요
2. DICOM 파일 읽기
import pydicom
ds = pydicom.dcmread("sample.dcm")
print(ds)
- ds는 Dataset 객체이며, 모든 DICOM 태그에 접근 가능
- 파일의 전체 메타데이터가 출력됨
3. 주요 태그 접근 방법
print(ds.PatientName) # 환자 이름
print(ds.StudyDate) # 검사 일자
print(ds.Modality) # 장비 종류 (CT, MR 등)
print(ds.Rows, ds.Columns) # 이미지 크기
- 존재하지 않는 태그에 접근하면 AttributeError 발생할 수 있으므로
get() 방식 사용 권장:
print(ds.get("PatientID", "Unknown"))
4. Pixel Data 확인 및 이미지 출력
import matplotlib.pyplot as plt
plt.imshow(ds.pixel_array, cmap="gray")
plt.title(f"Patient: {ds.PatientID}")
plt.axis("off")
plt.show()
- pixel_array는 NumPy 배열로 자동 변환됨
- PhotometricInterpretation에 따라 색상 반전 여부 고려 필요
예: MONOCHROME1이면 반전 필요
5. 태그 수정 및 저장
이름 변경 예시:
ds.PatientName = "ANONYMOUS"
ds.PatientID = "anon123"
저장:
ds.save_as("modified.dcm")
- 저장 시 원본 DICOM 구조를 그대로 유지해야하니, 다른 이름으로 저장
6. 반복 처리 – 폴더 내 전체 DICOM 익명화
import os
for fname in os.listdir("dicom_folder"):
if fname.endswith(".dcm"):
path = os.path.join("dicom_folder", fname)
ds = pydicom.dcmread(path)
ds.PatientName = ""
ds.PatientID = ""
ds.save_as(os.path.join("output_folder", fname))
📌 위 코드는 환자 정보 제거 후 새 폴더에 저장하는 자동화 예시이다.
7. Pydicom에서 주의할 점
항목 | 설명 |
JPEG 압축 DICOM | 기본 설정으로는 읽기 불가. pylibjpeg, gdcm 설치 필요 |
Tag 이름 오타 | AttributeError 발생 → .get()으로 방지 |
UID 생성 시 | pydicom.uid.generate_uid() 사용 가능 |
Multiframe | 이미지가 배열로 구성되어 있을 수 있음 → pixel_array.shape 확인 |
Pydicom은 매우 직관적인 라이브러리이지만, 위와 같이 실무에서 자주 마주치는 몇 가지 예외 상황에 주의해야 한다.
- JPEG 압축 파일 처리 문제
기본 상태의 pydicom은 JPEG, JPEG2000 등으로 압축된 DICOM 파일의 Pixel Data를 자동으로 해석하지 못한다.
이 문제를 해결하려면 별도로 pylibjpeg, pylibjpeg-libjpeg, gdcm 같은 라이브러리를 설치해야 한다.
pip install pylibjpeg pylibjpeg-libjpeg pylibjpeg-openjpeg
- 태그 이름 오타
Pydicom은 DICOM 태그 이름을 속성 형태로 접근할 수 있지만(ds.PatientName),
오타나 존재하지 않는 태그를 참조할 경우 AttributeError가 발생한다.
이를 방지하기 위해 ds.get("태그이름", 기본값) 방식을 사용하는 것이 더 안정적이다. - UID 생성
새 DICOM 객체를 생성하거나 고유 식별자를 부여할 경우,
pydicom.uid.generate_uid()를 사용하면 UID 포맷에 맞는 고유한 문자열을 생성할 수 있다. - Multiframe 이미지 처리
일부 영상(예: MR, 초음파, 영상 연속 촬영 등)은 **다중 프레임 구조(Multiframe)**를 가진다.
이런 경우 pixel_array의 shape이 (프레임 수, 세로, 가로)로 구성될 수 있으므로,
.shape를 먼저 확인하고 필요한 프레임만 선택해 처리해야 한다.
이러한 요소들을 사전에 이해하고 있으면, Pydicom을 활용한 자동화나 AI 파이프라인 구축 시 예상치 못한 오류를 줄일 수 있다.
8. 고급 기능 예고
기본적인 읽기와 쓰기 작업 외에도, Pydicom은 다양한 고급 기능을 지원하며 다음과 같은 방향으로 확장할 수 있다:
- 태그 삽입 및 삭제
새로운 태그를 추가하려면 ds.add()를 사용할 수 있고,
특정 태그를 제거하려면 Python 표준 객체처럼 del ds[태그번호] 형태로 삭제할 수 있다.
예를 들어, 새로운 Series Description을 삽입하려면 다음과 같이 작성한다:
from pydicom.tag import Tag
from pydicom.dataelem import DataElement
tag = Tag(0x0008, 0x103E) # Series Description
element = DataElement(tag, 'LO', 'Precontrast Series')
ds.add(element)
- Transfer Syntax UID 확인
파일이 어떤 전송 문법(압축 방식 등)으로 저장되었는지 확인하려면
ds.file_meta.TransferSyntaxUID를 참조하면 된다.
이를 통해 JPEG 압축 여부 등을 판단할 수 있다. - 모든 태그 목록 조회
현재 DICOM 객체에 어떤 태그들이 포함되어 있는지 확인하려면
ds.dir() 또는 for tag in ds:와 같은 반복문을 통해 조회할 수 있다.
태그 이름뿐 아니라 VR(Value Representation), 길이, 값 등을 함께 파악할 수 있다.
이러한 기능을 활용하면, Pydicom을 단순한 읽기 도구를 넘어서 의료영상 전처리 자동화, 데이터 익명화, 커스텀 변환 처리 도구로까지 확장할 수 있다.
결론
Pydicom은 의료영상 데이터 분석 및 AI 전처리에 있어 가장 유연하고 확장 가능한 DICOM 처리 도구 중 하나이다.
단순한 태그 확인부터 픽셀 데이터 시각화, 익명화 처리, 자동화 스크립트까지 Python 코드 몇 줄로 모두 구현할 수 있기 때문에,
GUI 도구보다 반복 작업에 강하고 데이터 파이프라인에 쉽게 통합된다.
다음 글에서는 Python으로 DICOM 이미지를 PNG, JPEG 등으로 변환하는 방법을 소개할 예정이다.
'개발 > DICOM 이야기' 카테고리의 다른 글
18. DICOM 통신 구조 – C-STORE, C-FIND, C-MOVE의 의미 (3) | 2025.07.29 |
---|---|
17. DICOM 이미지 PNG, JPEG로 변환하기 (Python 예제 포함) (0) | 2025.07.29 |
15. DCMTK 사용법 – 명령어 기반 DICOM 도구 활용하기 (1) | 2025.07.29 |
14. DICOM 뷰어 추천 및 비교 – RadiAnt, Weasis, MicroDicom 등 (1) | 2025.07.29 |
13. DICOM 이미지 형식(Pixel Data)과 압축 방식 (0) | 2025.07.29 |