示例#1
0
    def test_write_and_read(self):
        filename = 'test_file.dcm'
        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]}
        dw = dwriter.DataWriter()
        logger.debug(filename)
        dw.Write3DData(data, filename, filetype='dcm', metadata=metadata)

        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData(filename, dataplus_format=False)

        # print("meta ", metadata)
        # print("new meta ", newmetadata)

        # 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])
        # print(metadata["voxelsize_mm"])
        # print(newmetadata["voxelsize_mm"])
        self.assertEqual(metadata['voxelsize_mm'][0],
                         newmetadata['voxelsize_mm'][0])
        self. assertEqual(metadata['voxelsize_mm'][1],
                          newmetadata['voxelsize_mm'][1])
        self.assertEqual(metadata['voxelsize_mm'][2],
                         newmetadata['voxelsize_mm'][2])
        os.remove(filename)
示例#2
0
    def test_write_and_read(self):

        filename = 'test_file.dcm'
        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]}
        dw = dwriter.DataWriter()
        dw.Write3DData(data, filename, filetype='dcm', metadata=metadata)

        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData(filename)

        # print  "meta ", metadata
        # print  "new meta ", newmetadata
        # 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(
            metadata['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)
示例#3
0
    def test_save_image_stack_with_unique_series_number_based_on_filename(self):
        testdatadir = 'test_svimstack2'
        if os.path.exists(testdatadir):
            shutil.rmtree(testdatadir, ignore_errors=True)
        szx = 30
        szy = 20
        szz = 120
        data3d = self.generate_waving_data(
            szx, szy, szz, value=150, dtype=np.uint8)
        io3d.write(data3d, testdatadir + "/{series_number:03d}/soubory{slice_position:07.3f}.tiff")
        # second time there should be directory 002/
        io3d.write(data3d, testdatadir + "/{series_number:03d}/soubory{slice_position:07.3f}.tiff")



        dr = dreader.DataReader()
        data3dnew, metadata = dr.Get3DData(
            testdatadir + "/002/", dataplus_format=False
            # 'sample_data/volumetrie/'
        )
        # import sed3
        # ed = sed3.sed3(data3dnew)
        # ed.show()
        self.assertEqual(
            np.sum(np.abs(data3d - data3dnew)),
            0
        )
        shutil.rmtree(testdatadir)
示例#4
0
    def test_save_image_stack(self):
        testdatadir = 'test_svimstack'
        if os.path.exists(testdatadir):
            shutil.rmtree(testdatadir, ignore_errors=True)
        szx = 30
        szy = 20
        szz = 120
        data3d = self.generate_waving_data(
            szx, szy, szz, value=150, dtype=np.uint8)
        # import sed3
        # ed = sed3.sed3(data3d)
        # ed.show()
        #
        dw = dwriter.DataWriter()

        dw.save_image_stack(data3d, testdatadir + '/soubory.png')
        dr = dreader.DataReader()
        data3dnew, metadata = dr.Get3DData(
            testdatadir, dataplus_format=False
            # 'sample_data/volumetrie/'
        )
        # import sed3
        # ed = sed3.sed3(data3dnew)
        # ed.show()
        self.assertEqual(
            np.sum(np.abs(data3d - data3dnew)),
            0
        )
        shutil.rmtree(testdatadir)
示例#5
0
    def test_add_overlay_to_copied_dir(self):
        """
        writes 3d label to copied dicom files
        """
        filedir = 'test_outputs_dir'
        n_files = 3

        # number of tested overlay
        i_overlay = 6

        if not os.path.exists(filedir):
            os.mkdir(filedir)

# open copied data to obtain dcmfilefilelist
        dr = dreader.DataReader()
        data3d, metadata = dr.Get3DData(
            op.join(SAMPLE_DATA_DIR, 'jatra_5mm/'), dataplus_format=False
            # 'sample_data/volumetrie/'
        )
# for test we are working only with small number of files (n_files)
        metadata['dcmfilelist'] = metadata['dcmfilelist'][:n_files]

# create overlay
        overlay = np.zeros([n_files, 512, 512], dtype=np.uint8)
        overlay[:, 450:500, 30:100] = 1
# if there is more slides, try more complicated overlay
        overlay[0, 430:460, 20:110] = 1
        overlay[-1:, 470:520, 10:120] = 1

        overlays = {i_overlay: overlay}

        dw = dwriter.DataWriter()
        dw.DataCopyWithOverlay(metadata['dcmfilelist'], filedir, overlays)

# try read written data
        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData(filedir, dataplus_format=False)

        # test old function
        newoverlay = dr.GetOverlay()
        newoverlay = dr.get_overlay()


        self.assertTrue((newoverlay[i_overlay] == overlays[i_overlay]).all())

        # os.remove(filename)
        shutil.rmtree(filedir)
示例#6
0
    def test_read_data_without_slice_thickness(self):
        """ data without SliceThickness
        :return:
        """

        dr = dreader.DataReader()
        data3dnew, metadata = dr.Get3DData(
                "~/data/medical/orig/dicom_test_claudio", dataplus_format=False
        )
        metadata
def runComputation(imageDx, imageDy, imageDz, coloridx, calculateout, V, FV,
                   input_pkl_file, BORDER_FILE, DIR_O, label):

    dr = datareader.DataReader()
    datap = dr.Get3DData(input_pkl_file,
                         qt_app=None,
                         dataplus_format=True,
                         gui=False)
    if 'segmentation' not in datap.keys():
        datap = segmentation_from_data3d(datap, label)
    segmentation = datap['segmentation'].astype(np.uint8)

    # segmentation = datap['segmentation'][::5,::5,::5]
    # segmentation = datap['segmentation'][300:330,300:350,300:350]
    # datap['segmentation'] = (segmentation ==  1).astype(np.uint8)
    # import ipdb; ipdb.set_trace() #  noqa BREAKPOINT
    # hack kvuli barvam
    segmentation[0, 0, 0] = 0
    segmentation[0, 0, 1] = 1
    datap['segmentation'] = segmentation
    logger.debug("unique %s " % (str(np.unique(datap['segmentation']))))
    imageHeight, imageWidth = datap['segmentation'][:, :, :].shape[1:3]
    # getImageData(INPUT_DIR+str(BEST_IMAGE)+PNG_EXTENSION)
    # imageDepth = countFilesInADir(INPUT_DIR)
    imageDepth = datap['segmentation'].shape[0]
    Nx, Ny, Nz = imageHeight / imageDx, imageWidth / imageDx, imageDepth / imageDz
    returnValue = 2

    try:
        # pixelCalc, centroidsCalc = centroidcalc(INPUT_DIR, BEST_IMAGE, colors)
        # centroidsCalc = np.array([0, 1])
        centroidsCalc = np.unique(datap['segmentation'])
        returnValue = startComputeChains(imageHeight, imageWidth, imageDepth,
                                         imageDx, imageDy, imageDz, Nx, Ny, Nz,
                                         calculateout, BORDER_FILE,
                                         centroidsCalc, coloridx, datap, DIR_O)
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
        log(1, ["Error: " + ''.join('!! ' + line for line in lines)
                ])  # Log it or whatever here
        returnValue = 2
        tracert.print_exc()

    return returnValue
示例#8
0
def readData3d(dcmdir):
    qt_app = None
    if dcmdir is None:
        from PyQt5 import QtGui, QtWidgets
#QApplication
        qt_app = QtWidgets.QApplication(sys.argv)
# same as  data_reader_get_dcmdir_qt
#        from PyQt4.QtGui import QFileDialog, QApplication
#        dcmdir = QFileDialog.getExistingDirectory(
#                caption='Select DICOM Folder',
#                options=QFileDialog.ShowDirsOnly)
#        dcmdir = "%s" %(dcmdir)
#        dcmdir = dcmdir.encode("utf8")
        dcmdir = datareader.get_dcmdir_qt(qt_app)
    reader = datareader.DataReader()
    data3d, metadata = reader.Get3DData(dcmdir, qt_app=None, dataplus_format=False)

    return data3d, metadata, qt_app
示例#9
0
def read_data_orig_and_seg(inputdata, i):
    """ Loads data_orig and data_seg from yaml file
    """

    reader = datareader.DataReader()
    data3d_a_path = os.path.join(inputdata['basedir'],
                                 inputdata['data'][i]['sliverseg'])
    data3d_a, metadata_a = reader.Get3DData(data3d_a_path)

    data3d_b_path = os.path.join(inputdata['basedir'],
                                 inputdata['data'][i]['sliverorig'])
    data3d_b, metadata_b = reader.Get3DData(data3d_b_path)

    # import pdb; pdb.set_trace()
    data3d_seg = (data3d_a > 0).astype(np.int8)
    data3d_orig = data3d_b

    return data3d_orig, data3d_seg, metadata_a['voxelsize_mm']
示例#10
0
    def test_write_dicom_from_scratch(self):
        """
        Reads dicom data and from slices and stores into one Dicom file. This
        file is then readed and compared with input data.
        """
        filename = 'tests/output_dcm3d.dcm'
        dr = dreader.DataReader()
        path_to_data = op.join(SAMPLE_DATA_DIR, 'jatra_5mm')
        logger.debug(SAMPLE_DATA_DIR)
        logger.debug(path_to_data)
        data3d, metadata = dr.Get3DData(
            path_to_data, dataplus_format=False
            # 'sample_data/volumetrie/'
        )
        dw = dwriter.DataWriter()
        dw.Write3DData(data3d, filename, filetype='dcm', metadata=metadata)

        data3d_n, metadata_n = dr.Get3DData(filename, dataplus_format=False)
        self.assertEqual(data3d[10, 11, 12], data3d_n[10, 11, 12])
        os.remove(filename)
示例#11
0
    def test_save_image_stack_with_writer(self):
        testdatadir = 'test_svimstack_with_writer'
        data3d = self.generate_waving_data(
            szx=30, szy=20, szz=10, value=150, dtype=np.uint8)
        dw = dwriter.DataWriter()

        dw.Write3DData(data3d, testdatadir + '/soubory.png',
                       filetype='image_stack')
        dr = dreader.DataReader()
        data3dnew, metadata = dr.Get3DData(
            testdatadir, dataplus_format=False
        )
        # import sed3
        # ed = sed3.sed3(data3dnew)
        # ed.show()
        self.assertEqual(
            np.sum(np.abs(data3d - data3dnew)),
            0
        )
        shutil.rmtree(testdatadir)
示例#12
0
文件: lisaWindow.py 项目: kunesj/lisa
    def importDataWithGui(self):
        oseg = self.oseg

        reader = datareader.DataReader()

        # seg.data3d, metadata =
        datap = reader.Get3DData(oseg.datapath, dataplus_format=True)
        # rint datap.keys()
        # self.iparams['series_number'] = self.metadata['series_number']
        # self.iparams['datapath'] = self.datapath
        oseg.import_dataplus(datap)
        self.statusBar().showMessage('Ready')

        #### SET BUTTONS/MENU ####
        #self.btnLoad.show()
        #self.btnBackLoad.hide()
        self.btnSave.setDisabled(False)
        #self.btnSeg.setDisabled(False)
        self.btnSegmentation.setDisabled(False)
        self.btnCompare.setDisabled(False)
示例#13
0
def main():

    #logger = logging.getLogger(__name__)
    logger = logging.getLogger()

    logger.setLevel(logging.WARNING)
    ch = logging.StreamHandler()
    logger.addHandler(ch)

    #logger.debug('input params')

    ## read confguraton from file, use default values from OrganSegmentation

    # input parser
    parser = argparse.ArgumentParser(
        description=' Show dicom data with overlay')
    parser.add_argument('-i',
                        '--inputdatapath',
                        default='',
                        help='path to data dir')
    args_obj = parser.parse_args()
    args = vars(args_obj)
    #print args["arg"]

    reader = datareader.DataReader()
    data3d, metadata = reader.Get3DData(args['inputdatapath'], qt_app=None)
    overlays = reader.GetOverlay()
    overlay = np.zeros(data3d.shape, dtype=np.int8)
    print "overlays ", overlays.keys()
    for key in overlays:
        overlay += overlays[key]

    #import ipdb; ipdb.set_trace() # BREAKPOINT
    pyed = sed3.sed3(data3d, contour=overlay)
    pyed.show()

    #print savestring
    #    import pdb; pdb.set_trace()
    return
示例#14
0
    def test_add_overlay_and_read_one_file_with_overlay(self):
        filename = 'tests_outputs/test_file.dcm'
        filedir = os.path.dirname(filename)

        # number of tested overlay
        i_overlay = 6

        if not os.path.exists('tests_outputs'):
            os.mkdir('tests_outputs')

        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        overlay = np.zeros([512, 512], dtype=np.uint8)
        overlay[450:500, 30:100] = 1

        # metadata = {'voxelsize_mm': [1, 2, 3]}
        dw = dwriter.DataWriter()
        dw.add_overlay_to_slice_file(
            # 'sample_data/jatra_5mm/IM-0001-0019.dcm',
            op.join(SAMPLE_DATA_DIR, 'volumetrie/volumetry_slice.DCM'),
            overlay,
            i_overlay,
            filename
        )
        # import ipdb; ipdb.set_trace()
        # print("asdfa")
        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData('tests_outputs', dataplus_format=False)
        newoverlay = dr.get_overlay()
        # print(newoverlay)

        # ed = pyed.py3DSeedEditor(newoverlay[6])
        # ed.show()
        # print("oioiu")
        self.assertTrue((newoverlay[i_overlay] == overlay).all())

        # os.remove(filename)
        shutil.rmtree(filedir)
示例#15
0
    def test_write_dcm_slices_datap(self):
        # Z nějakého důvodu plošné snímky neukládají tloušťku řezu. Jinak by test měl fungovat.
        datadir = "test_dcm"
        filename = datadir + '/test_file{slice_position:07.3f}.dcm'
        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        datap = {'voxelsize_mm': [1, 2, 3], "data3d": data}
        dw = dwriter.DataWriter()
        dw.Write3DData(datap, filename, filetype='auto')

        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData(datadir, dataplus_format=False)

        # print("meta ", metadata)
        # print("new meta ", newmetadata)

        # 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(datap['voxelsize_mm'][0],
                         newmetadata['voxelsize_mm'][0])
        # os.removedirs()
        shutil.rmtree(datadir)
