Pydicom+SimpleITK操作DICOM画像データとTAG

4155 ワード

  • 現在のニーズは、元のDCMファイルを臓器分割した後、得られた画像データを新しいdcmファイルとして保存し、新しいdcmファイルヘッダは元のDCMの基本情報を保持し、後期分析を行うことである.操作中に主にいくつかの問題があります:
  • もともとpydicomライブラリしか使っていなかったのですが、圧縮されたdcmファイルが開かないことに気づき、公式サイトでも他のツールで開くしかない(gdcmなど)と言っていたので通じません(こんな使いやすいpydiocmがどうしてこんな問題があるのか分かりません)
  • 後にSimple ITKライブラリに変更し、dcmファイルはすべて開くことができたが、新しいdcmに保存するとまた問題が発生した:Simple ITK保存時に自動的にSeries UIDが生成され、0002の先頭のtagも修正できず、最後に生成されたdcmファイルはすべてシーケンスではなく、非常に卵痛
  • の間に自分でコードを書いてdcmファイルを復号する差があり、最後にpydicomとsimpleitkを結合し、すなわちsimpleitkでデータを読み、pydicomでtagを処理し、新しいdcmを書き込むことに成功した.

  • Pydicom
  • 公式サイトおよび公式チュートリアル:https://pydicom.github.io/pydicom/stable/index.html
  • pydicomによる画像データの読み書き及び修正
    import pydicom
           
    dataset = pydicom.dcmread('.\001.dcm')                #  dicom  
    #val = dataset.data_element('Columns').value          #  TAG    ,      tag
    pixeldata = dataset.pixel_array                       #           ,  
    databyte = dataset.PixelData                          #     byte  ,     
    
    datanew = pixeldata[0:400, 0:400]                     #         
    dataset.Rows, dataset.Columns = datanew.shape         #                
    
    newArray = np.ones([400, 400])+254                    #               
    
    data16 = np.int16(newArray)                           #    int16
    
    #dataset.pixel_array.data = data16                    #            ,       
    
    dataset.PixelData = data16.tobytes()                  #            ,  byte ,       
    
    dataset.save_as(r'.\002.dcm')                         #    dcm  
    
  • .
    1つのdcmの画像データを別のdcmにコピーするには、pixeldataの読み書きに関連するいくつかのtagを考慮する必要があります.rows、columnsのほか、傾き/断面積、高低位などもあります.早めに修正してください.
  • SimpleITK
  • 公式サイトおよび公式チュートリアル:https://simpleitk.readthedocs.io/en/master/index.htmlSimpleITKはpythonによるC++ITKの簡略化でありopencvの医学画像バージョンと見なすことができる.
  • Simple ITKによるdcmデータの読み書き
  • import SimpleITK as sitk
    
    image = sitk.ReadImage('.\001.dcm')                                 #  dicom  
    image_array = sitk.GetArrayFromImage(image)
    np_array = np.int16(image_array)
    image_array = np.squeeze(np_array)                                  #      
    
    im = sitk.GetImageFromArray(image_array)                            #    Tag,      imagearray     dcm
    
    reader = sitk.ImageFileReader()
    reader.SetFileName('.\002.dcm')
    reader.LoadPrivateTagsOn()
    reader.ReadImageInformation()                                       #  Tag  
    
    ImageType = reader.GetMetaData('0008|0008')                         #     Tag,0002       
    im.EraseMetaData('0008|0008')                                       #  Tag,        
    im.SetMetaData('0008|0008', ImageType)                              #   dcm Tag 
    
    SOPClassUID = reader.GetMetaData('0008|0016')
    im.SetMetaData('0008|0016',SOPClassUID)
    
    SOPInstanceUID = reader.GetMetaData('0008|0018')
    im.SetMetaData('0008|0018', SOPInstanceUID)
    
    SeriesInstanceUID = reader.GetMetaData('0020|000e')                 #  Tag   ,          
    im.SetMetaData('0020|000e', SeriesInstanceUID)
    
    sitk.WriteImage(im, '.\003.dcm')                                    #    dcm,        
    
  • pydicom+Simple ITKで圧縮セグメントが読み書きされたdcm
  •  dcm = pydicom.dcmread('.\001.dcm')                                  #          dcm        
     
     image = sitk.ReadImage('.\002.dcm')                  
     image_array = sitk.GetArrayFromImage(image)
     np_array = np.int16(image_array)
     image_array = np.squeeze(np_array)                                  #        dcm    
     
     dataset = pydicom.dcmread('.\002.dcm')                              #    Tag,       tag   
     dcm.data_element('PixelSpacing').value = dataset.data_element('PixelSpacing').value
     dcm.data_element('RescaleIntercept').value = dataset.data_element('RescaleIntercept').value
     dcm.data_element('RescaleSlope').value = dataset.data_element('RescaleSlope').value
    
     dcm.PixelData = image_array.tobytes()
     dcm.save_as('.\002.dcm')                                            #