예제 #1
0
def load_data(filename, csv=None, axis=0):
    data3d, _ = DR.read(filename)
    labels = []
    slab = []
    if csv:
        df = pd.read_csv(csv)
        labs = np.unique(df["label"])
        vals = range(len(labs))

        slab = dict(zip(vals, labs))
        rev_slab = dict(zip(labs, vals))

        fn_unique = np.unique(df["filename"])

        name = filename.split('/')[-1]

        file_list = [
            i for i, item in enumerate(fn_unique) if item.endswith(name)
        ]

        index = file_list[0]

        this_fn = fn_unique[index]
        one_file = df[df["filename"] == this_fn]

        maximum_slice_number = np.max(
            np.max(one_file[["start_slice_number", "stop_slice_number"]]))

        labels = [None] * maximum_slice_number

        dct = one_file[["label", "start_slice_number",
                        "stop_slice_number"]].to_dict()
        start = dct['start_slice_number'].values()
        stop = dct['stop_slice_number'].values()
        label = dct['label'].values()
        for i in vals:
            a = start[i]
            b = stop[i]
            lab = rev_slab[label[i]]
            c = [lab] * (b + 1 - a)
            labels[a:b + 1] = c
        for ind, position in enumerate(labels):
            zer = np.zeros(len(vals))
            zer[position - 1] = 1
            labels[ind] = zer

    if len(data3d.shape) == 3:
        if axis != 0:
            data3d = np.rollaxis(data3d, axis)
        images = list()
        for i in data3d:
            images.append(i)

    else:
        if axis != 0:
            print 'jednotlivé řezy musí být otočeny kolem správné osy'
        images = data3d

    return images, labels, slab
예제 #2
0
    def test_write_read_hdf5(self):
        import io3d.datawriter as dwriter
        import io3d.datareader as dreader
        import h5py
        filename = 'test_file.hdf5'
        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        metadata = {'voxelsize_mm': [1, 2, 3]}
        dwriter.write(data, filename, filetype='hdf5', metadata=metadata)

        fi = h5py.File(filename, "r")
        for key in fi.keys():
            fi [key]

        datap = dreader.read(filename, dataplus_format=True)
        print(datap)
예제 #3
0
    def test_write_read_hdf5(self):
        import io3d.datawriter as dwriter
        import io3d.datareader as dreader
        import h5py
        filename = 'test_file.hdf5'
        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        metadata = {'voxelsize_mm': [1, 2, 3]}
        dwriter.write(data, filename, filetype='hdf5', metadata=metadata)

        fi = h5py.File(filename, "r")
        for key in fi.keys():
            fi[key]

        datap = dreader.read(filename, dataplus_format=True)
        print(datap)
예제 #4
0
    def test_write_and_read_hdf5(self):
        filename = 'test_file.hdf5'
        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        metadata = {'voxelsize_mm': [1, 2, 3]}
        dwriter.write(data, filename, filetype='hdf5', metadata=metadata)

        newdata, newmetadata = dreader.read(filename, dataplus_format=False)

        # hack with -1024, because of wrong data reading
        self.assertEqual(data[10, 10, 10], newdata[10, 10, 10])
        self.assertEqual(data[2, 10, 1], newdata[2, 10, 1])
        self.assertEqual(newmetadata['voxelsize_mm'][0],
                         newmetadata['voxelsize_mm'][0])
# @TODO there is a bug in SimpleITK. slice voxel size must be same
        # self. assertEqual(metadata['voxelsize_mm'][1],
        #                   newmetadata['voxelsize_mm'][1])
        self.assertEqual(metadata['voxelsize_mm'][2],
                         newmetadata['voxelsize_mm'][2])
        os.remove(filename)
예제 #5
0
def ircad_group(datadirpath, organ='liver'):
    # datadirpath = '/home/trineon/projects/metalisa/data/IRCAD'
    for folder in glob.glob(datadirpath + '/labels/*/' + organ + '/'):
        name = folder.split('/')[-3]
        if (folder + 'IRCAD_' + str(name) + '_' + organ +
                '.pklz') in glob.glob(folder + '*'):
            continue

        else:
            # concatenate CT slicis to one 3D ndarray [number_of slices, res(1), res(2)]
            scan = [None] * len(glob.glob(folder + '*'))
            for image in glob.glob(folder + '*'):
                label, _ = DR.read(image)
                scan[int(image.split('/')[-1].split('_')[-1])] = label
            scan = np.array(scan).astype(np.int32)
            scan = scan.squeeze()
            DW.write(scan,
                     folder + 'IRCAD_' + str(name) + '_' + organ + '.pklz',
                     metadata={"voxelsize_mm": [1, 1, 1]})

    pass