示例#16
0
    def test_add_overlay_and_read_one_file_with_overlay(self):
        filename = 'tests_outputs/test_file.dcm'
        filedir = os.path.dirname(filename)

        # number of tested overlay
        i_overlay = 6

        if not os.path.exists('tests_outputs'):
            os.mkdir('tests_outputs')

        data = (np.random.random([30, 100, 120]) * 30).astype(np.int16)
        data[0:5, 20:60, 60:70] += 30
        overlay = np.zeros([512, 512], dtype=np.uint8)
        overlay[450:500, 30:100] = 1

        # metadata = {'voxelsize_mm': [1, 2, 3]}
        dw = dwriter.DataWriter()

        dw.add_overlay_to_slice_file(
            # 'sample_data/jatra_5mm/IM-0001-0019.dcm',
            lisa.dataset.join_sdp('volumetrie/volumetry_slice.DCM'),
            overlay,
            i_overlay,
            filename
        )
        dr = dreader.DataReader()
        newdata, newmetadata = dr.Get3DData('tests_outputs')
        newoverlay = dr.GetOverlay()
        # print overlay

        # ed = pyed.sed3(newoverlay[6])
        # ed.show()
        self.assertTrue((newoverlay[i_overlay] == overlay).all())

        # os.remove(filename)
        shutil.rmtree(filedir)
