개발/DICOM 이야기

17. DICOM 이미지 PNG, JPEG로 변환하기 (Python 예제 포함)

devbake 2025. 7. 29. 17:01

의료영상 데이터는 대부분 DICOM 포맷으로 저장되며, 이 포맷은 의료 정보와 이미지 데이터를 함께 담는 구조다.
그러나 DICOM은 의료 특화 포맷이기 때문에 일반적인 이미지 뷰어나 웹 브라우저에서는 열 수 없고, AI 모델 학습이나 일반 이미지 처리 도구에서도 바로 활용하기 어렵다.
따라서 의료 영상 데이터를 외부에서 활용하거나 비의료 전문가와 공유하려면 DICOM 이미지를 PNG 또는 JPEG 등 범용 이미지 포맷으로 변환해야 한다.
이번 글에서는 Python을 이용해 DICOM 파일의 픽셀 데이터를 불러온 뒤 이미지 파일로 변환하는 과정을 단계별로 설명하고, 실제 파일 경로 기반의 일괄 변환 코드 예시까지 제공한다.

 

DICOM 이미지 PNG, JPEG로 변환하기 (Python 예제 포함)

 

1. 준비: 필요한 패키지 설치

pip install pydicom numpy matplotlib pillow
  • pydicom: DICOM 파일 읽기
  • numpy: 배열 연산
  • matplotlib.pyplot: 시각화
  • Pillow: 이미지 저장 (JPEG, PNG 등)

 

2. 단일 파일 변환 예제 (PNG 저장)

import pydicom
import numpy as np
from PIL import Image

# 파일 경로
path = "sample.dcm"

# DICOM 읽기
ds = pydicom.dcmread(path)

# 픽셀 데이터 가져오기
pixel_array = ds.pixel_array.astype(np.float32)

# 창/레벨 적용 (선택적)
intercept = ds.get('RescaleIntercept', 0)
slope = ds.get('RescaleSlope', 1)
pixel_array = pixel_array * slope + intercept

# 정규화 (0~255)
pixel_array -= np.min(pixel_array)
pixel_array /= np.max(pixel_array)
pixel_array *= 255.0

# 정수형 변환 및 저장
image = Image.fromarray(pixel_array.astype(np.uint8))
image.save("output_image.png")

📌 정규화(normalization) 없이 저장하면 이미지가 모두 까맣게 나올 수 있으므로,
DICOM의 **창 값(Window Center/Width)**이나 RescaleSlope/Intercept를 반영하는 것이 중요하다.

 

 

3. 창(Window) 값 반영 (선택적)

window_center = ds.get('WindowCenter', np.median(pixel_array))
window_width = ds.get('WindowWidth', np.max(pixel_array) - np.min(pixel_array))

# 다중 값일 경우 첫 번째 값 사용
if isinstance(window_center, pydicom.multival.MultiValue):
    window_center = window_center[0]
if isinstance(window_width, pydicom.multival.MultiValue):
    window_width = window_width[0]

min_val = window_center - (window_width / 2)
max_val = window_center + (window_width / 2)

pixel_array = np.clip(pixel_array, min_val, max_val)
pixel_array = ((pixel_array - min_val) / (max_val - min_val)) * 255.0

📌 이 과정을 거치면 영상이 보다 진단용 해상도에 가까운 시각적 품질로 저장된다.

 

 

4. JPEG로 저장 (압축 이미지)

image.save("output_image.jpg", quality=95)
  • JPEG은 압축 저장이 가능해 파일 크기를 줄일 수 있음
  • 단, 의료 원본 보존이 필요할 경우에는 PNG(비손실) 포맷을 권장

 

5. 폴더 내 일괄 변환 코드 예제

import os

input_dir = "./dicom_input"
output_dir = "./converted_png"

os.makedirs(output_dir, exist_ok=True)

for fname in os.listdir(input_dir):
    if fname.lower().endswith(".dcm"):
        try:
            path = os.path.join(input_dir, fname)
            ds = pydicom.dcmread(path)
            arr = ds.pixel_array.astype(np.float32)

            arr -= np.min(arr)
            arr /= np.max(arr)
            arr *= 255.0

            img = Image.fromarray(arr.astype(np.uint8))
            out_path = os.path.join(output_dir, fname.replace(".dcm", ".png"))
            img.save(out_path)
        except Exception as e:
            print(f"Failed to process {fname}: {e}")

📌 수백, 수천 장의 DICOM 파일을 PNG로 변환할 때 사용할 수 있는 자동화 스크립트
실제 AI 프로젝트에서 전처리 단계로 자주 사용된다.

 

 

6. 주의할 점

항목 설명
비정상 이미지 픽셀 데이터가 없는 DICOM은 변환 불가
RGB 컬러 이미지 일부 컬러 DICOM은 채널 분리 후 처리 필요
압축 DICOM pydicom 단독으로는 JPEG 압축 이미지 처리 불가 → pylibjpeg 설치 필요
파일명 환자 정보 기반 파일명 생성은 개인정보 보호 기준에 주의 필요

 

7. 실제 활용 사례

  • AI 학습 데이터 전처리: PNG로 변환 후 학습 폴더 구조에 넣어 사용
  • 논문 작성용 이미지 추출: 특정 슬라이스를 PNG로 저장 후 그래픽툴로 편집
  • 내부 시각화 시스템 구축: 의료인이 아닌 담당자가 쉽게 이미지 확인 가능
  • 환자 교육 자료 제작: 환자 본인의 영상을 쉽게 보기 위해 PNG로 제공

 


결론

DICOM은 의료영상의 표준이지만, 일반적인 이미지 처리 환경에서는 JPEG, PNG로 변환해야만 활용이 가능하다.
Python과 Pydicom, NumPy, Pillow를 조합하면 단일 파일뿐 아니라 폴더 단위로도 손쉽게 이미지 변환을 수행할 수 있으며,
AI 개발, 논문 작성, 데이터 공유 등 다양한 분야에서 실용적으로 활용된다.
다음 글에서는 DICOM 네트워크 통신 구조와 C-STORE, C-FIND, C-MOVE 명령에 대해 다룰 예정이다.