Example #1
0
def loadDicomZip(filename, statusfunc=lambda s, c, n: None):
    series = {}
    count = 0

    with zipfile.ZipFile(filename) as z:
        names = z.namelist()
        numfiles = len(names)
        for n in names:
            nfilename = '%s?%s' % (filename, n)
            s = StringIO(z.read(n))
            try:
                dcm = dicomio.read_file(s)
            except:
                pass  # ignore files which aren't Dicom files
            else:
                seriesid = dcm.get('SeriesInstanceUID', '???')

                if seriesid not in series:
                    series[seriesid] = DicomSeries(seriesid, nfilename)

                try:  # attempt to create the image matrix, store None if this doesn't work
                    rslope = float(dcm.get('RescaleSlope', 1) or 1)
                    rinter = float(dcm.get('RescaleIntercept', 0) or 0)
                    img = dcm.pixel_array * rslope + rinter
                except:
                    img = None

                s = series[seriesid]
                s.addFile(nfilename, dcm)
                s.tagcache[len(s.filenames) - 1] = dcm
                s.imgcache[len(s.filenames) - 1] = img

            count += 1
            # update status only 100 times, doing it too frequently really slows things down
            if numfiles < 100 or count % (numfiles // 100) == 0:
                statusfunc('Loading DICOM files', count, numfiles)

    statusfunc('', 0, 0)

    return list(series.values())