簡體   English   中英

如何使用Python在SimpleITK中獲取Dicom圖像的元數據

[英]How to get Meta data of Dicom image in SimpleITK using 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'沒有這樣的方法,即使在文檔中提到了它。 有什么建議么?

我要在這里回答我自己的問題。 感謝我在github上發表的一篇文章,我找到了答案。 事實證明,此版本(1.0.1)中未實現方法'.MetaDataDictionaryArrayUpdateOn()'。

有2個變通辦法,請轉到SimpleITK github社區。

您可以在這里找到該帖子: https : //github.com/SimpleITK/SimpleITK/issues/331

在下一個版本(一月份的某個時間),此問題將得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM