def TestRead(filename, verbose=False): r = gdcm.Reader() r.SetFileName(filename) sucess = r.Read() #if verbose: print r.GetFile() if verbose: print r.GetFile().GetDataSet() return sucess
def TestStringFilter(filename, verbose=False): r = gdcm.Reader() r.SetFileName(filename) success = r.Read() if (not success): return 1 file = r.GetFile() ds = file.GetDataSet() # Change gdcm struct into something swig can digest: pds = gdcm.PythonDataSet(ds) sf = gdcm.StringFilter() pds.Start() # Make iterator go at beginning dic1 = {} dic2 = {} sf.SetFile(file) # extremely important while (not pds.IsAtEnd()): t = str(pds.GetCurrent().GetTag()) res = sf.ToStringPair(pds.GetCurrent().GetTag()) dic2[t] = res[1] dic1[res[0]] = res[1] pds.Next() #print dic1 #print dic2 try: print "Pixel Representation=", dic2['(0028,0103)'] except KeyError: print "Tag not found in dataset" return 0
def ProcessOneFilePublic(filename, outfilename, tmpfile): gdcm.ImageHelper.SetForceRescaleInterceptSlope(True) vtkreader = vtkgdcm.vtkGDCMImageReader() vtkreader.SetFileName(filename) vtkreader.Update() cast = vtk.vtkImageCast() cast.SetInput(vtkreader.GetOutput()) cast.SetOutputScalarTypeToUnsignedShort() # vtkGDCMImageWriter does not support Sequence, so let's write a tmp file first: # Some operation will actually be discarded (we simply need a temp storage) vtkwriter = vtkgdcm.vtkGDCMImageWriter() vtkwriter.SetFileName(tmpfile) vtkwriter.SetMedicalImageProperties(vtkreader.GetMedicalImageProperties()) vtkwriter.SetDirectionCosines(vtkreader.GetDirectionCosines()) print "Format:", vtkreader.GetImageFormat() vtkwriter.SetImageFormat(vtkreader.GetImageFormat()) vtkwriter.SetInput(cast.GetOutput()) #vtkwriter.Update() vtkwriter.Write() # ok now rewrite the exact same file as the original (keep all info) # but use the Pixel Data Element from the written file tmpreader = gdcm.ImageReader() tmpreader.SetFileName(tmpfile) if not tmpreader.Read(): sys.exit(1) reader = gdcm.Reader() reader.SetFileName(filename) if not reader.Read(): sys.exit(1) # Make sure to remove Slope/Rescale to avoid re-execution ds = reader.GetFile().GetDataSet() tags = [ gdcm.Tag(0x0028, 0x1052), gdcm.Tag(0x0028, 0x1053), gdcm.Tag(0x0028, 0x1053), ] for tag in tags: ds.Remove(tag) writer = gdcm.ImageWriter() writer.SetFileName(outfilename) # Pass image from vtk written file writer.SetImage(tmpreader.GetImage()) # pass dataset from initial 'reader' writer.SetFile(reader.GetFile()) if not writer.Write(): sys.exit(1)
def __init__(self, filename): self.image_reader = gdcm.ImageReader() self.image_reader.SetFileName(filename) self.reader = gdcm.Reader() self.reader.SetFileName(filename) if not self.reader.Read(): raise DicomFileReadFailed("{} dicom file read failed.".format( filename)) self.dicom_file = self.reader.GetFile() self.dicom_dataset = self.dicom_file.GetDataSet() self.dicom_header = self.dicom_file.GetHeader() if not self.image_reader.Read(): raise DicomImageReadFailed("{} image read failed.".format( filename))
def TestModifyFields(filename): outfilename = filename + ".rewrite" r = gdcm.Reader() r.SetFileName(filename) sucess = r.Read() #print r.GetFile().GetDataSet() ds = r.GetFile().GetDataSet() #print dir(ds) # eg, let's remove a tag removetag = gdcm.Tag(0x0043, 0x106f) if ds.FindDataElement(removetag): ds.Remove(removetag) # let's replace a value: replacetag = gdcm.Tag(0x0010, 0x0010) if ds.FindDataElement(replacetag): de = ds.GetDataElement(replacetag) #print dir(de) patname = "This^is^an^example" vl = gdcm.VL(len(patname)) de.SetByteValue(patname, vl) # let's insert a new dataelement # <entry group="0012" element="0062" vr="CS" vm="1" name="Patient Identity Removed"/> pir = gdcm.DataElement(gdcm.Tag(0x0012, 0x0062)) pir.SetVR(gdcm.VR(gdcm.VR.CS)) # specify the VR explicitely yes = "YES" pir.SetByteValue(yes, gdcm.VL(len(yes))) ds.Insert(pir) # try again but pretend we don't know the VR # <entry group="0012" element="0063" vr="LO" vm="1-n" name="De-identification Method"/> deidmethod = gdcm.Tag(0x0012, 0x0063) # retrieve the supreme global instance, sum of all knowledge in da whole universe: dicomdicts = gdcm.GlobalInstance.GetDicts() dictel = dicomdicts.GetDictEntry(deidmethod) #print dictel.GetVR() deid = gdcm.DataElement(deidmethod) deid.SetVR(dictel.GetVR()) methodstr = "Well known Company" #deid.SetByteValue( methodstr, gdcm.VL(len(methodstr)) ) deid.SetByteValue(methodstr, gdcm.VL(len(methodstr))) ds.Insert(deid) #w = gdcm.Writer() #w.SetFileName( outfilename ) #w.SetFile( r.GetFile() ) #sucess = w.Write() return sucess
def _read_all_tags(self, filename): r = gdcm.Reader(filename) r.Read() f = r.GetFile() ds = file.GetDataSet() pds = gdcm.PythonDataSet(ds) sf = gdcm.StringFilter() pds.Start() # Make iterator go at begining dic = {} sf.SetFile(f) # extremely important while (not pds.IsAtEnd()): res = sf.ToStringPair(pds.GetCurrent().GetTag()) dic[res[0]] = res[1] pds.Next() return dic
def TestAnonymizer(filename, verbose=False): r = gdcm.Reader() r.SetFileName(filename) sucess = r.Read() if (not sucess): return 1 #print r.GetFile().GetDataSet() ano = gdcm.Anonymizer() ano.SetFile(r.GetFile()) # 1. Replace with another value ano.Replace(gdcm.Tag(0x0010, 0x0010), "Test^Anonymize") # 2. Remove a tag (even a SQ) ano.Remove(gdcm.Tag(0x0008, 0x2112)) # 3. Make a tag empty ano.Empty(gdcm.Tag(0x0008, 0x0070)) # Call the main function: sucess = ano.RemovePrivateTags() # do it ! if (not sucess): return 1 # Check we can also change value from binary field #ano.Replace( gdcm.Tag(0x0010,0x0010), "16", gdcm. ) # Let's check if our anonymization worked: if verbose: print(ano.GetFile().GetDataSet()) # So at that point r.GetFile() was modified, let's simply passed it to the Writer: # First find a place where to write it out: subdir = "TestAnonymizerPython" tmpdir = gdcm.Testing.GetTempDirectory(subdir) if not gdcm.System.FileIsDirectory(tmpdir): gdcm.System.MakeDirectory(tmpdir) # Ok directory does exist now, extract the name of the input file, and merge it in # our newly created tmpdir: outfilename = gdcm.Testing.GetTempFilename(filename, subdir) w = gdcm.Writer() w.SetFileName(outfilename) w.SetFile(r.GetFile()) w.SetCheckFileMetaInformation(False) sucess = w.Write() if (not sucess): return 1 if verbose: print("Success to write: %s" % outfilename) return sucess
def anonymizeOneFile(self, fin, fout): reader = gdcm.Reader() reader.SetFileName(fin) ret = reader.Read() if not ret: return (False, "File could not been read") (ar, af) = self._anonymizeOneFile(reader.GetFile()) if not ar: return (False, "Error while anonymizing") writer = gdcm.Writer() writer.SetFileName(fout) writer.SetFile(af) writer.Write() return (True, "OK")
def __init__(self, fname): self.fname = fname self.file_name, self.file_extension = os.path.splitext(fname) reader = gdcm.Reader() reader.SetFileName(fname) if not reader.Read(): raise InvalidDicom("Not a valid DICOM file") self._file = reader.GetFile() self._header = self._file.GetHeader() self._dataset = self._file.GetDataSet() self._str_filter = gdcm.StringFilter() self._str_filter.SetFile(self._file) self._image = None self._anon_obj = None self._errors = None self._warnings = None
def example1(): b = Gdcmanon.Gdcmanon(key = 'openssl/key.key', cert = 'openssl/cert.pem', \ salt = '55') anon = b.getInstance() r = gdcm.Reader() r.SetFileName('input.dcm') r.Read() anon.SetFile(r.GetFile()) if not anon.BasicApplicationLevelConfidentialityProfile( True): # False to decrypt print("Error during anonymization", file=sys.stderr) else: w = gdcm.Writer() w.SetFileName('out.dcm') w.SetFile(anon.GetFile()) w.Write()
python GetPortionCSAHeader.py input.dcm Footnote: SIEMENS is not publishing any information on the CSA header. So any info extracted is at your own risk. """ import sys import gdcm if __name__ == "__main__": file = sys.argv[1] r = gdcm.Reader() r.SetFileName(file) if not r.Read(): sys.exit(1) ds = r.GetFile().GetDataSet() csa_t1 = gdcm.CSAHeader() csa_t2 = gdcm.CSAHeader() #print csa t1 = csa_t1.GetCSAImageHeaderInfoTag() print t1 t2 = csa_t2.GetCSASeriesHeaderInfoTag() print t2 # Let's do it for t1: if ds.FindDataElement(t1): csa_t1.LoadFromDataElement(ds.GetDataElement(t1))
def process_mrs_siemens_csa(dcm_dir): # ###USE THIS FOR DICOM FILES THAT HAVE CSA HEADERS### # # # Make a top-level instance and hide in top left corner, get filepath # root = Tkinter.Tk() # root.geometry('0x0+0+0') # root.attributes("-topmost", 1) # dcm_dir = tkFileDialog.askdirectory(parent=root) # root.attributes("-topmost", 0) # root.destroy() root_dir = os.path.abspath(os.path.join(dcm_dir, os.pardir)) pat_name = os.path.split(os.path.dirname(dcm_dir))[1] f = file(root_dir + '/preproc_dump.txt', 'w') l = [] for fname in glob.glob(dcm_dir + '/*.dcm'): try: d = dicom.read_file(fname, force="True") # if d.SoftwareVersions[-3:]=="B17": if (0x7fe1, 0x1010) in d: d.DataPointColumns = len(d[0x7fe1, 0x1010].value) / 8 d.DataPointRows = 1 l.append([ fname, int(d.SeriesNumber), d.AcquisitionNumber, d.DataPointColumns, d.DataPointRows ]) except AttributeError: print('...') except IOError: print 'no such file' for nlist in range(0, len(l)): if l[nlist][2] == 1: try: d = dicom.read_file(l[nlist][0], force='TRUE') # d.SpectroscopyAcquisitionDataColumns = lambda: None # d.SpectroscopyAcquisitionDataColumns = d.DataPointColumns d.SpectroscopyAcquisitionDataColumns = l[nlist][3] # d.ProtocolName=str(d.ProtocolName).replace (" ","_") # d.ProtocolName="HELIX" # p1 = subprocess.Popen(["gdcmdump", "-C",l[nlist][0]], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # csa1 = p1.communicate()[0] # d.ProtocolName=csa1.split("tProtocolName")[1].split("\t")[2].split("\r")[0].split('"')[2] # print >>f, 'file: '+l[nlist][0]+'\tSeries: '+d.ProtocolName #print(l[nlist][0]) # if d.WaterReferencedPhaseCorrection =="YES": # ecc_str = 'ECC' # else: # ecc_str = 'NO_ECC' ecc_str = 'NO_ECC' # fname_new=(str(d.SeriesNumber)+'_'+str(d.ProtocolName).replace (" ","_").replace("/","_")+'_'+str(1)+'_'+ecc_str) # if not os.path.exists(root_dir + '/' + pat_name + '_PREPROC_LCM'): # os.makedirs(root_dir + '/' + pat_name + '_PREPROC_LCM') # d.save_as(root_dir + '/' + pat_name + '_PREPROC_LCM/' + fname_new) series = l[nlist][1] npts = l[nlist][3] avg = 0 for plist in range(0, len(l)): if l[plist][1] == series: avg = avg + 1 print(avg) fname_new = ( str(d.SeriesNumber) + '_' + str(d.ProtocolName).replace(" ", "_").replace("/", "_") + '_' + str(avg) + '_' + ecc_str) spec_data = np.zeros(shape=(avg * npts * 2)) n = [] for k in np.arange(0, npts): n.append( struct.unpack('f', d[0x7fe1, 0x1010].value[4 * k:4 * k + 4])[0]) spec_data[0:(npts * 2)] = array.array('f', d[0x7fe1, 0x1010].value) # spec_data[0:(npts*2)]=d.SpectroscopyData for plist in range(0, len(l)): if l[plist][1] == series: print(l[plist][0]) try: d_sub = dicom.read_file(l[plist][0]) # d_sub.ProtocolName=str(d_sub.PatientName).replace (" ","_") nsub = int(l[plist][2] - 1) spec_data[(nsub * npts * 2):((nsub + 1) * npts * 2)] = array.array( 'f', d_sub[0x7fe1, 0x1010].value) print >> f, 'file: ' + l[plist][ 0] + '\tSeries: ' + d_sub.ProtocolName print(l[plist][0]) except AttributeError: print('...') except IOError: print 'no such file' except InvalidDicomError: print 'Invalid Dicom file' spec_data_dummy = np.zeros( d.SpectroscopyAcquisitionDataColumns * avg * 2) spec_data_dummy[0:d.SpectroscopyAcquisitionDataColumns * avg * 2:2] = spec_data[ 1:d.SpectroscopyAcquisitionDataColumns * avg * 2:2] spec_data_dummy[1:d.SpectroscopyAcquisitionDataColumns * avg * 2:2] = spec_data[ 0:d.SpectroscopyAcquisitionDataColumns * avg * 2:2] d.SpectroscopyData = list(spec_data_dummy) r = gdcm.Reader() r.SetFileName(str(l[nlist][0])) r.Read() ds = r.GetFile().GetDataSet() csa_h1 = gdcm.CSAHeader() csa1 = csa_h1.GetCSAImageHeaderInfoTag() print csa1 if ds.FindDataElement(csa1): csa_h1.LoadFromDataElement(ds.GetDataElement(csa1)) d.EffectiveEchoTime = float( str(csa_h1.GetCSAElementByName("EchoTime").GetValue())) d.RepetitionTime = float( str( csa_h1.GetCSAElementByName( "RepetitionTime").GetValue())) d.TransmitterFrequency = float( str( csa_h1.GetCSAElementByName( "ImagingFrequency").GetValue())) d.SpectralWidth = 1e9 / float( str( csa_h1.GetCSAElementByName( "RealDwellTime").GetValue())) d.EchoTime = d.EffectiveEchoTime seqtype = str( csa_h1.GetCSAElementByName( "SequenceName").GetValue()).split("*")[1] if seqtype == 'svs_st': d.VolumeLocalizationTechnique = 'STEAM' elif seqtype == 'svs_se': d.VolumeLocalizationTechnique = 'PRESS' if not os.path.exists(root_dir + '/' + pat_name + '_PREPROC_LCM'): os.makedirs(root_dir + '/' + pat_name + '_PREPROC_LCM') # if not os.path.exists(root_dir + '/' + pat_name + '_LCM_Results'): # os.makedirs(root_dir + '/' + pat_name + '_LCM_Results') d.save_as(root_dir + '/' + pat_name + '_PREPROC_LCM/' + fname_new) except AttributeError: print('...') except IOError: print 'no such file...' except InvalidDicomError: print 'Invalid Dicom file' f.close() print('DONE!')
def ProcessOneFilePrivate(filename, outfilename, tmpfile): vtkreader = vtkgdcm.vtkGDCMImageReader() vtkreader.SetFileName(filename) vtkreader.Update() # (2005,1409) DS 4 0.0 # (2005,140a) DS 16 1.52283272283272 # (2005,0014) LO 26 Philips MR Imaging DD 005 tag1 = gdcm.PrivateTag(0x2005, 0x09, "Philips MR Imaging DD 005") tag2 = gdcm.PrivateTag(0x2005, 0x0a, "Philips MR Imaging DD 005") # Need to access some private tags, reread the file (for now): reader = gdcm.Reader() reader.SetFileName(filename) if not reader.Read(): sys.exit(1) ds = reader.GetFile().GetDataSet() el1 = ds.GetDataElement(tag1) el2 = ds.GetDataElement(tag2) #pf = gdcm.PythonFilter() #pf.SetFile( reader.GetFile() ) #print el1.GetTag() print el1.GetByteValue() v1 = eval(el1.GetByteValue().GetBuffer()) print el2.GetByteValue() v2 = eval(el2.GetByteValue().GetBuffer()) print v1 shift = v1 print v2 scale = v2 ss = vtk.vtkImageShiftScale() ss.SetInput(vtkreader.GetOutput()) # because VTK image shift / scale convention is inverted from DICOM make sure shift is 0 assert shift == 0 ss.SetShift(shift) ss.SetScale(scale) ss.SetOutputScalarTypeToUnsignedShort() ss.Update() # vtkGDCMImageWriter does not support Sequence, so let's write a tmp file first: # Some operation will actually be discarded (we simply need a temp storage) vtkwriter = vtkgdcm.vtkGDCMImageWriter() vtkwriter.SetFileName(tmpfile) vtkwriter.SetMedicalImageProperties(vtkreader.GetMedicalImageProperties()) vtkwriter.SetDirectionCosines(vtkreader.GetDirectionCosines()) vtkwriter.SetImageFormat(reader.GetImageFormat()) # do not pass shift/scale again vtkwriter.SetInput(ss.GetOutput()) #vtkwriter.Update() vtkwriter.Write() # ok now rewrite the exact same file as the original (keep all info) # but use the Pixel Data Element from the written file tmpreader = gdcm.ImageReader() tmpreader.SetFileName(tmpfile) if not tmpreader.Read(): sys.exit(1) writer = gdcm.ImageWriter() writer.SetFileName(outfilename) # Pass image from vtk written file writer.SetImage(tmpreader.GetImage()) # pass dataset from initial 'reader' writer.SetFile(reader.GetFile()) if not writer.Write(): sys.exit(1)