2017-10-27 65 views
0

最近、SimpleITKを使用して一部のDicomイメージを修正し始めました。私はしかし、メタデータを変更することはできません。実際、私はそれにアクセスすることすらできません。Pythonを使用してSimpleITKでDicomイメージのメタデータを取得する方法

私はここで見つかったスクリプトのおかげで:https://github.com/SimpleITK/SimpleITK/pull/262/files?diff=splitメタデータがデフォルトでロードされないのは、処理が遅くなるためです。また、メタデータを読み込むために、次のリーダーメソッドを使用する必要があることも知っています。 ".LoadPrivateTagsOn()"

私は私のイメージオブジェクトに '.GetMetaDataKeys()'メソッドを使用するたびに、空のタプルを返します。私は以下のコードで私に鍵をいくつか与えることを期待していましたが、そうではありませんでした。

#========================================================================= 
 
# 
 
# Copyright Insight Software Consortium 
 
# 
 
# Licensed under the Apache License, Version 2.0 (the "License"); 
 
# you may not use this file except in compliance with the License. 
 
# You may obtain a copy of the License at 
 
# 
 
#   http://www.apache.org/licenses/LICENSE-2.0.txt 
 
# 
 
# Unless required by applicable law or agreed to in writing, software 
 
# distributed under the License is distributed on an "AS IS" BASIS, 
 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 
# See the License for the specific language governing permissions and 
 
# limitations under the License. 
 
# 
 
#========================================================================= 
 

 
from __future__ import print_function 
 

 
import SimpleITK as sitk 
 

 
import sys, time, os 
 
import numpy as np 
 

 
# if len(sys.argv) < 2: 
 
#  print("Usage: python " + __file__ + "<output_directory>") 
 
#  sys.exit (1) 
 

 

 
# Create a new series from a numpy array 
 
new_arr = np.random.uniform(-10, 10, size = (3,4,5)).astype(np.int16) 
 
new_img = sitk.GetImageFromArray(new_arr) 
 
new_img.SetSpacing([2.5,3.5,4.5]) 
 

 
directory = r"C:\Users\jeroen\Documents\2eMaster\Reconstruction3D\Projet Femur\Dicom\test" 
 

 

 
# Write the 3D image as a series 
 
# IMPORTANT: There are many DICOM tags that need to be updated when you modify an 
 
#   original image. This is a delicate opration and requires knowlege of 
 
#   the DICOM standard. This example only modifies some. For a more complete 
 
#   list of tags that need to be modified see: 
 
#       http://gdcm.sourceforge.net/wiki/index.php/Writing_DICOM 
 

 
writer = sitk.ImageFileWriter() 
 
# Use the study/series/frame of reference information given in the meta-data 
 
# dictionary and not the automatically generated information from the file IO 
 
writer.KeepOriginalImageUIDOn() 
 

 
# Copy relevant tags from the original meta-data dictionary (private tags are also 
 
# accessible). 
 
tags_to_copy = ["0010|0010", # Patient Name 
 
       "0010|0020", # Patient ID 
 
       "0010|0030", # Patient Birth Date 
 
       "0020|000D", # Study Instance UID, for machine consumption 
 
       "0020|0010", # Study ID, for human consumption 
 
       "0008|0020", # Study Date 
 
       "0008|0030", # Study Time 
 
       "0008|0050", # Accession Number 
 
       "0008|0060" # Modality 
 
] 
 

 
modification_time = time.strftime("%H%M%S") 
 
modification_date = time.strftime("%Y%m%d") 
 

 
# Copy some of the tags and add the relevant tags indicating the change. 
 
# For the series instance UID (0020|000e), each of the components is a number, cannot start 
 
# with zero, and separated by a '.' We create a unique series ID using the date and time. 
 
# tags of interest: 
 
direction = new_img.GetDirection() 
 
print(new_img.HasMetaDataKey("0008|0021")) 
 
series_tag_values = [(k, new_img.GetMetaData(k)) for k in tags_to_copy if new_img.HasMetaDataKey(k)] + \ 
 
        [("0008|0031",modification_time), # Series Time 
 
        ("0008|0021",modification_date), # Series Date 
 
        ("0008|0008","DERIVED\\SECONDARY"), # Image Type 
 
        ("0020|000e", "1.2.826.0.1.3680043.2.1125."+modification_date+".1"+modification_time), # Series Instance UID 
 
        ("0020|0037", '\\'.join(map(str, (direction[0], direction[3], direction[6],# Image Orientation (Patient) 
 
                direction[1],direction[4],direction[7])))), 
 
        ("0008|103e", "Created-SimpleITK")] # Series Description 
 
print(new_img.GetMetaDataKeys()) 
 
for i in range(new_img.GetDepth()): 
 
    image_slice = new_img[:,:,i] 
 
    # Tags shared by the series. 
 
    for tag, value in series_tag_values: 
 
     image_slice.SetMetaData(tag, value) 
 
    # Slice specific tags. 
 
    image_slice.SetMetaData("0008|0012", time.strftime("%Y%m%d")) # Instance Creation Date 
 
    image_slice.SetMetaData("0008|0013", time.strftime("%H%M%S")) # Instance Creation Time 
 
    image_slice.SetMetaData("0008|0060", "CT") # set the type to CT so the thickness is carried over 
 
    image_slice.SetMetaData("0020|0032", '\\'.join(map(str,new_img.TransformIndexToPhysicalPoint((0,0,i))))) # Image Position (Patient) 
 
    image_slice.SetMetaData("0020,0013", str(i)) # Instance Number 
 

 
    # Write to the output directory and add the extension dcm, to force writing in DICOM format. 
 
    writer.SetFileName(os.path.join(directory,str(i)+'.dcm')) 
 
    writer.Execute(image_slice) 
 
print(new_img.GetMetaDataKeys()) 
 
# Re-read the series 
 
# Read the original series. First obtain the series file names using the 
 
# image series reader. 
 
data_directory = directory 
 
series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(data_directory) 
 
if not series_IDs: 
 
    print("ERROR: given directory \""+data_directory+"\" does not contain a DICOM series.") 
 
    sys.exit(1) 
 
series_file_names = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(data_directory, series_IDs[0]) 
 

 
series_reader = sitk.ImageSeriesReader() 
 
series_reader.SetFileNames(series_file_names) 
 

 
# Configure the reader to load all of the DICOM tags (publicprivate): 
 
# By default tags are not loaded (saves time). 
 
# By default if tags are loaded, the private tags are not loaded. 
 
# We explicitly configure the reader to load tags, including the 
 
# private ones. 
 
series_reader.LoadPrivateTagsOn() 
 
image3D = series_reader.Execute() 
 
print(image3D.GetMetaDataKeys()) 
 
sys.exit(0)

すべてのヘルプは大歓迎です!

編集:私のリーダーで'MetaDataDictionaryArrayUpdateOn() 'モジュールを実行する必要があるようです。しかし、私がそれをやろうとすると、ドキュメンテーションに言及されているにもかかわらず、「ImageSeriesReaderClass」のようなメソッドが存在しないことを常に教えています。助言がありますか?

答えて

0

私はここで自分の質問に答えるつもりです。私がgithubで作った記事のおかげで、私は答えを見つけました。このビルド(1.0.1)ではメソッド '.MetaDataDictionaryArrayUpdateOn()'は実装されていません。

SimpleITK githubコミュニティには2つの回避策があります。

あなたはここにポストを見つけることができます。次のリリース(1月中のどこか)でhttps://github.com/SimpleITK/SimpleITK/issues/331

この問題は解決されます。

関連する問題