def relabel_blocks(info, ids='segm/labels_memb_del', pf='relabeled', maxlabel=1): """Relabel all blocks in the dataset sequentially.""" for k, v in info.items(): ods = '{}_{}'.format(ids, pf) print('relabeling block {:03d} (id:{}) to {}'.format( k, v['postfix'], ods)) # seg = read_image(v, ids=ids, imtype='Label') fstem = os.path.join(v['datadir'], '{}_{}'.format(v['base'], v['postfix'])) seg = LabelImage('{}.h5/{}'.format(fstem, ids)) seg.load(load_data=False) seg = relabel(seg, maxlabel=maxlabel) if seg.maxlabel != 0: maxlabel = seg.maxlabel print('maxlabel = {:08d}'.format(maxlabel)) seg.close() return maxlabel
def mergeblocks( images_in, dataslices=None, blocksize=[], blockmargin=[], blockrange=[], blockoffset=[0, 0, 0], fullsize=[], is_labelimage=False, relabel=False, neighbourmerge=False, save_fwmap=False, blockreduce=[], func='np.amax', datatype='', usempi=False, outputpath='', save_steps=False, protective=False, ): """Merge blocks of data into a single hdf5 file.""" if blockrange: images_in = images_in[blockrange[0]:blockrange[1]] mpi = wmeMPI(usempi) im = Image(images_in[0], permission='r') im.load(mpi.comm, load_data=False) props = im.get_props(protective=protective, squeeze=True) ndim = im.get_ndim() props['dtype'] = datatype or props['dtype'] props['chunks'] = props['chunks'] or None # get the size of the outputfile # TODO: option to derive fullsize from dset_names? if blockreduce: datasize = np.subtract(fullsize, blockoffset) outsize = [ int(np.ceil(d / np.float(b))) for d, b in zip(datasize, blockreduce) ] props['elsize'] = [e * b for e, b in zip(im.elsize, blockreduce)] else: # FIXME: 'zyx(c)' stack assumed outsize = np.subtract(fullsize, blockoffset) if ndim == 4: outsize = list(outsize) + [im.ds.shape[3]] # TODO: flexible insert if outputpath.endswith('.ims'): mo = LabelImage(outputpath) mo.create(comm=mpi.comm) else: props['shape'] = outsize mo = LabelImage(outputpath, **props) mo.create(comm=mpi.comm) mpi.blocks = [{'path': image_in} for image_in in images_in] mpi.nblocks = len(images_in) mpi.scatter_series() # merge the datasets maxlabel = 0 for i in mpi.series: block = mpi.blocks[i] # try: maxlabel = process_block(block['path'], ndim, blockreduce, func, blockoffset, blocksize, blockmargin, fullsize, mo, is_labelimage, relabel, neighbourmerge, save_fwmap, maxlabel, mpi) print('processed block {:03d}: {}'.format(i, block['path'])) # except Exception as e: # print('failed block {:03d}: {}'.format(i, block['path'])) # print(e) im.close() mo.close() return mo