예제 #6
0
    def test_write_and_read_hdf5(self):
        filename = 'test_file.hdf5'
        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        metadata = {'voxelsize_mm': [1, 2, 3]}
        metadata[5] = "not a number"
        metadata[7] = ["not a number"]
        dwriter.write(data, filename, filetype='hdf5', metadata=metadata)

        newdata, newmetadata = dreader.read(filename, dataplus_format=False)

        # hack with -1024, because of wrong data reading
        self.assertEqual(data[10, 10, 10], newdata[10, 10, 10])
        self.assertEqual(data[2, 10, 1], newdata[2, 10, 1])
        self.assertEqual(newmetadata['voxelsize_mm'][0],
                         newmetadata['voxelsize_mm'][0])
        self.assertEqual(newmetadata[7][0],
                         newmetadata[7][0])
# @TODO there is a bug in SimpleITK. slice voxel size must be same
        # self. assertEqual(metadata['voxelsize_mm'][1],
        #                   newmetadata['voxelsize_mm'][1])
        self.assertEqual(metadata['voxelsize_mm'][2],
                         newmetadata['voxelsize_mm'][2])
        os.remove(filename)
예제 #7
0
def sliver_preparation(datadirpath,
                       output_datadirpath="output_data",
                       res=100,
                       ax=0,
                       organ='liver'):
    csvpath = output_datadirpath + '/sliver_label_' + str(res) + '_' + str(
        ax) + '_' + organ + '.csv'
    stat = output_datadirpath + '/sliver_stat' + str(res) + '_' + str(
        ax) + '_' + organ + '.csv'
    # datadirpath = '/home/trineon/projects/metalisa/data/SLIVER'
    f = h5py.File(
        output_datadirpath + '/sliver_' + str(res) + '_' + str(ax) + '_' +
        organ + '.hdf5', 'a')
    num = 1
    for image in glob.glob(datadirpath + '/*orig*.mhd'):
        group = f.create_group(image.split('/')[-1])
        orig, _ = DR.read(image)
        if ax != 0:
            orig = np.rollaxis(orig, ax)
        i = orig.shape[0]
        orig = misc.resize_to_shape(orig, [i, res, res])
        DW.write(orig,
                 output_datadirpath + '/sliver_' + str(num) + '_' + str(res) +
                 '_' + str(ax) + '.pklz',
                 metadata={"voxelsize_mm": [1, 1, 1]})
        filename = output_datadirpath + '/sliver' + str(num) + '_' + str(
            res) + '_' + str(ax) + '.pklz'
        num += 1
        seg = image.replace('orig', 'seg')
        lab, _ = DR.read(seg)
        if ax != 0:
            lab = np.rollaxis(lab, ax)
        l = list()
        a = 1
        for slice in lab:
            if len(np.unique(slice)) > 1:
                l.append(2)
                a = 2
            else:
                if a == 2:
                    l.append(3)
                else:
                    l.append(1)

        del lab
        for ind, slice in enumerate(orig):
            name = str(ind)
            dset = group.create_dataset(name, data=slice)
            dset.attrs['teacher'] = l[ind]
            dset.attrs['origin file'] = filename
        if l[-1] == 2:
            x = len(l)
        else:
            x = l.index(3)
        if l[0] == 2:
            y = 0
        else:
            y = l.index(2)
        dt = {
            'filename': [filename, filename, filename],
            'label': ['under ' + organ, organ, 'above ' + organ],
            'start_slice_number': [0, y, x],
            'stop_slice_number': [y - 1, x - 1, len(l) - 1],
            'axis': ax
        }
        if dt['stop_slice_number'][0] == -1:
            dt['stop_slice_number'][0] = 0
        if os.path.exists(csvpath):
            new_df = pd.read_csv(csvpath)
            df = pd.DataFrame.from_dict(dt)
            new_df = pd.concat([new_df, df], ignore_index=True)
        else:
            df0 = pd.DataFrame.from_dict(dt)
            new_df = df0
        new_df.to_csv(csvpath, index=False)
        a = y
        b = x - y
        c = len(l) - x
        dt = {
            'filename': [filename],
            'under liver': [a],
            'liver': [b],
            'above liver': [c],
            'slices': [len(l)]
        }
        if os.path.exists(stat):
            new_df = pd.read_csv(stat)
            df = pd.DataFrame.from_dict(dt)
            new_df = pd.concat([new_df, df], ignore_index=True)
        else:
            df0 = pd.DataFrame.from_dict(dt)
            new_df = df0
        new_df.to_csv(stat, index=False)

    pass
