개발/DICOM 이야기

16. Pydicom 입문 – Python으로 DICOM 파일 읽고 쓰기

devbake 2025. 7. 29. 16:00

AI 모델에 의료영상 데이터를 적용하거나, DICOM 메타데이터를 분석해야 하는 상황에서는
전문 소프트웨어 없이 코드로 직접 DICOM 파일을 다룰 수 있는 방법이 필요하다.
Python 기반의 오픈소스 라이브러리인 Pydicom은 이러한 요구를 충족시키며,
DICOM 파일을 간단하게 읽고, 태그를 확인하고, 수정하고, 저장하는 작업을 빠르게 수행할 수 있다.
특히 AI 연구자나 의료영상 전처리 담당자에게는 GUI 기반 도구보다 훨씬 유연하고 자동화가 가능한 장점이 있다.
이번 글에서는 Pydicom의 기본적인 사용법을 예제 코드 중심으로 설명하며, 실제 데이터셋 처리에 바로 적용할 수 있도록 구성했다.

 

Pydicom 입문 – Python으로 DICOM 파일 읽고 쓰기

 

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 등으로 변환하는 방법을 소개할 예정이다.