def warp_image(op, resol, inverse=False, return_str=False, stack=None): sqlController = SqlController() fileLocationManager = FileLocationManager(stack) tf_csv = os.path.join(fileLocationManager.brain_info, 'transforms_to_anchor.csv') transforms_to_anchor = csv_to_dict(tf_csv) transforms_resol = op['resolution'] string_to_um_from_resolution = sqlController.convert_resolution_string_to_um(stack, transforms_resol) string_to_um_to_resolution = sqlController.convert_resolution_string_to_um(stack, resol) # transforms_resol = op['resolution'] transforms_scale_factor = string_to_um_from_resolution / string_to_um_to_resolution tf_mat_mult_factor = np.array([[1, 1, transforms_scale_factor], [1, 1, transforms_scale_factor]]) if inverse: transforms_to_anchor = { img_name: convert_2d_transform_forms(np.linalg.inv(np.reshape(tf, (3, 3)))[:2] * tf_mat_mult_factor, out_form='str') for img_name, tf in transforms_to_anchor.items()} else: transforms_to_anchor = { img_name: convert_2d_transform_forms(np.reshape(list(tf), (3, 3))[:2] * tf_mat_mult_factor, out_form='str') for img_name, tf in transforms_to_anchor.items()} return transforms_to_anchor
def convert_cropbox_to_arr_xywh_1um(data, in_fmt, in_resol, stack): #print('data', data, 'in_fmt', in_fmt) sqlController = SqlController(stack) if isinstance(data, dict): data['rostral_limit'] = float(data['rostral_limit']) data['caudal_limit'] = float(data['caudal_limit']) data['dorsal_limit'] = float(data['dorsal_limit']) data['ventral_limit'] = float(data['ventral_limit']) arr_xywh = np.array([ data['rostral_limit'], data['dorsal_limit'], data['caudal_limit'] - data['rostral_limit'] + 1, data['ventral_limit'] - data['dorsal_limit'] + 1 ]) # Since this does not check for wrt, the user needs to make sure the cropbox is relative to the input prep (i.e. the wrt attribute is the same as input prep) elif isinstance(data, str): if in_fmt == 'str_xywh': d = re.sub('[!@#$cropwarp\]\[\']', '', data) l = d.split(',') a = [float(v) for v in l] arr_xywh = np.array(a) elif in_fmt == 'str_xxyy': #####UPGRADE from 2 to 3arr_xxyy = np.array(map(np.round, map(eval, data.split(',')))) arr_xxyy = np.array( list(map(np.round, list(map(eval, data.split(',')))))) arr_xywh = np.array([ arr_xxyy[0], arr_xxyy[2], arr_xxyy[1] - arr_xxyy[0] + 1, arr_xxyy[3] - arr_xxyy[2] + 1 ]) else: raise else: if in_fmt == 'arr_xywh': arr_xywh = data #arr_xywh = np.array(data) elif in_fmt == 'arr_xxyy': arr_xywh = np.array([ data[0], data[2], data[1] - data[0] + 1, data[3] - data[2] + 1 ]) else: print(in_fmt, data) raise string_to_um_in_resolution = sqlController.convert_resolution_string_to_um( stack, in_resol) arr_xywh_1um = arr_xywh * string_to_um_in_resolution print('arr_xywh_1um', arr_xywh_1um) return arr_xywh_1um
def convert_cropbox_from_arr_xywh_1um(data, out_fmt, out_resol, stack): sqlController = SqlController(stack) string_to_um_out_resolution = sqlController.convert_resolution_string_to_um( stack, out_resol) data = data / string_to_um_out_resolution if out_fmt == 'str_xywh': return ','.join(map(str, data)) elif out_fmt == 'dict': raise Exception("too lazy to implement") elif out_fmt == 'arr_xywh': return data elif out_fmt == 'arr_xxyy': return np.array( [data[0], data[0] + data[2] - 1, data[1], data[1] + data[3] - 1]) else: raise