示例#1
0
    def test_vincentka_06_slice_thickness_interactive(self):
        """
        Interactive test. SliceThickness is not voxel depth. If it is, this
        test will fail.
        """
        # dcmdir = os.path.join(path_to_script, './../sample_data/matlab/examples/sample_data/DICOM/digest_article/') #noqa
        dcmdir = os.path.expanduser(
            '~/data/medical/data_orig/vincentka/13021610/10200000/')
        dcmdir = os.path.expanduser(
            '~/data/medical/data_orig/vincentka/13021610/12460000/')
        oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                    working_voxelsize_mm=4,
                                                    manualroi=False)

        # manual seeds setting
        print(
            "with left mouse button select some pixels of the bottle content")
        print("with right mouse button select some pixels of background")

        oseg.interactivity()

        volume = oseg.get_segmented_volume_size_mm3()
        # print volume

        self.assertGreater(volume, 550000)
        self.assertLess(volume, 850000)
示例#2
0
    def test_organ_segmentation_with_boundary_penalties(self):
        """
        Interactivity is stored to file
        """
        dcmdir = io3d.datasets.join_path('jatra_5mm')

        print("Interactive test: with left mouse button select liver, \
            with right mouse button select other tissues")
        # gcparams = {'pairwiseAlpha':10, 'use_boundary_penalties':True}
        segparams = {
            'pairwise_alpha_per': 3,
            'use_boundary_penalties': True,
            'boundary_penalties_sigma': 200
        }
        oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                    working_voxelsize_mm=4,
                                                    segparams=segparams)
        oseg.add_seeds_mm([120], [120], [400], label=1, radius=30)
        oseg.add_seeds_mm([170, 220, 250], [250, 280, 200], [400],
                          label=2,
                          radius=30)

        "boundary penalties"
        oseg.interactivity()
        # oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # misc.obj_to_file(oseg.get_iparams(),'iparams.pkl', filetype='pickle')

        self.assertGreater(volume, 1000000)
示例#3
0
    def test_create_iparams(self):
        """
        Interactivity is stored to file
        """
        if self.verbose:
            print("test_create_iparams")
        import misc


        dcmdir = io3d.datasets.join_path('jatra_5mm')
            # path_to_script, './../sample_data/jatra_5mm')

        segparams = {'pairwiseAlpha': 20,
                     'use_boundary_penalties': False,
                     'boundary_penalties_sigma': 200}
        # oseg = organ_segmentation.OrganSegmentation(dcmdir, working_voxelsize_mm = 4) # noqa
        oseg = organ_segmentation.OrganSegmentation(
            dcmdir, working_voxelsize_mm=4,
            segparams=segparams, manualroi=False)
        # oseg.add_seeds_mm([120, 160], [150, 120], [70], label=1, radius=20)
        oseg.add_seeds_mm([120, 160], [150, 80], [85], label=1, radius=20)
        oseg.add_seeds_mm([170, 220, 250, 100], [250, 300, 200, 350], [85],
                          label=2, radius=20)
        oseg.add_seeds_mm([170], [240], [70], label=2, radius=20)

        # print "test_ipars"
        # oseg.interactivity()
        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()
        # print 'vol %.3g ' %(volume)

        misc.obj_to_file(oseg.get_iparams(), 'iparams.pkl', filetype='pickle')

        self.assertGreater(volume, 1000000)
示例#4
0
    def test_whole_organ_segmentation_interactive(self):
        """
        Interactive test uses dicom data for segmentation
        """
        dcmdir = os.path.join(
            lisa.dataset.sample_data_path(),
            'matlab/examples/sample_data/DICOM/digest_article/'
        )
            # path_to_script,
            # './../sample_data/matlab/examples/sample_data/DICOM/digest_article/') # noqa
        oseg = organ_segmentation.OrganSegmentation(
            dcmdir, working_voxelsize_mm=4, manualroi=False)

# manual seeds setting
        print ("with left mouse button select some pixels of the brain")
        print ("with right mouse button select some pixels of other tissues\
and background")

        oseg.interactivity()

        volume = oseg.get_segmented_volume_size_mm3()
        print volume

        self.assertGreater(volume, 50000)
        self.assertLess(volume, 1200000)