示例#17
0
def eval_all_from_dataset_metadata(inputdata, visualization=False,
                                   special_evaluation_function=None):
    """
    set metadata
    """
    evaluation_all = {
        'file1': [],
        'file2': [],
        'volume1_mm3': [],
        'volume2_mm3': [],
        'err1_mm3': [],
        'err2_mm3': [],
        'err1_percent': [],
        'err2_percent': [],
        'voe': [],
        'vd': [],
        'avgd': [],
        'rmsd': [],
        'processing_time': [],
        'organ_interactivity_counter': [],
        'maxd': []

    }
    for i in range(0, len(inputdata['data'])):

        reader = datareader.DataReader()
        data3d_a_path = os.path.join(inputdata['basedir'],
                                     inputdata['data'][i]['sliverseg'])
        data3d_a, metadata_a = reader.Get3DData(data3d_a_path, dataplus_format=False)
        print("inputdata ", list(inputdata['data'][i].values()))
        try:
            # if there is defined overlay
            data3d_a = reader.get_overlay()[inputdata['data'][i][
                'overlay_number']]
            logger.info('overlay loaded')
            print('overlay loaded')
        except:
            logger.debug("overlay not loaded")
            pass

        logger.debug('data A shape ' + str(data3d_a.shape))

        data3d_b_path = os.path.join(inputdata['basedir'],
                                     inputdata['data'][i]['ourseg'])
        obj_b = misc.obj_from_file(data3d_b_path, filetype='pickle')
        # data_b, metadata_b = reader.Get3DData(data3d_b_path)

        if 'crinfo' in obj_b.keys():
            data3d_b = qmisc.uncrop(obj_b['segmentation'],
                                    obj_b['crinfo'], data3d_a.shape)
        else:
            data3d_b = obj_b['segmentation']

        # import pdb; pdb.set_trace()
        # data3d_a = (data3d_a > 1024).astype(np.int8)
        data3d_a = (data3d_a > 0).astype(np.int8)
        data3d_b = (data3d_b > 0).astype(np.int8)

        if visualization:
            pyed = sed3.sed3(data3d_a,  # + (4 * data3d_b)
                             contour=data3d_b)
            pyed.show()

        evaluation_one = compare_volumes(data3d_a, data3d_b,
                                         metadata_a['voxelsize_mm'])
        if special_evaluation_function is not None:
            evaluation_one.update(
                special_evaluation_function(
                    data3d_a, data3d_b, metadata_a['voxelsize_mm']
                ))
        evaluation_all['file1'].append(data3d_a_path)
        evaluation_all['file2'].append(data3d_b_path)
        for key in evaluation_one.keys():
            if key not in evaluation_all.keys():
                evaluation_all[key] = []

            evaluation_all[key].append(evaluation_one[key])
        # evaluation_all['volume1_mm3'].append(evaluation_one['volume1_mm3'])
        # evaluation_all['volume2_mm3'].append(evaluation_one['volume2_mm3'])
        # evaluation_all['err1_mm3'].append(evaluation_one['err1_mm3'])
        # evaluation_all['err2_mm3'].append(evaluation_one['err2_mm3'])
        # evaluation_all['err1_percent'].append(evaluation_one['err1_percent'])
        # evaluation_all['err2_percent'].append(evaluation_one['err2_percent'])
        # evaluation_all['voe'].append(evaluation_one['voe'])
        # evaluation_all['vd'].append(evaluation_one['vd'])
        # evaluation_all['avgd'].append(evaluation_one['avgd'])
        # evaluation_all['rmsd'].append(evaluation_one['rmsd'])
        # evaluation_all['maxd'].append(evaluation_one['maxd'])
        if 'processing_time' in obj_b.keys():
            # this is only for compatibility with march2014 data
            processing_time = obj_b['processing_time']
            organ_interactivity_counter = obj_b['organ_interactivity_counter']
        else:
            try:
                processing_time = obj_b['processing_information']['organ_segmentation']['processing_time']  # noqa
                organ_interactivity_counter = obj_b['processing_information']['organ_segmentation'][
                    'organ_interactivity_counter']  # noqa
            except:
                processing_time = 0
                organ_interactivity_counter = 0
        evaluation_all['processing_time'].append(processing_time)
        evaluation_all['organ_interactivity_counter'].append(
            organ_interactivity_counter)

    return evaluation_all