示例#1
0
    def run(self, target_ids, u_info):
    ###
    ###
        print('Simple merger runs.')

        ## Load DB
        db = DB(u_info)

        ## Clear undo buffer
        u_info.ids_files_undo = []

        ## Target id
        flatten_target_ids = set(chain.from_iterable(target_ids))

        for iw in range(db.num_tiles_w):
            for iz, iy, ix in product(range(db.num_tiles_z), range(db.num_tiles_y_at_w[iw]), range(db.num_tiles_x_at_w[iw])):

                ### Load tile file
                ### tile_ids( ( tile_num_pixels_y, tile_num_pixels_x ), np.uint32 )
                tile_ids_filename = u_info.tile_ids_path + u_info.tile_ids_filename_wzyx.format( iw, iz, iy, ix )
                tile_ids = m.load_hdf5( tile_ids_filename, u_info.tile_var_name )

                ## Check whether ids should be updated.

                unique_tile_ids = np.unique(tile_ids)
                if bool(flatten_target_ids.intersection( set(unique_tile_ids) ) ):

                    # Backup for undo
                    m.save_hdf5(tile_ids_filename+'_', u_info.tile_var_name, tile_ids)
                    u_info.ids_files_undo.append(tile_ids_filename)

                    # Merge target ids
                    for ids in target_ids:
                        for i in ids:
                            tile_ids[ tile_ids == i ] = ids[0]

                    # Save changes
                    m.save_hdf5( tile_ids_filename, u_info.tile_var_name, tile_ids )
                    print('Save: ', tile_ids_filename)


        ## For Undo
        db.Backup( u_info.segment_info_db_undo_file )
        u_info.flag_undo = 1
        u_info.flag_redo = 0

        ## Update
        db.Update()
示例#2
0
def Redo(u_info):
    if u_info.flag_redo < 1:
        print('No redo buffer.')
        return False

    u_info.flag_redo = 0
    ## Load DB
    db = DB(u_info)

    ##
    print('Redo: Database updated.')
    db.Backup(u_info.segment_info_db_undo_file)
    db.restore(u_info.segment_info_db_redo_file)
    print('Redo: Id panels updated.')
    u_info.ids_files_undo = u_info.ids_files_redo
    u_info.ids_files_redo = []
    for filename in u_info.ids_files_redo:
        shutil.move(filename, filename + '_')  ## Backup for undo
        shutil.move(filename + '~', filename)  ## Copy from redo backup
    u_info.flag_undo = 1
    print('Redo: Completed.')
示例#3
0
    def __init__(self, disconnect_id, u_info):

        ## Nortification
        print('3D disconnector runs.')

        ## Load DB
        db = DB(u_info)

        ## Clear undo buffer
        u_info.ids_files_undo = []

        ## Obtain a target region as a bool 3d array
        mask = np.zeros((db.canvas_size_y, db.canvas_size_x, db.num_tiles_z),
                        dtype=bool)
        for iz in range(db.num_tiles_z):
            full_map = m.ObtainFullSizeIdsPanel(u_info, db, iz)
            mask[:, :, iz] = (full_map == disconnect_id)

        ## Obtain disconnect regions by use of "measure.label"
        labels, num_labels = measure.label(
            mask, neighbors=4,
            return_num=True)  # "labels" will require large memory.
        print('Number of disconnected components: ', num_labels)

        ## Assign new ids
        assigned_id, maxid = db.ObtainUnusedIdsFromDB(u_info, num_labels - 1)

        ## Make changes on files
        ## Original images

        for iz in range(db.num_tiles_z):
            # Resize ids
            for iw in range(db.num_tiles_w):
                current_num_voxels_y = db.num_tiles_y_at_w[
                    iw] * db.num_voxels_per_tile_y
                current_num_voxels_x = db.num_tiles_x_at_w[
                    iw] * db.num_voxels_per_tile_x

                targ = labels[::(2**iw), ::(2**iw), iz]
                current_labels = zeros(
                    (current_num_voxels_y, current_num_voxels_x), targ.dtype)
                current_labels[0:targ.shape[0], 0:targ.shape[1]] = targ

                for iy, ix in itertools.product(range(db.num_tiles_y_at_w[iw]),
                                                range(
                                                    db.num_tiles_x_at_w[iw])):
                    ## Obtain a target id panel
                    yid_start = iy * db.num_voxels_per_tile_y
                    xid_start = ix * db.num_voxels_per_tile_x
                    yid_goal = iy * db.num_voxels_per_tile_y + db.num_voxels_per_tile_y
                    xid_goal = ix * db.num_voxels_per_tile_x + db.num_voxels_per_tile_x
                    tmp_labels = current_labels[yid_start:yid_goal,
                                                xid_start:xid_goal, iz]

                    if np.max(tmp_labels) > 0:
                        ## Obtain the target tile
                        tile_ids_filename = u_info.mojo_tile_ids_path \
                            + u_info.tile_ids_filename_wzyx.format(iw, iz, iy, ix)
                        tile_ids = m.load_hdf5(tile_ids_filename,
                                               u_info.tile_var_name)

                        # Backup undo
                        m.save_hdf5(tile_ids_filename + '_',
                                    u_info.tile_var_name, tile_ids)
                        ids_files_undo.append(
                            tile_ids_filename)  ## Filename for undo

                        # Make changes
                        for i in range(num_labels):
                            tile_ids[tmp_labels == i + 1] = assigned_id[i]
                        m.save_hdf5(tile_ids_filename, u_info.tile_var_name,
                                    tile_ids)

        ##
        ## Update database
        ##

        ## For Undo
        db.Backup(u_info.segment_info_db_undo_file)
        u_info.flag_undo = 1
        u_info.flag_redo = 0

        ## Update
        db.Update(u_info)