Exemple #1
0
def levelset_geo_separete(img,
                          labels,
                          niter=10,
                          prop=-1,
                          advec=-0.5,
                          curve=-0.5):
    seg = sitk.GetImageFromArray((labels > 0).astype(np.uint8))
    init_ls = sitk.SignedMaurerDistanceMap(seg,
                                           insideIsPositive=True,
                                           useImageSpacing=True)

    mask = find_boundaries(gvoronoi(label(labels, connectivity=1)),
                           mode='inner')
    img1 = img.copy()
    img1[mask] = 0

    img_T1 = sitk.GetImageFromArray(img1)
    lsFilter = sitk.GeodesicActiveContourLevelSetImageFilter()
    lsFilter.SetMaximumRMSError(0.02)
    lsFilter.SetNumberOfIterations(niter)
    lsFilter.SetAdvectionScaling(advec)
    lsFilter.SetCurvatureScaling(curve)
    lsFilter.SetPropagationScaling(prop)
    # lsFilter.ReverseExpansionDirectionOn()

    ls = lsFilter.Execute(init_ls, sitk.Cast(img_T1, sitk.sitkFloat32))
    return label(sitk.GetArrayFromImage(ls) > 0, connectivity=1)
Exemple #2
0
    def get_labels(self):
        temp = label(self.bw.copy(), connectivity=1)
        temp = np.zeros(self.bw.shape)

        if not self.goodcells:
            return label(self.bw)
        max_label = temp.max()
        for n, i in enumerate(self.all_cells):
            for c in i.coords:
                temp[c[0], c[1]] = max_label + n + 1
        return temp
Exemple #3
0
 def search_cut_candidates(self, bw, coords_set):
     candidates = []
     for n1, (startpt, endpt) in enumerate(coords_set):
         # cut and get candidate regionprops
         cand_rps = make_candidates_img(bw.copy(), startpt[0], startpt[1],
                                        endpt[0], endpt[1], self.img)
         if not len(cand_rps) > len(
                 np.unique(label(self.cell.filled_image,
                                 connectivity=1))) - 1:
             continue
         if not all([c.area > np.pi * self.small_rad**2 for c in cand_rps]):
             continue
         # scoring
         for n2, c in enumerate(cand_rps):
             # If you get an error here, it might be unresolved error of scikit-image. https://github.com/scikit-image/scikit-image/issues/1470
             # edit _regionprops._RegionProperties.moments and moments_central from "astype(np.uint8)" to "astype(np.float)"
             if c.minor_axis_length > 1:
                 c.n1, c.n2 = n1, n2
                 c.cut_coords = (startpt, endpt)
                 c.cutline_len = np.sqrt((startpt[0] - endpt[0])**2 +
                                         (startpt[1] - endpt[1])**2)
                 c.line_total = intensity_below_line(
                     self.img, startpt[0], startpt[1], endpt[0],
                     endpt[1]).sum()
                 candidates.append(c)
     return candidates
Exemple #4
0
def levelset_geo(img, labels, advec=3, propagation=0.75, niter=100):
    """Propagate outwards
    """
    simg = sitk.GetImageFromArray(img, sitk.sitkFloat32)
    labels = label(binary_erosion(labels, np.ones((3, 3))))
    seg = sitk.GetImageFromArray(labels)
    init_ls = sitk.SignedMaurerDistanceMap(seg, insideIsPositive=True, useImageSpacing=True)

    gfil = sitk.GeodesicActiveContourLevelSetImageFilter()
    gfil.SetMaximumRMSError(0.02)
    gfil.SetNumberOfIterations(niter)
    gfil.SetAdvectionScaling(advec)
    gfil.SetCurvatureScaling(1)
    gfil.SetPropagationScaling(propagation)
    gfil.ReverseExpansionDirectionOn()
    ls = gfil.Execute(init_ls, sitk.Cast(simg, sitk.sitkFloat32))
    ls = label(sitk.GetArrayFromImage(ls) > 0)
    return keep_labels(labels, ls)
Exemple #5
0
def run_concave_cut(img, labels, small_rad, large_rad, EDGELEN=6, THRES=180):
    store = get_cut_coords(img,
                           labels,
                           small_rad,
                           large_rad,
                           EDGELEN=EDGELEN,
                           THRES=THRES)
    labels = label(cut_labels(labels, [i for j in store for i in j]),
                   connectivity=1)
    return labels
Exemple #6
0
def levelset_lap(img, labels, NITER=100, CURVE=3, PROP=-1):
    simg = sitk.GetImageFromArray(img, sitk.sitkFloat32)
    seg = sitk.GetImageFromArray(labels)
    init_ls = sitk.SignedMaurerDistanceMap(seg, insideIsPositive=True, useImageSpacing=True)

    lsFilter = sitk.LaplacianSegmentationLevelSetImageFilter()
    lsFilter.SetMaximumRMSError(0.02)
    lsFilter.SetNumberOfIterations(NITER)
    lsFilter.SetCurvatureScaling(CURVE)
    lsFilter.SetPropagationScaling(PROP)
    lsFilter.ReverseExpansionDirectionOn()
    ls = lsFilter.Execute(init_ls, sitk.Cast(simg, sitk.sitkFloat32))
    ls = label(sitk.GetArrayFromImage(ls) > 0)
    return keep_labels(labels, ls)
Exemple #7
0
def convert_labels(lb_ref_to, lb_ref_from, lb_convert):
    """
    lb_ref_to: 
    lb_ref_from: 
    lb_convert: a labeled image to be converted.
    """
    lbmap_to, lbmap_from = zip(*labels_map(lb_ref_to, lb_ref_from))
    arr = np.zeros(lb_convert.shape, dtype=np.uint16)
    lb = lb_convert.copy()

    for n0, n1 in zip(lbmap_to, lbmap_from):
        arr[lb == n1] = n0
        lb[lb == n1] = 0

    remained = label(lb)
    remained = remained + arr.max()
    remained[remained == arr.max()] = 0
    arr = arr + remained
    return arr
Exemple #8
0
def dlevel_set(phi, F, niter=20, dt=-0.5, mask=None):
    """
    Implementation of Level set method. https://wiseodd.github.io/techblog/2016/11/05/levelset-method/
    It has an extra repulsion and masking processes.
        niter (int): iteration
        dt (float): negative values for propagation, positive values for shrinking
        phi (ndarray): labels, set inner objects as -1 and outside as 1.
        F (ndarray): img, set boundaries close to 0 and elsewhere close to 1.
        mask (ndarray[np.bool]): contours do not cross this line.
    """
    if mask is None:
        mask = np.zeros(phi.shape, np.bool)
    for i in range(niter):
        dphi = grad(phi)
        dphi_norm = norm(dphi)

        region = calc_mask_exclude_overlap(label(phi < 0),
                                           2)  # added for absolute repulsion
        dphi_norm[region] = 0  # added for absolute repulsion
        dphi_norm[mask] = 0  # added constraints based on the image

        dphi_t = F * dphi_norm
        phi = phi + dt * dphi_t
    return phi
Exemple #9
0
def make_candidates_img(cl_label, s0, s1, e0, e1, img):
    cut_label = cut_neck(cl_label, s0, s1, e0, e1)
    cand_label = label(cut_label, connectivity=1)
    cand_rps = regionprops(cand_label, img)
    return cand_rps
Exemple #10
0
 def num_seg(self):
     """
     number of isolated segments
     """
     return np.max(label(self.image, connectivity=1))