예제 #8
0
def ircad_preparation(datadirpath,
                      output_datadirpath="output_data",
                      organ="liver",
                      res=100,
                      ax=0):

    #test
    stat = output_datadirpath + '/stat_ircad' + str(res) + '_' + str(
        ax) + '_' + organ + '.csv'
    csvpath = output_datadirpath + '/label_ircad_' + str(res) + '_' + str(
        ax) + '_' + organ + '.csv'
    # datadirpath = '/home/trineon/projects/metalisa/data/IRCAD'

    seznam = [None] * 20
    for folder in glob.glob(datadirpath + '/Pacient/*/'):
        count = len(glob.glob(folder + '*'))
        l = [None] * count
        for image in glob.glob(folder + '*'):
            number = int(image.split('/')[-1].split('_')[-1]) - 1
            l[number], _ = DR.read(image)
            if ax != 0:
                l[number] = np.rollaxis(l[number], ax)
        for ind, i in enumerate(l):
            l[ind] = misc.resize_to_shape(i, [1, res, res])
        scan = np.array(l)
        if ax != 0:
            np.rollaxis(scan, ax)
        name = folder.split('/')[-2]
        scan = scan.squeeze()
        DW.write(scan,
                 output_datadirpath + '/IRCAD_' + str(name) + '_' + str(res) +
                 '_' + str(ax) + '.pklz',
                 metadata={"voxelsize_mm": [1, 1, 1]})
        seznam[int(name) - 1] = output_datadirpath + '/IRCAD_' + str(
            name) + '_' + str(res) + '_' + str(ax) + '.pklz'

    ll = [None] * 20
    for folder in glob.glob(datadirpath + '/labels/*/' + organ + '/'):
        count = len(glob.glob(folder + '*'))
        sez = list()
        for image in glob.glob(folder + 'IRCAD*.pklz'):
            label, _ = DR.read(image)
        if ax != 0:
            label = np.rollaxis(label, ax)
        l = list()
        a = 1
        for slice in label:
            if len(np.unique(slice)) > 1:
                l.append(2)
                a = 2
            else:
                if a == 2:
                    l.append(3)
                else:
                    l.append(1)
        ll[int(folder.split('/')[-3]) - 1] = l
        file = seznam[int(folder.split('/')[-3]) - 1]

        if l[-1] == 2:
            x = len(l)
        else:
            x = l.index(3)
        if l[0] == 2:
            y = 0
        else:
            y = l.index(2)
        dt = {
            'filename': [file, file, file],
            'label': ['under ' + organ, organ, 'above ' + organ],
            'start_slice_number': [0, y, x],
            'stop_slice_number': [y - 1, x - 1, len(l) - 1],
            'axis': ax
        }
        if dt['stop_slice_number'][0] == -1:
            dt['stop_slice_number'][0] = 0
        if os.path.exists(csvpath):
            new_df = pd.read_csv(csvpath)
            df = pd.DataFrame.from_dict(dt)
            new_df = pd.concat([new_df, df], ignore_index=True)
        else:
            df0 = pd.DataFrame.from_dict(dt)
            new_df = df0
        new_df.to_csv(csvpath, index=False)
        a = y
        b = x - y
        c = len(l) - x
        dt = {
            'filename': [file],
            'under liver': [a],
            'liver': [b],
            'above liver': [c],
            'slices': [len(l)]
        }
        if os.path.exists(stat):
            new_df = pd.read_csv(stat)
            df = pd.DataFrame.from_dict(dt)
            new_df = pd.concat([new_df, df], ignore_index=True)
        else:
            df0 = pd.DataFrame.from_dict(dt)
            new_df = df0
        new_df.to_csv(stat, index=False)
    output_datadirpath + '/sliver_' + str(res) + '_' + str(
        ax) + '_' + organ + '.hdf5'
    f = h5py.File(
        output_datadirpath + '/sliver_' + str(res) + '_' + str(ax) + '_' +
        str(organ) + '.hdf5', 'a')
    for index, file in enumerate(seznam):
        group = f.create_group(file.split('/')[-1])
        l = ll[index]
        scan, _ = DR.read(file)
        for ind, slice in enumerate(scan):
            name = str(ind)
            dset = group.create_dataset(name, data=slice)
            dset.attrs['teacher'] = l[ind]
            dset.attrs['origin file'] = file
    f.close()
    pass