pydicom公式サイトのサンプルを元に、DICOMファイルを匿名化します。
目次
1.環境
・Jupyter Notebook 5.0.0
・python 3.6.1
・pydicom 1.1.0(インストールは公式サイトを参照)
2.DICOMファイル
pydicom/data/test_files に格納されている、MR_small.dcmを使用します。
また、以下のサイトからDICOMファイルを取得することもできます。
一般社団法人 日本画像医療システム工業会【JIRA】:DICOMの世界
3.サンプルコード
以下のサンプルコードでは、次のタグを匿名化します。
VR:PN
curves tags
PatientID
OtherPatientIDs
OtherPatientIDsSequence
PatientBirthDate
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 53 54 55 56 57 58 59 60 61 62 |
from __future__ import print_function import tempfile import pydicom from pydicom.data import get_testdata_files import difflib # callback function (VR:PN の匿名化) def person_names_callback(dataset, data_element): if data_element.VR == "PN": data_element.value = "anonymous" # callback function (curves tags の匿名化) def curves_callback(dataset, data_element): if data_element.tag.group & 0xFF00 == 0x5000: del dataset[data_element.tag] # 匿名化するDICOMファイルの読み込み filename = get_testdata_files('MR_small.dcm')[0] # ファイルパスを取得 dataset = pydicom.dcmread(filename) # PatientID, VR=PN, curves tags の匿名化 dataset.PatientID = "id" dataset.walk(person_names_callback) # callback関数を登録 dataset.walk(curves_callback) # callback関数を登録 # タイプ3(オプション)のデータ要素は、delまたはdelattrを使用して削除します。 if 'OtherPatientIDs' in dataset: delattr(dataset, 'OtherPatientIDs') if 'OtherPatientIDsSequence' in dataset: del dataset.OtherPatientIDsSequence # タイプ2のデータ要素は、空の文字列を割り当てることで空白にすることができます。 tag = 'PatientSex' if tag in dataset: dataset.data_element(tag).value = '' # private tagを削除します。 dataset.remove_private_tags() # 匿名化した画像を保存します。 output_filename = tempfile.NamedTemporaryFile().name dataset.save_as(output_filename) # 匿名化前後での差分を表示します。 input_filename = filename datasets = tuple([pydicom.dcmread(filename, force=True) for filename in (input_filename, output_filename)]) rep = [] for dataset in datasets: lines = str(dataset).split("\n") lines = [line + "\n" for line in lines] rep.append(lines) diff = difflib.Differ() for line in diff.compare(rep[0], rep[1]): if line[0] != "?" and line[0] != " ": print(line) |
差分の表示方法についての詳細は、こちらに記載しています。