def generate_config(filters=[TRANSLATE[key] for key in FILTERS]): #Set Outputs and inputs config = [ a3.Input('Source Image', a3.types.ImageFloat), a3.Input('Mask Image', a3.types.ImageFloat), a3.Output('Analyzed Image', a3.types.ImageFloat), a3.Output('Analyzed Binary', a3.types.ImageFloat), a3.Output('Analyzed Database', a3.types.GeneralPyType) ] #Set parameters for f in filters: for m in ['min', 'max']: config.append( a3.Parameter('{} {}'.format( f, m), a3.types.float).setFloatHint( 'default', 0 if m == 'min' else float(math.inf)).setFloatHint( 'unusedValue', 0 if m == 'min' else float(math.inf))) switch_list = [ a3.Parameter('Keep/Remove filtered objects', a3.types.bool).setBoolHint("default", False), a3.Parameter('Filter objects on border', a3.types.bool).setBoolHint("default", False), a3.Parameter('Volume in pixels/um\u00B3', a3.types.bool).setBoolHint("default", False) ] config.extend(switch_list) return config
def generate_config(methods=meth_list): methods.remove('Manual') #Set Outputs and inputs config = [ a3.Input('Image', a3.types.GeneralPyType), a3.Input('File Path', a3.types.url), a3.Input('Output Path', a3.types.url), a3.Parameter('Channel', a3.types.int8).setIntHint('default', 1) #.setIntHint('max', 8) .setIntHint('min', 1), #.setIntHint('unusedValue', 1), ] #Set parameters param = a3.Parameter('Method', a3.types.enum) for idx, m in enumerate(methods): param.setIntHint(str(m), idx) config.append(param) config.append( a3.Parameter('Manual Threshold Value', a3.types.float).setFloatHint('default', float(math.inf))) #.setFloatHint('unusedValue', float(math.inf)) #.setFloatHint('stepSize', 1)) config.append(a3.Parameter('Slice/Stack Histogram', a3.types.bool)) config.append( a3.Parameter('Save Images', a3.types.bool).setFloatHint('default', False)) return config
def generate_config(methods=METHODS): #Set Outputs and inputs config = [ a3.Input('File Path', a3.types.url), a3.Input('Output Path', a3.types.url), a3.Input('Input Image', a3.types.GeneralPyType), a3.Output('Thresholded Image', a3.types.GeneralPyType) ] #Set parameters param = a3.Parameter('Method', a3.types.enum) for idx, m in enumerate(methods): param.setIntHint(str(m), idx) config.append(param) config.append( a3.Parameter('Manual threshold value', a3.types.float).setFloatHint('default', float(math.inf))) #.setFloatHint('unusedValue', float(math.inf)) #.setFloatHint('stepSize', 1)) config.append(a3.Parameter('Slice/Stack histogram', a3.types.bool)) switch_list = [ a3.Parameter('Save Threshold(s)', a3.types.bool).setBoolHint("default", True), a3.Parameter('Save Image', a3.types.bool).setBoolHint("default", False) ] config.extend(switch_list) return config
def generate_config(): #Set Outputs and inputs config = [ a3.Input('ChA Image', a3.types.ImageFloat), a3.Input('ChB Image', a3.types.ImageFloat), a3.Input('ChA Thresholded', a3.types.GeneralPyType), a3.Input('ChB Thresholded', a3.types.GeneralPyType), a3.Output('ChA Image', a3.types.ImageFloat), a3.Output('ChB Image', a3.types.ImageFloat), a3.Output('ChA Thresholded', a3.types.ImageFloat), a3.Output('ChB Thresholded', a3.types.ImageFloat) ] return config
def init_config(methods=METHODS): config = [a3.Input('Input Image', a3.types.ImageFloat)] method_param = a3.Parameter('Method', a3.types.enum) for idx, m in enumerate(methods): method_param.setIntHint(str(m), idx) config.append(method_param) #Add inputfield for BlockSize param_blocksize = a3.Parameter('BlockSize', a3.types.float) param_blocksize.setIntHint('min', 2) param_blocksize.setIntHint('max', 800) param_blocksize.setIntHint('stepSize', 1), config.append(param_blocksize) #Add inputfield for Offset param_offset = a3.Parameter('Offset', a3.types.float) param_offset.setIntHint('min', 0) param_offset.setIntHint('max', 800) param_offset.setIntHint('stepSize', 1), config.append(param_offset) config.append(a3.Output('Output Image', a3.types.ImageFloat)) return config
def generate_config(methods=METHODS): config = [ a3.Input('Input Image', a3.types.ImageFloat), a3.Output('Output Image', a3.types.ImageFloat) ] param = a3.Parameter('Method', a3.types.enum) for idx, m in enumerate(methods): param.setIntHint(str(m), idx) config.append(param) config.append(a3.Parameter('Stack Histogram', a3.types.bool)) return config
def generate_config(methods=METHODS): #Set Outputs and inputs config = [ a3.Input('Input Image', a3.types.ImageFloat), a3.Output('Thresholded Image', a3.types.ImageFloat) ] #Set parameters param = a3.Parameter('Method', a3.types.enum) for idx, m in enumerate(methods): param.setIntHint(str(m), idx) config.append(param) config.append( a3.Parameter('Manual threshold value', a3.types.float).setFloatHint('default', float(math.inf))) #.setFloatHint('unusedValue', float(math.inf)) #.setFloatHint('stepSize', 1)) config.append(a3.Parameter('Slice/Stack histogram', a3.types.bool)) return config
def generate_config(): config = [ a3.Input('Input Image', a3.types.ImageFloat), a3.Output('Output Image', a3.types.ImageFloat) ] #Add inputfield for Upper threshold param_upper = a3.Parameter('Upper', a3.types.float) #param_upper.setIntHint('min', 0) #param_upper.setIntHint('max', 65535) param_upper.setIntHint('stepSize', 1), config.append(param_upper) #Add inputfield for Lower threshold param_lower = a3.Parameter('Lower', a3.types.float) #param_lower.setIntHint('min', 0) #param_lower.setIntHint('max', 65535) param_lower.setIntHint('stepSize', 1), config.append(param_lower) return config
def generate_config(filters=FILTERS): #Set Outputs and inputs config = [ a3.Input('File Path', a3.types.url), a3.Input('Output Path', a3.types.url), a3.Input('ChA Image', a3.types.GeneralPyType), a3.Input('ChA DataBase', a3.types.GeneralPyType), a3.Input('ChB Image', a3.types.GeneralPyType), a3.Input('ChB DataBase', a3.types.GeneralPyType), a3.Output('Overlapping Image', a3.types.GeneralPyType), a3.Output('Overlapping Binary', a3.types.GeneralPyType), a3.Output('Overlapping DataBase', a3.types.GeneralPyType), a3.Output('Overlapping Path', a3.types.url) ] #Set parameters for f in filters: for m in ['min', 'max']: config.append( a3.Parameter('{} {}'.format( TRANSLATE[f], m), a3.types.float).setFloatHint( 'default', 0 if m == 'min' else DEFAULT_VALUE[f]).setFloatHint( 'default', 0 if m == 'min' else DEFAULT_VALUE[f]).setFloatHint( 'unusedValue', 0 if m == 'min' else DEFAULT_VALUE[f])) switch_list = [ a3.Parameter('Keep/Remove filtered objects', a3.types.bool).setBoolHint("default", False), a3.Parameter('Volume in pixels/um\u00B3', a3.types.bool).setBoolHint("default", False), a3.Parameter('Save to xlsx/text', a3.types.bool) ] config.extend(switch_list) return config
#img.metadata['Path']=filename #Create Output #Extract channel from image array a3.outputs['Channel 1'] = img.get_dimension(a3.inputs['Channel'], 'C').to_multidimimage() #to_multidimimage(Image(array.astype(np.float),copy.deepcopy(img.metadata))) #Finalization tstop = time.clock() print('Processing finished in ' + str((tstop - tstart)) + ' seconds! ') print('Image loaded successfully!') print(SEPARATOR) except Exception as e: raise error("Error occured while executing '" + str(ctx.type()) + "' module '" + str(ctx.name()) + "' !", exception=e) config = [ a3.Parameter('Channel', a3.types.int8).setFloatHint('default', 0).setFloatHint('unusedValue', 0), a3.Input('Image', a3.types.GeneralPyType), a3.Input('MetaData', a3.types.GeneralPyType), a3.Output('Channel', a3.types.ImageFloat) ] a3.def_process_module(config, module_main)
sel_2 = a3.inputs['second selected channel'][1] print(sel_1, sel_2) if 0 <= sel_1 < 4: a3.outputs['first selected channel'] = input_channels[sel_1] else: raise RuntimeError('invalid value for \'first selected channel\': {}' .format(sel_1)) if 0 <= sel_2 < 4: a3.outputs['second selected channel'] = input_channels[sel_2] else: raise RuntimeError('invalid value for \'second selected channel\': {}' .format(sel_1)) config = [a3.Input('channel 1', a3.types.ImageFloat), a3.Input('channel 2', a3.types.ImageFloat), a3.Input('channel 3', a3.types.ImageFloat), a3.Input('channel 4', a3.types.ImageFloat), a3.Parameter('first selected channel', a3.types.enum) .setIntHint("channel 1", 0) .setIntHint("channel 2", 1) .setIntHint("channel 3", 2) .setIntHint("channel 4", 3), a3.Parameter('second selected channel', a3.types.enum) .setIntHint("channel 1", 0) .setIntHint("channel 2", 1) .setIntHint("channel 3", 2) .setIntHint("channel 4", 3), a3.Output('first channel', a3.types.ImageFloat), a3.Output('second channel', a3.types.ImageFloat)]
import a3dc_module_interface as a3 from scipy.ndimage.measurements import label import numpy as np def module_main(ctx): input_image = a3.MultiDimImageFloat_to_ndarray(a3.inputs['binary volume']) structure = np.array([ [[0,0,0],[0,1,0],[0,0,0]], [[0,1,0],[1,1,1],[0,1,0]], [[0,0,0],[0,1,0],[0,0,0]]]) labeled_image, _ = label(input_image, structure) print(labeled_image) a3.outputs['labeled volume'] = a3.MultiDimImageUInt32_from_ndarray(labeled_image) print('object labeling complete 🔖') config = [a3.Input('binary volume', a3.types.ImageFloat), a3.Output('labeled volume', a3.types.ImageUInt32)] a3.def_process_module(config, module_main)
#Create Output 1 ch_1_Nb = a3.inputs['Channel'] - 1 ch_1 = img.get_dimension(ch_1_Nb, 'C') ch_1.metadata['Path'] = filename ch_1.reorder('ZYXCT') a3.outputs['Channel'] = ch_1 #Finalization tstop = time.clock() print('Processing finished in ' + str((tstop - tstart)) + ' seconds! ') print('Image loaded successfully!') print(SEPARATOR) except Exception as e: raise error("Error occured while executing '" + str(ctx.type()) + "' module '" + str(ctx.name()) + "' !", exception=e) config = [ a3.Input('FileName', a3.types.url), a3.Parameter('Channel', a3.types.int8).setIntHint('default', 1) #.setIntHint('max', 8) .setIntHint('min', 1), #.setIntHint('unusedValue', 1), a3.Output('Channel', a3.types.GeneralPyType) ] a3.def_process_module(config, module_main)
# unique labels for the intersections intersection_labels = intersection_mask * (labeled_2 * n_1 + labeled_1) ids_1 = labeled_1[intersection_mask].ravel() ids_int = intersection_labels[intersection_mask].ravel() ids_2 = labeled_2[intersection_mask].ravel() # intersecting label triplets intersecting_ids = np.unique(np.c_[ids_1, ids_int, ids_2], axis=0) return intersecting_ids, intersection_labels def module_main(ctx): input_A = a3.MultiDimImageUInt32_to_ndarray(a3.inputs['labeled A']) input_B = a3.MultiDimImageUInt32_to_ndarray(a3.inputs['labeled B']) intersecting_ids, intersection_labels = intersect_labels(input_A, input_B) a3.outputs['labeled intersection'] = \ a3.MultiDimImageUInt32_from_ndarray(intersection_labels.astype(np.uint32)) a3.outputs['label pair list'] = intersecting_ids print('labeled intersections are ready ✨') config = [ a3.Input('labeled A', a3.types.ImageUInt32), a3.Input('labeled B', a3.types.ImageUInt32), a3.Output('labeled intersection', a3.types.ImageUInt32), a3.Output('label pair list', a3.types.GeneralPyType) ] a3.def_process_module(config, module_main)
from pathlib import Path import a3dc_module_interface as a3 from modules.a3dc_modules.a3dc.utils import os_open from modules.a3dc_modules.a3dc.utils import error def module_main(ctx): try: extensions = ['.txt', '.xlsx'] path = a3.inputs['Path'].path if a3.inputs['Show'] and Path(path).suffix in extensions: os_open(path) except Exception as e: raise error("Error occured while executing '" + str(ctx.type()) + "' module '" + str(ctx.name()) + "' !", exception=e) a3.def_process_module( [a3.Input('Path', a3.types.url), a3.Parameter('Show', a3.types.bool)], module_main)
level = a3.inputs['level'] # TODO: this is a naive way, we should not copy the data with # MultiDimImageFloat_to_ndarray and MultiDimImageFloat_from_ndarray # but do the leveling in-place input_image = a3.MultiDimImageFloat_to_ndarray(a3.inputs['input']) if a3.inputs['input'].meta.has('type'): print('type', a3.inputs['input'].meta.get('type')) if a3.inputs['input'].meta.has('normalized'): print('normalized', a3.inputs['input'].meta.get('normalized')) if a3.inputs['input'].meta.has('path'): print('path', a3.inputs['input'].meta.get('path')) if a3.inputs['input'].meta.has('channel'): print('channel', a3.inputs['input'].meta.get('channel')) print(str(a3.inputs['input'].meta)) bin_image = (input_image >= level) * 1.0 a3.outputs['binary volume'] = a3.MultiDimImageFloat_from_ndarray(bin_image) print('binarization complete 🍰') config = [a3.Input('input', a3.types.ImageFloat), a3.Parameter('level', a3.types.float), a3.Output('binary volume', a3.types.ImageFloat)] a3.def_process_module(config, module_main)
#Read Parameters params = read_params() save_database(params['Database'], params['Path'], params['Filename'], to_text=params['Save to text']) #Finalization print('Object analysis was run successfully!') print(SEPARATOR) except IOError as e: print("Warning: Failed to write to file!!", file=sys.stderr) print(str(e), file=sys.stderr) except Exception as e: error("Error occured while executing '" + str(ctx.type()) + "' module '" + str(ctx.name()) + "' !", exception=e) #Set Outputs and inputs config = [ a3.Input('DataBase', a3.types.GeneralPyType), a3.Parameter('Filename', a3.types.string), a3.Parameter('Path', a3.types.url).setBoolHint('folder', True), a3.Parameter('Save to text', a3.types.bool) ] a3.def_process_module(config, module_main)
#Load and reshape image img = VividImage.load(filename, file_type='ome') img.reorder('XYZCT') #Print important image parameters print_line_by_line(str(img)) #Create Output a3.outputs['Array'] = img.image a3.outputs['MetaData']=img.metadata #Add path and filename to metadata a3.outputs['MetaData']['Path']=os.path.dirname(filename) a3.outputs['MetaData']['FileName']=os.path.basename(filename) #Finalization tstop = time.clock() print('Processing finished in ' + str((tstop - tstart)) + ' seconds! ') print('Image loaded successfully!') print(SEPARATOR) except Exception as e: raise error("Error occured while executing '"+str(ctx.type())+"' module '"+str(ctx.name())+"' !",exception=e) config = [a3.Input('FileName', a3.types.url), a3.Output('Array', a3.types.GeneralPyType), a3.Output('MetaData', a3.types.GeneralPyType)] a3.def_process_module(config, module_main)
import a3dc_module_interface as a3 def module_main(ctx): print('Hello Consumer Demo! This is {}'.format(ctx.name())) print('string input: {}'.format(a3.inputs['string input'])) print('filename input: {}'.format(a3.inputs['filename input'].path)) print('int input: {}'.format(a3.inputs['int input'])) print('float input: {}'.format(a3.inputs['float input'])) print('bool input: {}'.format(a3.inputs['bool input'])) print('enum int input: {}'.format(a3.inputs['enum int input'])) print('pyobject input: {}'.format(a3.inputs['pyobject input'])) print('done.') config = [ a3.Input('string input', a3.types.string), a3.Input('filename input', a3.types.url), a3.Input('int input', a3.types.int8), a3.Input('float input', a3.types.float), a3.Input('bool input', a3.types.bool), a3.Input('enum int input', a3.types.int32), a3.Input('pyobject input', a3.types.GeneralPyType) ] a3.def_process_module(config, module_main)
import a3dc_module_interface as a3 from scipy.ndimage.measurements import labeled_comprehension import numpy as np def module_main(ctx): label_pairs = a3.inputs['label pair list'] intensity_image = a3.MultiDimImageFloat_to_ndarray( a3.inputs['intensity image']) labeled_image = a3.MultiDimImageUInt32_to_ndarray(a3.inputs['labeled']) ids_1 = label_pairs[:, 0] cnt_1 = labeled_comprehension(intensity_image, labeled_image, ids_1, len, int, -1) print(np.c_[ids_1, cnt_1]) print('voxel counting done 🍀') config = [ a3.Input('label pair list', a3.types.GeneralPyType), a3.Input('intensity image', a3.types.ImageFloat), a3.Input('labeled', a3.types.ImageUInt32) ] a3.def_process_module(config, module_main)