示例#5
0
    def test_split_by_two_vessels(self):
        """
        Make virtual resection on synthetic data
        """
        import lisa.virtual_resection as vr

        data3d, segm, voxelsize_mm, slab = self.synthetic_data()
        seeds = np.zeros([256, 256, 80], dtype=np.int16)
        seeds[125, 160, 44] = 1
        datap = {
            'data3d': data3d,
            'segmentation': segm,
            'voxelsize_mm': voxelsize_mm,
            'slab': slab
        }

        oseg = organ_segmentation.OrganSegmentation()
        oseg.import_dataplus(datap)

        oseg.split_organ_by_two_vessels(seed_label1="porta",
                                        seed_label2="hepatic_veins",
                                        organ_label="liver",
                                        output_label1="liver",
                                        output_label2="liver_remnant")

        resected = np.sum(datap['segmentation'] == datap['slab']['liver'])
        remaining = np.sum(
            datap['segmentation'] == datap['slab']['liver_remnant'])
        ratio = np.double(resected) / (resected + remaining)
        # ed = sed3.sed3(datap["segmentation"])
        # ed.show()
        # print(ratio)

        self.assertGreater(ratio, 0.6)
        self.assertLess(ratio, 0.8)
示例#6
0
    def test_train_liver_model_and_liver_segmentation(self):
        """
        combination of test_train_liver_model and test_organ_model_with_pretrained_classifier
        :return:
        """
        fn_mdl = "test_liver_intensity.Model.p"
        organ_model.train_liver_model_from_sliver_data(
            output_file=fn_mdl,
            sliver_reference_dir="~/lisa_data/sample_data/",
            orig_pattern="*orig*01.mhd",
            ref_pattern="*seg*01.mhd",
        )

        path_to_data = lisa.dataset.sample_data_path()
        dcmdir = os.path.join(path_to_data, './liver-orig001.mhd')

        print "Interactive test: with left mouse button select liver, \
            with right mouse button select other tissues"

        # gcparams = {'pairwiseAlpha':10, 'use_boundary_penalties':True}
        # fn_mdl = os.path.expanduser("~/lisa_data/liver_intensity.Model.p")
        segparams = {}
        segmodelparams = {
            'mdl_stored_file': fn_mdl,
            'fv_type': 'fv_extern',
            'fv_extern': "intensity_localization_fv"
        }
        # 'pairwise_alpha_per': 3,
        #              'use_boundary_penalties': True,
        #              'boundary_penalties_sigma': 200}
        oseg = organ_segmentation.OrganSegmentation(
            dcmdir,
            working_voxelsize_mm=4,
            segparams=segparams,
            segmodelparams=segmodelparams)
        oseg.add_seeds_mm([200], [110, 150], [110, 100],
                          label=1,
                          radius=30,
                          width=5)
        oseg.add_seeds_mm([200], [250, 230], [210, 260],
                          label=2,
                          radius=50,
                          width=5)

        # from PyQt4.QtGui import QApplication
        # app = QApplication(sys.argv)
        # oseg.interactivity()
        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # misc.obj_to_file(oseg.get_iparams(),'iparams.pkl', filetype='pickle')

        self.assertGreater(volume, 1300000)
        self.assertLess(volume, 2100000)
示例#7
0
    def synthetic_liver_template(self, params):
        """
        Function uses organ_segmentation  for synthetic box object
        segmentation.
        """
        # dcmdir = os.path.join(path_to_script,'./../sample_data/matlab/examples/sample_data/DICOM/digest_article/') # noqa
# data

        data3d, segm, voxelsize_mm, slab = self.synthetic_liver()

# seeds
        seeds = np.zeros(data3d.shape, np.int8)
        seeds[40:55, 90:120, 70:110] = 1
        seeds[30:45, 190:200, 40:90] = 2
