Programming/Medical Imaging Process

[Python] PyDICOM & DICOM Anonymization ( 비식별정보 )

BadaGreen_Kim 2021. 3. 31. 10:33

 

pydicom

Pydicom

Pydicom은 Python 언어로 Dicom 파일(.dcm)을 다룰 때 사용되는 가장 유명한 패키지이며 DICOM에 대한 비식별정보를 익명화 처리할수 있고 DICOM TAG에 원하는 익명화하여 재저장할 수 있도록 지원해 줄수 있다.

 

PYDICOM 설치 및 유용한 라이브러리

1
2
3
4
pip install pydicom
pip install tqdm
pip install multiprocessing
 
cs

DICOM 불러오기 

1
2
3
4
5
6
7
8
9
10
11
import pydicom as dcm
 
# 1. 모든 데이터 불러오기 (둘 다 가능)
raw_file = dcm.dcmread('filename.dcm')
raw_file = dcm.read_file('filename.dcm')
 
# 2. Header 정보 불러오기 (원하는 헤더명 띄어쓰기 없이 적으면 됨)
date = raw_file.StudyDate
 
# 3. Image Array 불러오기
image = raw_file.pixel_array
cs

 

PyDICOM 익명화 - 식별정보처리

DICOM 파일을 사용할떄 익명화 부분에 대해 많이 고려하고 처리해야하는 부분이 많다. 개인적으로 익명화 데이터는 아래와같이 11개정도 Tag정보를 기준으로 했는데 사용하는사람의 기준에 따라 익명화 처리해도 무방하다

1
2
3
4
5
6
7
8
9
10
11
Metadata.PatientName = 'Anonymized'
Metadata.PatientBirthDate = 'Anonymized'
Metadata.PatientSex = 'Anonymized'
Metadata.OtherPatientIDs = 'Anonymized'
Metadata.PatientAge = 'Anonymized'
Metadata.RequestingPhysician = 'Anonymized'
Metadata.InstitutionName = 'Anonymized'
Metadata.InstitutionAddress = 'Anonymized'
Metadata.ReferringPhysicianName = 'Anonymized'
Metadata.StationName = 'Anonymized'
Metadata.PhysiciansofRecord = 'Anonymized'
cs

 

폴더기준 익명화 처리 예시 코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import os
import pydicom
from tqdm import tqdm
import time
 
# get dcm_file_list
def get_file_list() :
    try :
        list_path = []
        list_file = []
        list_full = []   
        
        for (path, _, filein os.walk('.\\'):
            for each_file in file:
                if each_file[-4:] == '.dcm':
                    list_path.append(path)    
                    list_file.append(each_file)
                    list_full.append(os.path.join(os.getcwd(),path,each_file).replace('.\\',''))
        return list_full
    except : 
        return 'get_file_list error.'    
 
 
# de-identifier for multi
def de_identifier_for_multi(filename):
    try:
        Metadata = pydicom.filereader.dcmread(str(filename))
    exceptreturn 'de_identifier // file reading error. '
    try:            
        # de-identify
        Metadata.PatientName = 'Anonymized'
        Metadata.PatientBirthDate = 'Anonymized'
        Metadata.PatientSex = 'Anonymized'
        Metadata.OtherPatientIDs = 'Anonymized'
        Metadata.PatientAge = 'Anonymized'
        Metadata.RequestingPhysician = 'Anonymized'
        Metadata.InstitutionName = 'Anonymized'
        Metadata.InstitutionAddress = 'Anonymized'
        Metadata.ReferringPhysicianName = 'Anonymized'
        Metadata.StationName = 'Anonymized'
        Metadata.PhysiciansofRecord = 'Anonymized'
 
        Metadata.save_as(str(filename))
 
            # TODO - revive
            # sql_query(True)  
 
    except:            
 
            # TODO - revive
            # sql_query(False)  
            return 'de_identifier error'
cs