본문 바로가기
반치용/문제해결(trouble shooting)

[파이썬]의료 영상 dicom(dcm 파일)이미지 비식별화

by Cat.8 2020. 6. 5.

pydicom_image_cutter.ipynb
0.92MB

dicom 파일 내 이미지에 환자정보등이 들어가서 지워야 할 상황에 사용할 수 있는 코드입니다.

주의

리눅스 환경에서 돌려야 하며, 아나콘다를 이용해 GDCM을 설치해야 합니다. (흑백은 그냥 잘 돌아갑니다. 색상이 들어간 이미지를 처리할 때 필요합니다.)
GDCM 설치 : conda install gdcm -c conda-forge

 

환경 세팅 순서

리눅스 : (아나콘다 설치 -> 가상환경에 명령어로 gdcm 설치 -> 커널 등록 -> 주피터 노트북이나 랩에서 해당 커널을 선택 후 사용)
윈도우 : docker 설치 -> 리눅스 이미지 받기 -> 8000번 포트(jupyter hub 기준)로/필요한 폴더 마운트 해서 이미지 run-> 위의 리눅스 과정 진행

 

저에게 도커 파일을 받으신 경우에는

1. 도커 데스크탑 설치 및 실행

2. 시작 -> 명령 프롬프트 -> cd [파일을 받은 폴더]

3. docker load -i bcy88/ubuntu_jupyter-image.tar

4. docker run -it -p 8000:8000 -v 윈도우와 공유할폴더:리눅스 내에서 보여줄 폴더 bcy88/ubuntu_jupyter-image.tar

5. ./jupyter.sh

6. 웹브라우저 켜기(크롬 추천) -> 주소창에 localhost:8000

 

코드

import pydicom
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

#파일명 부분 편집
f_dcm = pydicom.dcmread('/home/mount/docker_share/deidentify/test/Exported20200515/image-00000.dcm')
print(f'디바이스 시리얼 : {f_dcm.DeviceSerialNumber}')
print(f'이미지 크기 : {f_dcm.pixel_array.shape}')

# 이미지 확인
plt.rcParams["figure.figsize"] = (10.24,12.80)
plt.imshow(temp_img)

# 케이스별 필터 위치 지정 (상,하,좌,우)
def case_selector(dcm_file):
    if case_router(dcm_file) == 1 :
        return [
                (100,240,0,200),
                (650,750,1100,1280)
                ]
    else :
        return 999

# 케이스 판별 기준
# 이 코드에서는 장비 시리얼 번호와 이미지 크기를 이용함
def case_router(dcm_file):
    if ((dcm_file.DeviceSerialNumber == '073-226') and (dcm_file.Rows == 1024) and (dcm_file.Columns == 1280) ):
        return 1
    else:
        return 999

# 이미지를 자르는 모듈
def image_cutter(y_start,y_end,x_start,x_end):
    if len(f_dcm.pixel_array.shape) == 3:
        size_x, size_y, _ = f_dcm.pixel_array.shape
        temp_img[y_start:y_end,x_start:x_end,:] = 0
    else :
        size_x, size_y = f_dcm.pixel_array.shape
        temp_img[y_start:y_end,x_start:x_end] = 0
        
# 실제 작동 부분
for y_start, y_end, x_start, x_end in case_selector(f_dcm):
    image_cutter(y_start,y_end,x_start,x_end)
    
# 결과물
plt.imshow(temp_img)

자르기만 하는건 그냥 슬라이싱이라서 패스함.  첨부한 ipynb 파일에는 들어가있음

댓글