# [mm]  10 x 10 x 10        # voxelsize_mm = [1, 4, 3]
        metadata = {'voxelsize_mm': voxelsize_mm}

        oseg = organ_segmentation.OrganSegmentation(
            None,
            data3d=data3d,
            metadata=metadata,
            seeds=seeds,
            working_voxelsize_mm=5,
            manualroi=False,
            autocrop=False,

            **params
        )

        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()
        oseg.portalVeinSegmentation(interactivity=False, threshold=180)
        oseg.saveVesselTree('porta')

        # print '> 0 '
        # print np.sum(oseg.segmentation > 0)
        # print np.sum(segm > 0)
        # print np.sum(oseg.segmentation > 0) * np.prod(voxelsize_mm)
        # print np.sum(segm > 0) * np.prod(voxelsize_mm)
        # print 'computed ', volume
        # print voxelsize_mm
        # print oseg.voxelsize_mm

        # import pdb; pdb.set_trace()
        # import sed3
        # ed = sed3.sed3(data3d, seeds=seeds,
        #                contour=(oseg.segmentation))
        # ed.show()
        # import ipdb; ipdb.set_trace() #  noqa BREAKPOINT

        # mel by to být litr. tedy milion mm3
        # je to zvlastni. pro nekter verze knihoven je to 630, pro jine 580
        self.assertGreater(volume, 570000)
        self.assertLess(volume, 640000)
示例#8
0
def main():

    dcmdir = os.path.join(
        path_to_script,
        './../sample_data/matlab/examples/sample_data/DICOM/digest_article/')
    #data3d, metadata = dcmr.dcm_read_from_dir(dcmdir)
    oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                working_voxelsize_mm=4,
                                                manualroi=False)

    oseg.interactivity()
示例#9
0
    def test_resize_data_three_values(self):
        datap = io3d.datasets.generate_abdominal()
        target_voxelsize_mm = [7.14, 4.1, 3]
        oseg = organ_segmentation.OrganSegmentation(working_voxelsize_mm=4,
                                                    manualroi=False)
        oseg.import_dataplus(dataplus=datap)
        orig_shape = oseg.data3d.shape

        oseg.resize_to_mm(target_voxelsize_mm)
        self.assertEqual(oseg.voxelsize_mm[0], target_voxelsize_mm[0])
        self.assertEqual(oseg.voxelsize_mm[1], target_voxelsize_mm[1])
        self.assertEqual(oseg.voxelsize_mm[2], target_voxelsize_mm[2])
        self.assertNotEqual(orig_shape[0], oseg.data3d.shape[0])
        self.assertNotEqual(orig_shape[1], oseg.data3d.shape[1])
        self.assertNotEqual(orig_shape[2], oseg.data3d.shape[2])
示例#10
0
    def test_add_seeds_mm(self):
        """
        Function uses organ_segmentation object for segmentation
        """
        dcmdir = io3d.datasets.join_path(
            'matlab/examples/sample_data/DICOM/digest_article/'
            # path_to_script,
            # './../sample_data/matlab/examples/sample_data/DICOM/digest_article/'
        )
        oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                    working_voxelsize_mm=4,
                                                    manualroi=False)

        oseg.add_seeds_mm([80], [120], [120], 1, 25, width=2)
        oseg.add_seeds_mm([80], [40], [130], 2, 25, width=2)
        # just for testing resize
        # oseg.seeds[:,:32,:32] = 2
        # import ipdb; ipdb.set_trace()
        # import sed3
        # ed = sed3.sed3(oseg.data3d, seeds=oseg.seeds)
        # ed.show()

        # pro kontrolu lze odkomentovat
        # from PyQt5.QtWidgets import QApplication
        # app = QApplication(sys.argv)
        # oseg.interactivity()

        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # import pdb; pdb.set_trace()

        # mel by to být litr. tedy milion mm3
        self.assertGreater(volume, 800000)
        self.assertLess(volume, 1200000)

        # roi_mm = [[3, 3, 3], [150, 150, 50]]
        # oseg.ni_set_roi()
        # coordinates_mm = [[110, 50, 30], [10, 10, 10]]
        # label = [1, 2]
        # radius = [5, 5]
        # oseg.ni_set_seeds(coordinates_mm, label, radius)

        # oseg.make_segmentation()

        # oseg.noninteractivity()
        pass
