def test(path_data='', parameters=''): if not parameters: parameters = '-i t2/t2.nii.gz -c t2 -p auto' # parameters folder_data = 't2/' file_data = [ 't2.nii.gz', 't2_centerline_init.nii.gz', 't2_centerline_labels.nii.gz', 't2_seg_manual.nii.gz' ] parser = sct_get_centerline.get_parser() dict_param = parser.parse(parameters.split(), check_file_exist=False) contrast = dict_param['-c'] dict_param_with_path = parser.add_path_to_file(dict_param, path_data, input_file=True) param_with_path = parser.dictionary_to_string(dict_param_with_path) # Check if input files exist if not (os.path.isfile(dict_param_with_path['-i'])): status = 200 output = 'ERROR: the file(s) provided to test function do not exist in folder: ' + path_data return status, output, DataFrame(data={ 'status': status, 'output': output, 'mse': float('nan'), 'dist_max': float('nan') }, index=[path_data]) cmd = 'sct_get_centerline ' + param_with_path status, output = sct.run(cmd, 0) scad_centerline = Image(contrast + "_centerline.nii.gz") manual_seg = Image(path_data + folder_data + contrast + '_seg_manual.nii.gz') max_distance = 0 standard_deviation = 0 average = 0 root_mean_square = 0 overall_distance = 0 max_distance = 0 overall_std = 0 rmse = 0 try: if status == 0: manual_seg.change_orientation() scad_centerline.change_orientation() from scipy.ndimage.measurements import center_of_mass # find COM iterator = range(manual_seg.data.shape[2]) com_x = [0 for ix in iterator] com_y = [0 for iy in iterator] for iz in iterator: com_x[iz], com_y[iz] = center_of_mass(manual_seg.data[:, :, iz]) max_distance = {} distance = {} for iz in range(1, scad_centerline.data.shape[2] - 1): ind1 = np.argmax(scad_centerline.data[:, :, iz]) X, Y = ind2sub(scad_centerline.data[:, :, iz].shape, ind1) com_phys = np.array( manual_seg.transfo_pix2phys([[com_x[iz], com_y[iz], iz]])) scad_phys = np.array( scad_centerline.transfo_pix2phys([[X, Y, iz]])) distance_magnitude = np.linalg.norm([ com_phys[0][0] - scad_phys[0][0], com_phys[0][1] - scad_phys[0][1], 0 ]) if math.isnan(distance_magnitude): print "Value is nan" else: distance[iz] = distance_magnitude max_distance = max(distance.values()) standard_deviation = np.std(np.array(distance.values())) average = sum(distance.values()) / len(distance) root_mean_square = np.sqrt(np.mean(np.square(distance.values()))) overall_distance = average max_distance = max(distance.values()) overall_std = standard_deviation rmse = root_mean_square except Exception, e: sct.printv("Exception found while testing scad integrity") output = e.message
def validate_scad(folder_input, contrast): """ Expecting folder to have the following structure : errsm_01: - t2 -- errsm_01.nii.gz or t2.nii.gz -- :param folder_input: :return: """ from sct_get_centerline import ind2sub import time import math import numpy t0 = time.time() current_folder = os.getcwd() os.chdir(folder_input) try: patients = next(os.walk('.'))[1] overall_distance = {} max_distance = {} standard_deviation = 0 overall_std = {} rmse = {} for i in patients: directory = i + "/" + str(contrast) try: os.chdir(directory) except Exception, e: print str(i)+" : "+contrast+" directory not found" try: if os.path.isfile(i+"_"+contrast+".nii.gz"): raw_image = Image(i+"_"+contrast+".nii.gz") elif os.path.isfile(contrast+".nii.gz"): raw_image = Image(contrast+".nii.gz") else: raise Exception("Patient scan not found") if os.path.isfile(i+"_"+contrast+"_manual_segmentation.nii.gz"): raw_orientation = raw_image.change_orientation() scad = SCAD(raw_image, contrast=contrast, rm_tmp_file=1, verbose=1) scad.execute() manual_seg = Image(i+"_"+contrast+"_manual_segmentation.nii.gz") manual_orientation = manual_seg.change_orientation() from scipy.ndimage.measurements import center_of_mass # find COM iterator = range(manual_seg.data.shape[2]) com_x = [0 for ix in iterator] com_y = [0 for iy in iterator] for iz in iterator: com_x[iz], com_y[iz] = center_of_mass(manual_seg.data[:, :, iz]) centerline_scad = Image(i+"_"+contrast+"_centerline.nii.gz") # os.remove(i+"_"+contrast+"_centerline.nii.gz") centerline_scad.change_orientation() distance = {} for iz in range(1, centerline_scad.data.shape[2]-1): ind1 = np.argmax(centerline_scad.data[:, :, iz]) X,Y = ind2sub(centerline_scad.data[:, :, iz].shape,ind1) com_phys = np.array(manual_seg.transfo_pix2phys([[com_x[iz], com_y[iz], iz]])) scad_phys = np.array(centerline_scad.transfo_pix2phys([[X, Y, iz]])) distance_magnitude = np.linalg.norm([com_phys[0][0]-scad_phys[0][0], com_phys[0][1]-scad_phys[0][1], 0]) if math.isnan(distance_magnitude): print "Value is nan" else: distance[iz] = distance_magnitude f = open(i+"_"+contrast+"_results.txt", 'w+') f.write("Patient,Slice,Distance") for key, value in distance.items(): f.write(i+","+str(key)+","+str(value)) standard_deviation = np.std(np.array(distance.values())) average = sum(distance.values())/len(distance) root_mean_square = np.sqrt(np.mean(np.square(distance.values()))) f.write("\nAverage : "+str(average)) f.write("\nStandard Deviation : "+str(standard_deviation)) f.close() overall_distance[i] = average max_distance[i] = max(distance.values()) overall_std[i] = standard_deviation rmse[i] = root_mean_square else: printv("Cannot find the manual segmentation", type="warning") except Exception, e: print e.message os.chdir(folder_input)
def test(path_data='', parameters=''): if not parameters: parameters = '-i t2/t2.nii.gz -c t2 -p auto' # parameters folder_data = 't2/' file_data = ['t2.nii.gz', 't2_centerline_init.nii.gz', 't2_centerline_labels.nii.gz', 't2_seg_manual.nii.gz'] parser = sct_get_centerline.get_parser() dict_param = parser.parse(parameters.split(), check_file_exist=False) contrast = dict_param['-c'] dict_param_with_path = parser.add_path_to_file(dict_param, path_data, input_file=True) param_with_path = parser.dictionary_to_string(dict_param_with_path) # Check if input files exist if not (os.path.isfile(dict_param_with_path['-i'])): status = 200 output = 'ERROR: the file(s) provided to test function do not exist in folder: ' + path_data return status, output, DataFrame(data={'status': status, 'output': output, 'mse': float('nan'), 'dist_max': float('nan')}, index=[path_data]) cmd = 'sct_get_centerline '+param_with_path status, output = sct.run(cmd, 0) scad_centerline = Image(contrast+"_centerline.nii.gz") manual_seg = Image(path_data + folder_data + contrast +'_seg_manual.nii.gz') max_distance = 0 standard_deviation = 0 average = 0 root_mean_square = 0 overall_distance = 0 max_distance = 0 overall_std = 0 rmse = 0 try: if status == 0: manual_seg.change_orientation() scad_centerline.change_orientation() from scipy.ndimage.measurements import center_of_mass # find COM iterator = range(manual_seg.data.shape[2]) com_x = [0 for ix in iterator] com_y = [0 for iy in iterator] for iz in iterator: com_x[iz], com_y[iz] = center_of_mass(manual_seg.data[:, :, iz]) max_distance = {} distance = {} for iz in range(1, scad_centerline.data.shape[2]-1): ind1 = np.argmax(scad_centerline.data[:, :, iz]) X,Y = ind2sub(scad_centerline.data[:, :, iz].shape,ind1) com_phys = np.array(manual_seg.transfo_pix2phys([[com_x[iz], com_y[iz], iz]])) scad_phys = np.array(scad_centerline.transfo_pix2phys([[X, Y, iz]])) distance_magnitude = np.linalg.norm([com_phys[0][0]-scad_phys[0][0], com_phys[0][1]-scad_phys[0][1], 0]) if math.isnan(distance_magnitude): print "Value is nan" else: distance[iz] = distance_magnitude max_distance = max(distance.values()) standard_deviation = np.std(np.array(distance.values())) average = sum(distance.values())/len(distance) root_mean_square = np.sqrt(np.mean(np.square(distance.values()))) overall_distance = average max_distance = max(distance.values()) overall_std = standard_deviation rmse = root_mean_square except Exception, e: sct.printv("Exception found while testing scad integrity") output = e.message