Exemplo n.º 1
0
def compare_structure_sequence(vs, display=True, slices=slice(None), file_id_part=2, append_file=None):
    """
    For all TreeCompare in `vs.tc_list` call compare_structure
    """
    from os.path import sep
    res = []
    
    for i,tc in np.array(list(enumerate(vs.tc_list)))[slices]:
        c = tc.get('cmp')
        r = tc.get('ref')
        tc.clear()
        
        f = sep.join(c.get_file().get_url().split(sep)[-file_id_part:])
        
        print '--- comparing file: ...', f, '---'
        r.segment.radius = np.zeros(r.segment.number())
        c.segment.radius = np.zeros(c.segment.number())
        rmtg = tree_to_mtg(r)
        cmtg = tree_to_mtg(c)
        c = _split_mtg(cmtg)
        r = _split_mtg(rmtg)
        
        ##return c,r
        for j,(ci,ri) in enumerate(zip(c,r)):
            print 'comparing image %2d root %2d' % (i,j)
            print '----------------------------'
            print 'max scale', ri.max_scale(), ci.max_scale()
            ##return ri,ci
            try:
                match_ratio, topo_ratio = compare_structure(ci,ri,display=display)
                res.append((i,f,j+1, match_ratio, topo_ratio))
            except:
                print '********** error processing', i,j, '**********'
            if display:
                k = raw_input('continue(y/n):')
                if k=='n': return
            print '----------------', i, j, '----------------' 
        
    if append_file:
        with open(append_file,'a') as f:
            print s,e, len(res)
            for re in results:
                re = ' '.join(map(str,re[1:]))
                f.write(r+'\n')
        
    return res
Exemplo n.º 2
0
    def compare_structure(self, display=False):
        """
        Call `compare_structure` function and store results as dictionaries in 
        attributes `comparison.geometry` and `comparison.topology`
        """
        from rhizoscan.root.graph.mtg import tree_to_mtg
        from os.path import sep
        c = self.get('cmp')
        r = self.get('ref')
        
        f = sep.join(c.get_file().get_url().split(sep)[-1:])
        
        print '--- comparing file: .../%s ---' % f
        print '============================' + '='*len(f)
        r.segment.radius = np.zeros(r.segment.number())
        c.segment.radius = np.zeros(c.segment.number())
        rmtg = tree_to_mtg(r)
        cmtg = tree_to_mtg(c)
        c = _split_mtg(cmtg)
        r = _split_mtg(rmtg)
        
        geom = {}
        topo = {}
        for i,(ci,ri) in enumerate(zip(c,r)):
            print 'comparing image root %2d' % i
            print '-----------------------'

            try:
                match_ratio, topo_ratio = compare_structure(ci,ri,display=display)
                geom[i] = match_ratio
                topo[i] = topo_ratio
                if display:
                    k = raw_input('geo:%.2f, topo:%.2f  - continue(y/n):' % (match_ratio,topo_ratio))
                    if k=='n': return
            except:
                print '********** error processing root %d **********' % i
            print '------------ end of root %d fo file %s ------------' % (i,f) 
        
        self.add_comparison('geometry', geom)
        self.add_comparison('topology', topo)
Exemplo n.º 3
0
def append_reference(ds,
                     refds,
                     name='reference_rsa',
                     verbose=False,
                     dry_run=False):
    """
    Append reference trees (as rsml mtg) from `refds` into `ds` Datasets
    
    :Inputs:
      ds 
        Dataset object. It is loaded then dumped after adding refds tree into
      refds
        Dataset object. Once loaded, it should contains a 'tree' attribute
      name
        Name of the attribute to use for storage into `ds`
      verbose
        If True, print a line for each element processed
      dry_run
        If True, don't dump `ds` elements
        
    :Outputs:
      - `ds`
      - the list of __key__ of refds element without tree
    """
    from rhizoscan.root.graph.mtg import tree_to_mtg

    # remove extra element of 'compared'
    def get_key(x):
        return x.__key__.replace('/', '_')

    ds_dict = dict([(get_key(d), d) for d in ds])
    to_merge = [(ds_dict.get(get_key(r), None), r) for r in refds]

    # find tree that are not found
    missing = []
    for d, r in to_merge:
        rtree = r.copy().load().get('tree', None)
        if rtree is not None:
            if verbose: print 'adding trees for', r.__key__
            d = d.copy().load()
            rrsa = tree_to_mtg(rtree)
            d.set(name, rrsa, store=not dry_run)
            if not dry_run:
                d.dump()
        else:
            if verbose: print ' *** unavailable trees for', r.__key__
            missing.append(r.__key__)

    return ds, missing
Exemplo n.º 4
0
 def _update_tree(self):
     item = self.edited_item
     # set tree, if exist
     if item.has_key('mtg'):
         self.tree_viewer.set_model(item.mtg)
         self.set_edited_presenter('tree_viewer')
     elif item.has_key('tree'):  ##to check
         from rhizoscan.root.graph.mtg import tree_to_mtg
         self.show_message("dataset item has not 'mtg' attribute")
         mtg = tree_to_mtg(item.tree)
         self.tree_viewer.set_model(mtg)
         self.set_edited_presenter('tree_viewer')
     else:
         self.show_message(
             "dataset item has not 'mtg' not 'tree' attribute")
Exemplo n.º 5
0
def run(image_filename, have_petri_plate=False, verbose=False):

    # ==========================================================================
    # Load image

    image = cv2.imread(image_filename, flags=cv2.IMREAD_GRAYSCALE)

    if verbose:
        show_image(image, "original image")

    # ==========================================================================
    # Detect features (Petri plate)

    border_width = 250  # Measure in pixel
    plate_size = 120    # Useful just for pixel scale
    fg_smooth = 1       # Dono

    if have_petri_plate:
        pmask, px_scale, hull = detect_petri_plate(image,
                                                   border_width=border_width,
                                                   plate_size=plate_size,
                                                   fg_smooth=fg_smooth)

        if verbose:
            show_image(pmask, "mask petri plate")
            print "Pixel scale :", px_scale
    else:
        pmask = None
        px_scale = None

    # ==========================================================================
    # Image Segmentation

    root_max_radius = 13

    rmask, bbox = segment_image(image,
                                pmask=pmask,
                                root_max_radius=root_max_radius,
                                min_dimension=50,
                                smooth=2,
                                verbose=True)

    if verbose:
        show_image(rmask, "segment mask")

    # ==========================================================================
    # Detect leaves and seed

    root_min_radius = 3
    plant_number = 5

    seed_map = detect_leaves_with_kmeans(rmask,
                                         erode_iteration=0,
                                         bounding_box=[0.05, 0.06, 0.90, 0.10],
                                         plant_number=plant_number)

    if verbose:
        show_image(seed_map + rmask, "seed_map+rmask")

    # ==========================================================================
    # Compute the graph corresponding to the RSA

    graph = compute_graph(rmask, seed_map, bbox=bbox, verbose=False)

    if verbose:
        graph.plot()
        matplotlib.pyplot.show()

    # ==========================================================================
    # Extract a tree from the graph

    tree = compute_tree(graph, px_scale=px_scale, min_length=15)

    if verbose:
        tree.plot()
        matplotlib.pyplot.show()

    # ==========================================================================
    # Save the RSA into an MTG

    mtg = tree_to_mtg(tree)

    rsml_serializer = RSMLSerializer()
    rsml_serializer.dump(mtg, image_filename + '.rsml')