pydicom公式サイトのサンプルを元に、pydicomとdifflibを使って2つのDICOMファイルの差分を表示します。
目次
1.環境
・Jupyter Notebook 5.0.0
・python 3.6.1
・pydicom 1.1.0(インストールは公式サイトを参照)
2.DICOMファイル
pydicom/data/test_files に格納されている、MR_small.dcm・CT_small.dcmを使用します。
また、以下のサイトからDICOMファイルを取得することもできます。
一般社団法人 日本画像医療システム工業会【JIRA】:DICOMの世界
3.サンプルコード
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 |
import difflib import pydicom from pydicom.data import get_testdata_files filename_mr = get_testdata_files('MR_small.dcm')[0] filename_ct = get_testdata_files('CT_small.dcm')[0] # tuple型のオブジェクトとして、datasets[0]=MRとdatasets[1]=CT が読み込まれます datasets = tuple([pydicom.dcmread(filename, force=True) for filename in (filename_mr, filename_ct)]) # difflib関数を使用するため、読み込んだDICOMデータを行のリストに変換します。 rep = [] for dataset in datasets: lines = str(dataset).split("\n") # linesの内容(一部) # [ # "(0008, 0008) Image Type CS: ['DERIVED', 'SECONDARY', 'OTHER']", # "(0008, 0012) Instance Creation Date DA: '20040826'", # "(0008, 0013) Instance Creation Time TM: '185434'", lines = [line + "\n" for line in lines] # add the newline to end # linesの内容(一部) 改行コード(\n)を各行の末尾に追加 # [ # "(0008, 0008) Image Type CS: ['DERIVED', 'SECONDARY', 'OTHER']\n", # "(0008, 0012) Instance Creation Date DA: '20040826'\n", # "(0008, 0013) Instance Creation Time TM: '185434'\n", rep.append(lines) # 比較を行い差分を出力します diff = difflib.Differ() for line in diff.compare(rep[0], rep[1]): # rep[0] MR , rep[1] CT if line[0] != "?" and line[0] != " ": print(line) # if line[0] == " ": # print(line) |
実行すると以下のように出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
+ (0008, 0005) Specific Character Set CS: 'ISO_IR 100' - (0008, 0008) Image Type CS: ['DERIVED', 'SECONDARY', 'OTHER'] + (0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL'] - (0008, 0012) Instance Creation Date DA: '20040826' + (0008, 0012) Instance Creation Date DA: '20040119' - (0008, 0013) Instance Creation Time TM: '185434' + (0008, 0013) Instance Creation Time TM: '072731' - (0008, 0016) SOP Class UID UI: MR Image Storage + (0008, 0016) SOP Class UID UI: CT Image Storage |
各行の先頭に、+や- が表示されていますが意味は以下のようになります。
また、サンプルコードの末尾を以下のように変更すると、一致する箇所を表示することもできます。
1 2 3 4 |
for line in diff.compare(rep[0], rep[1]): # rep[0] MR , rep[1] CT if line[0] == " ": print(line) |