Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
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)
Exemplo n.º 4
0
 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))
Exemplo n.º 5
0
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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
    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")
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
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()
Exemplo n.º 11
0
 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))
Exemplo n.º 12
0
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!')
Exemplo n.º 13
0
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)