From d83a4912763633d64fa85ae9b22c18402d8fff03 Mon Sep 17 00:00:00 2001 From: mattminder <myfiles@vpn-251-030.epfl.ch> Date: Wed, 13 May 2020 10:49:32 +0200 Subject: [PATCH] cosmetic changes --- unet/segment.py | 90 +++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 55 deletions(-) diff --git a/unet/segment.py b/unet/segment.py index 43fde00..07f594a 100644 --- a/unet/segment.py +++ b/unet/segment.py @@ -3,7 +3,6 @@ from skimage.feature import peak_local_max from skimage.morphology import watershed, dilation import numpy as np -# import cv2 def segment(th, pred, min_distance=10, topology=None): @@ -72,62 +71,43 @@ def cell_merge(wsh, pred): print("Processing cell ",obj1+1," of ",wsh.max()," for oversegmentation.") dil1 = dil_objs[obj1,:,:] - if np.sum(dil1) > 0: #dil1 can be empty because in the loop, maskobj2 can be deleted if it is joined with a (previous) maskobj1 - objcounter = objcounter + 1 - orig1 = objs[obj1,:,:] + # check if mask has been deleted + if np.sum(dil1) == 0: + continue + + objcounter = objcounter + 1 + orig1 = objs[obj1,:,:] - for obj2 in range(obj1+1,wsh.max()): - dil2 = dil_objs[obj2,:,:] - - if (do_box_overlap(obj_coords[obj1,:], obj_coords[obj2,:]) - and np.sum(dil2) > 0): - border = dil1 * dil2 - - border_pred = pred[border] - - # Border is too small to be considered - if len(border_pred) < 32: - continue - - # Sum of top 25% of predicted border values - q75 = np.quantile(border_pred, .75) - top_border_pred = border_pred[border_pred > q75] - top_border_height = top_border_pred.sum() - top_border_area = len(top_border_pred) + for obj2 in range(obj1+1,wsh.max()): + dil2 = dil_objs[obj2,:,:] + + # only check border if bounding box overlaps, and second mask + # is not yet deleted + if (do_box_overlap(obj_coords[obj1,:], obj_coords[obj2,:]) + and np.sum(dil2) > 0): + + border = dil1 * dil2 + border_pred = pred[border] + + # Border is too small to be considered + if len(border_pred) < 32: + continue + + # Sum of top 25% of predicted border values + q75 = np.quantile(border_pred, .75) + top_border_pred = border_pred[border_pred >= q75] + top_border_height = top_border_pred.sum() + top_border_area = len(top_border_pred) + + # merge cells + if top_border_height / top_border_area > .99: + orig1 = np.logical_or(orig1, objs[obj2,:,:]) + dil_objs[obj1,:,:] = np.logical_or(dil1, dil2) + dil_objs[obj2,:,:] = np.zeros((wshshape[0], wshshape[1])) + obj_coords[obj1,:] = get_bounding_box(dil_objs[obj1,:,:]) + print("Merged cell ",obj1+1," and ",obj2+1,".") -# borderprednonzero = pred[np.nonzero(border)] # all the prediction values inside the border area -# sortborderprednonzero = sorted(borderprednonzero) # sort the values -# borderprednonzeroarea = len(borderprednonzero) # how many values are there? -# quartborderarea = round(borderprednonzeroarea/4) # take one fourth of the values. there is some subtlety about how round() rounds but doesn't matter -# topborderpred = sortborderprednonzero[quartborderarea:] # take top 3/4 of the predictions -# topborderheight = np.sum(topborderpred) # sum over top 3/4 of the predictions -# topborderarea = len(topborderpred) # area of 3/4 of predictions. In principle equal to 3/4 of borderprednonzeroarea but because of strange rounding, will just measure again - - # merge cells - if top_border_height / top_border_area > .99: - orig1 = np.logical_or(orig1, objs[obj2,:,:]) - dil_objs[obj1,:,:] = np.logical_or(dil1, dil2) - dil_objs[obj2,:,:] = np.zeros((wshshape[0], wshshape[1])) - obj_coords[obj1,:] = get_bounding_box(dil_objs[obj1,:,:]) - print("Merged cell ",obj1+1," and ",obj2+1,".") - - -# if topborderarea > 8: # SJR: Not only must borderarea be greater than 0 but also have a little bit of border to go on. -# #print(obj1+1, obj2+1, topborderheight/topborderarea) -# if topborderheight/topborderarea > 0.99 : # SJR: We are really deep inside a cell, where the prediction is =1. Won't use: borderheight/borderarea > 0.95. Redundant. -# #print("--") -# #print(objcounter) -# #wsh=np.where(wsh==obj2+1, obj1+1, wsh) -# maskoriobj1 = np.uint8(np.multiply((maskoriobj1 > 0) | (oriobjs[obj2,:,:] > 0),1)) #have to do boolean then integer just to do an 'or' -# dilobjs[obj1,:,:] = np.uint8(np.multiply((maskobj1 > 0) | (maskobj2 > 0),1)) #have to do boolean then integer just to do an 'or' -# dilobjs[obj2,:,:] = np.zeros((wshshape[0],wshshape[1])) -# objcoords[obj1,0] = min(objcoords[obj1,0],objcoords[obj2,0]) -# objcoords[obj1,1] = max(objcoords[obj1,1],objcoords[obj2,1]) -# objcoords[obj1,2] = min(objcoords[obj1,2],objcoords[obj2,2]) -# objcoords[obj1,3] = max(objcoords[obj1,3],objcoords[obj2,3]) -# print("Merged cell ",obj1+1," and ",obj2+1,".") - - wshclean = wshclean + orig1*objcounter + wshclean = wshclean + orig1*objcounter return wshclean -- GitLab