示例#11
0
    def test_sync_paul(self):
        """
        sync with paul account
        """

        path_to_paul = lisa.lisa_data.path('sync','paul')

        if os.path.exists(path_to_paul):
            shutil.rmtree(path_to_paul)
        oseg = organ_segmentation.OrganSegmentation(None)
        oseg.sync_lisa_data('paul','P4ul')


        file_path = lisa.lisa_data.path('sync','paul', 'from_server', 'test.txt')
        logger.debug('file_path %s', file_path)
        self.assertTrue(os.path.exists(file_path))
示例#12
0
    def test_organ_segmentation_with_pretrained_classifier(self):
        """
        Interactivity is stored to file
        :rtype: object
        """

        path_to_data = lisa.dataset.sample_data_path()
        dcmdir = os.path.join(path_to_data, './liver-orig001.mhd')

        print("Interactive test: with left mouse button select liver, \
            with right mouse button select other tissues")
        # gcparams = {'pairwiseAlpha':10, 'use_boundary_penalties':True}
        fn_mdl = os.path.expanduser("~/lisa_data/liver_intensity.Model.p")
        segparams = {}
        segmodelparams = {
            'mdl_stored_file': fn_mdl,
            'fv_type': 'fv_extern',
            'fv_extern': "intensity_localization_fv"
        }
        # 'pairwise_alpha_per': 3,
        #              'use_boundary_penalties': True,
        #              'boundary_penalties_sigma': 200}
        oseg = organ_segmentation.OrganSegmentation(
            dcmdir,
            working_voxelsize_mm=4,
            segparams=segparams,
            segmodelparams=segmodelparams)
        oseg.add_seeds_mm([200], [110, 150], [110, 100],
                          label=1,
                          radius=30,
                          width=5)
        oseg.add_seeds_mm([200], [250, 230], [210, 260],
                          label=2,
                          radius=50,
                          width=5)

        from PyQt4.QtGui import QApplication
        app = QApplication(sys.argv)
        oseg.interactivity()
        # oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # misc.obj_to_file(oseg.get_iparams(),'iparams.pkl', filetype='pickle')

        self.assertGreater(volume, 1000000)
        self.assertLess(volume, 2000000)
示例#13
0
    def synthetic_liver_template(self, params):
        """
        Function uses organ_segmentation  for synthetic box object
        segmentation.
        """
        # dcmdir = os.path.join(path_to_script,'./../sample_data/matlab/examples/sample_data/DICOM/digest_article/') # noqa
        # data

        data3d, segm, voxelsize_mm, slab, seeds_liver, seeds_porta = io3d.datasets.generate_synthetic_liver(
        )

        # seeds
        #         seeds = np.zeros(data3d.shape, np.int8)
        #         seeds[40:55, 90:120, 70:110] = 1
        #         seeds[30:45, 190:200, 40:90] = 2
        # [mm]  10 x 10 x 10        # voxelsize_mm = [1, 4, 3]
        metadata = {'voxelsize_mm': voxelsize_mm}

        oseg = organ_segmentation.OrganSegmentation(None,
                                                    data3d=data3d,
                                                    metadata=metadata,
                                                    seeds=seeds_liver,
                                                    working_voxelsize_mm=5,
                                                    manualroi=False,
                                                    autocrop=False,
                                                    **params)

        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3("liver")
        self.assertGreater(volume, 570000,
                           "Liver volume should have proper size")
        self.assertLess(volume, 640000, "Liver volume should have proper size")

        oseg.portalVeinSegmentation(interactivity=False, threshold=180)

        volume_porta = oseg.get_segmented_volume_size_mm3("porta")
        self.assertGreater(volume_porta, 9000,
                           "Liver volume should have proper size")
        self.assertLess(volume_porta, 11000,
                        "Liver volume should have proper size")
        # import sed3
        # ed = sed3.sed3(data3d,
        #                contour=(oseg.segmentation))
        # ed.show()
        oseg.saveVesselTree('porta')
