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)
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
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
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)
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
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)
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
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
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
def num_seg(self): """ number of isolated segments """ return np.max(label(self.image, connectivity=1))