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)
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)
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)
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)
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)
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
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
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']
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)
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)
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)
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
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)
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)
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)
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