示例#14
0
    def test_export_dicom(self):
        """
        Interactivity is stored to file
        """
        import io3d
        import io3d.datareader

        if self.verbose:
            print("test_create_iparams")
        data_path = os.path.join(lisa.dataset.sample_data_path(),
                                 'liver-orig001.mhd')
        seg_path = os.path.join(lisa.dataset.sample_data_path(),
                                'liver-seg001.mhd')

        # load data
        oseg = organ_segmentation.OrganSegmentation()
        oseg.load_data(datapath=data_path)
        oseg.import_segmentation_from_file(seg_path)

        # export to dicom
        output_datapath = "data3d.dcm"
        output_segpath = "segmentation.dcm"
        oseg.save_input_dcm(output_datapath)
        oseg.save_outputs_dcm(output_segpath)

        # check data
        data3d_orig, metadata = io3d.datareader.read(data_path,
                                                     dataplus_format=False)
        data3d_stored, metadata = io3d.datareader.read(output_datapath,
                                                       dataplus_format=False)

        err_data = np.sum(np.abs(data3d_orig - data3d_stored))
        self.assertLess(err_data, 500, "data error")

        # check segmentation
        seg_orig, metadata = io3d.datareader.read(data_path,
                                                  dataplus_format=False)
        seg_stored, metadata = io3d.datareader.read(output_datapath,
                                                    dataplus_format=False)

        err_data = np.sum(np.abs(seg_orig - seg_stored))
        self.assertLess(err_data, 500, "segmentation error")

        os.remove(output_datapath)
        os.remove(output_segpath)
示例#15
0
    def box_segmentation_template(self, params, noise_sigma=3):
        """
        Function uses organ_segmentation  for synthetic box object
        segmentation.
        """
        # dcmdir = os.path.join(path_to_script,'./../sample_data/matlab/examples/sample_data/DICOM/digest_article/') # noqa
# data
        img3d = np.random.rand(32, 64, 64) * noise_sigma
        img3d[4:24, 12:32, 5:25] = img3d[4:24, 12:32, 5:25] + 30

# seeds
        seeds = np.zeros([32, 64, 64], np.int8)
        seeds[9:12, 13:29, 18:25] = 1
        seeds[9:12, 4:9, 3:32] = 2
# [mm]  10 x 10 x 10        # voxelsize_mm = [1, 4, 3]
        voxelsize_mm = [5, 5, 5]
        metadata = {'voxelsize_mm': voxelsize_mm}

        oseg = organ_segmentation.OrganSegmentation(
            None,
            data3d=img3d,
            metadata=metadata,
            seeds=seeds,
            working_voxelsize_mm=10,
            manualroi=False,
            **params
        )

        # oseg.seeds = seeds
        # oseg.make_gc()
# manual seeds setting

        from PyQt5.QtWidgets import QApplication
        app = QApplication(sys.argv)
        # oseg.interactivity()
        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # import pdb; pdb.set_trace()

        # mel by to být litr. tedy milion mm3
        self.assertGreater(volume, 800000)
        self.assertLess(volume, 1100000)
示例#16
0
    def test_add_seeds_mm(self):
        """
        Function uses organ_segmentation object for segmentation
        """
        dcmdir = os.path.join(
            lisa.dataset.sample_data_path(),
            'matlab/examples/sample_data/DICOM/digest_article/'
            # path_to_script,
            # './../sample_data/matlab/examples/sample_data/DICOM/digest_article/'
        )
        oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                    working_voxelsize_mm=4,
                                                    manualroi=False)

        oseg.add_seeds_mm([80], [120], [120], 1, 25)
        oseg.add_seeds_mm([80], [40], [130], 2, 25)

        # pro kontrolu lze odkomentovat
        # from PyQt4.QtGui import QApplication
        # app = QApplication(sys.argv)
        # oseg.interactivity()

        oseg.ninteractivity()

        volume = oseg.get_segmented_volume_size_mm3()

        # import pdb; pdb.set_trace()

        # mel by to být litr. tedy milion mm3
        self.assertGreater(volume, 800000)
        self.assertLess(volume, 1200000)

        # roi_mm = [[3, 3, 3], [150, 150, 50]]
        # oseg.ni_set_roi()
        # coordinates_mm = [[110, 50, 30], [10, 10, 10]]
        # label = [1, 2]
        # radius = [5, 5]
        # oseg.ni_set_seeds(coordinates_mm, label, radius)

        # oseg.make_segmentation()

        # oseg.noninteractivity()
        pass
示例#17
0
    def test_sync_paul(self):
        """
        sync with paul account
        """

        path_to_paul = lisa.lisa_data.path('sync', 'paul')

        if os.path.exists(path_to_paul):
            remove_read_only_flag_on_win32(path_to_paul)
            # handleRemoveReadonly je asi zbytečné
            shutil.rmtree(path_to_paul,
                          onerror=handleRemoveReadonly,
                          ignore_errors=False)
        oseg = organ_segmentation.OrganSegmentation(None)
        oseg.sync_lisa_data('paul', 'P4ul')

        file_path = lisa.lisa_data.path('sync', 'paul', 'from_server',
                                        'test.txt')
        logger.debug('file_path %s', file_path)
        self.assertTrue(os.path.exists(file_path))
示例#18
0
    def test_real_data_segmentation(self):
        import lisa.dataset
        app = QApplication(sys.argv)

        dcmdir = os.path.join(lisa.dataset.sample_data_path(), 'jatra_5mm')

        oseg = organ_segmentation.OrganSegmentation(dcmdir,
                                                    working_voxelsize_mm=4)
        oseg.add_seeds_mm([81], [120], [120],
                          label=1, radius=30)
        oseg.add_seeds_mm([81], [170, 220, 250], [250, 250, 200],
                          label=2, radius=30)
        oseg.add_seeds_mm([100], [170], [140],
                          label=10, radius=5)
        # oseg.interactivity(min_val=-200, max_val=200)
        oseg.ninteractivity()

        ed = sed3.sed3(oseg.data3d, contour=oseg.segmentation, seeds=oseg.seeds)
        ed.show()

        oseg.portalVeinSegmentation(seeds=(oseg.seeds==10))
示例#19
0
def export_seg_to_file():
    fnout = Path(__file__).parent / "test_export_segmentation.mhd"

    if fnout.exists():
        os.remove(fnout)

    data3d, segm, voxelsize_mm, slab, seeds_liver, seeds_porta = io3d.datasets.generate_synthetic_liver()
    metadata = {'voxelsize_mm': voxelsize_mm}

    oseg = organ_segmentation.OrganSegmentation(
        None,
        data3d=data3d,
        metadata=metadata,
        seeds=seeds_liver,
        working_voxelsize_mm=5,
        manualroi=False,
        autocrop=False,
    )

    oseg.export_segmentation_to_file(fnout)
    assert fnout.exists()
示例#20
0
    def test_roi(self):
        """
        Test setting of ROI. It is in pixels, not in mm
        """

        img3d = (np.random.rand(30, 30, 30)*10).astype(np.int16)
        seeds = (np.zeros(img3d.shape)).astype(np.int8)
        segmentation = (np.zeros(img3d.shape)).astype(np.int8)
        segmentation[10:25, 4:24, 2:16] = 1
        img3d = img3d + segmentation*20
        seeds[12:18, 9:16, 3:6] = 1
        seeds[19:22, 21:27, 19:21] = 2

        roi = [[7, 27], [2, 29], [0, 26]]
        # seeds = seeds[7:27, 2:29, 0:26]
        voxelsize_mm = [5, 5, 5]
        metadata = {'voxelsize_mm': voxelsize_mm}

        oseg = organ_segmentation.OrganSegmentation(
            None,
            data3d=img3d,
            metadata=metadata,
            seeds=seeds,
            roi=roi,
            working_voxelsize_mm=5,
            manualroi=False)

        # from PyQt4.QtGui import QApplication
        # app = QApplication(sys.argv)
        # oseg.interactivity(min_val=0, max_val=30)
        oseg.ninteractivity()
        datap = oseg.export()

        volume = oseg.get_segmented_volume_size_mm3()
        self.assertGreater(volume, 500000)
        self.assertIn('data3d', datap.keys())
        self.assertIn('voxelsize_mm', datap.keys())