def test_croptobbox(): X, Y = np.meshgrid(np.arange(16) - 8, np.arange(16) - 8) ball = ((X**2 + Y**2) < 32).astype(np.uint8) assert mahotas.croptobbox(ball).sum() == ball.sum() assert mahotas.croptobbox(ball, border=2).sum() == ball.sum() assert mahotas.croptobbox(ball, border=256).sum() == ball.sum() assert mahotas.croptobbox(ball, border=256).size == ball.size assert mahotas.croptobbox(ball.T).sum() == ball.sum() assert mahotas.croptobbox(ball[::2]).sum() == ball[::2].sum() assert mahotas.croptobbox(ball[::2].T).sum() == ball[::2].sum() assert mahotas.croptobbox(ball.T, border=2).sum() == ball.sum() assert mahotas.croptobbox(ball.T, border=256).sum() == ball.sum() assert mahotas.croptobbox(ball.T, border=256).size == ball.size
def test_croptobbox(): X,Y = np.meshgrid(np.arange(16)-8,np.arange(16)-8) ball = ((X**2+Y**2) < 32).astype(np.uint8) assert mahotas.croptobbox(ball).sum() == ball.sum() assert mahotas.croptobbox(ball,border=2).sum() == ball.sum() assert mahotas.croptobbox(ball,border=256).sum() == ball.sum() assert mahotas.croptobbox(ball,border=256).size == ball.size assert mahotas.croptobbox(ball.T).sum() == ball.sum() assert mahotas.croptobbox(ball[::2]).sum() == ball[::2].sum() assert mahotas.croptobbox(ball[::2].T).sum() == ball[::2].sum() assert mahotas.croptobbox(ball.T, border=2).sum() == ball.sum() assert mahotas.croptobbox(ball.T, border=256).sum() == ball.sum() assert mahotas.croptobbox(ball.T, border=256).size == ball.size
def view_labels(array, labels, crop=True, large=True, return_it=False): if type(labels) != type(list()): labels = [labels] out = np.zeros(array.shape) for l in labels: l_arr = Util.threshold(array, l) out[l_arr == 1] = out.max() + 1 if crop: out = mh.croptobbox(out) if large: figsize = (10, 10) else: figsize = (3, 3) if return_it: return out fig = plt.figure(figsize=figsize) plt.imshow(out)
def view(array, color=True, large=False, crop=False, text=None, no_axis=True, file=''): if large: figsize = (10, 10) else: figsize = (3, 3) fig = plt.figure(figsize=figsize) if crop: array = mh.croptobbox(array) if text: text = '\n\n\n' + str(text) fig.text(0, 1, text) if no_axis: plt.axis('off') if color: plt.imshow(Util.colorize(array), picker=True) else: plt.imshow(array, cmap='gray', picker=True) if file != '': plt.savefig(file)
def _get_grid_img(self, crop_img, elem_contour): cnt = Contour(elem_contour) halfbox = cnt.shrinkbox(100).astype("f") square = self._square_coordinates(cnt.side) trans = cv2.getPerspectiveTransform(halfbox, square) box = cv2.warpPerspective(crop_img, trans, (cnt.side, cnt.side)) _, thresh = cv2.threshold(box, 127, 255, 0) binary = pm.binary(thresh) box = binary.astype(int) * 255 box = pm.edgeoff(box) box = mh.croptobbox(box) return box
def view(array, color=True, large=False, crop=False, text=None): if large: figsize = (10, 10) else: figsize = (3, 3) fig = plt.figure(figsize=figsize) if crop: array = mh.croptobbox(array) if text: text = '\n\n\n' + str(text) fig.text(0, 1, text) if color: plt.imshow(Util.colorize(array), picker=True) else: plt.imshow(array, cmap='gray', picker=True)
def run_merge_test(cnn, bbox=[0, 1024, 0, 1024], data='gt', slices=[70, 71, 72, 73, 74], min_pixels=1000, N=20, oversampling=False, keep_zeros=True, verbose=False): if data == 'rhoana': print 'not implemented yet' return [], [] print '-' * 80 print '-' * 80 print 'New Experiment:' print ' Data:', data print ' Slices:', slices print ' No. splits for borders:', N print ' Keep zeros in segmentation:', keep_zeros # global_vis = [] global_vi_diffs = [] # global_surenesses = [] # global_merge_pairs = [] for s in slices: if verbose: print '-' * 80 print 'Working on slice', s # load slice input_image, input_prob, input_gold, input_rhoana = Util.read_section( s, keep_zeros=keep_zeros) # apply bbox input_image = input_image[bbox[0]:bbox[1], bbox[2]:bbox[3]] input_prob = input_prob[bbox[0]:bbox[1], bbox[2]:bbox[3]] input_gold = input_gold[bbox[0]:bbox[1], bbox[2]:bbox[3]] input_rhoana = input_rhoana[bbox[0]:bbox[1], bbox[2]:bbox[3]] framed_gold = Util.frame_image(input_gold, shape=(200, 200)) hist = Util.get_histogram(framed_gold.astype(np.uint64)) labels = range(len(hist)) np.random.shuffle(labels) slice_vi_diffs = [] for l in labels: if l == 0: continue if len(framed_gold[framed_gold == l]) < min_pixels: continue neighbors = Util.grab_neighbors(framed_gold, l) np.random.shuffle(neighbors) good_neighbors = [] for n in neighbors: if n == 0: continue if len(framed_gold[framed_gold == n]) < min_pixels: continue good_neighbors.append(n) if len(good_neighbors) > 0: for n in good_neighbors: # print 'merging', l, n before_merge_error = np.zeros(framed_gold.shape) before_merge_error[framed_gold == l] = 1 before_merge_error[framed_gold == n] = 2 before_merge_error = mh.croptobbox(before_merge_error) cropped_image, cropped_prob, cropped_segmentation, cropped_binary, bbox, real_border = Uglify.merge_label( input_image, input_prob, framed_gold, l, n, crop=True) vi_before = Util.vi( before_merge_error[10:-10, 10:-10].astype(np.uint8), mh.croptobbox(cropped_binary)[10:-10, 10:-10].astype( np.uint8)) # print 'VI after merge error:', vi_before borders, best_border_image, result, result_no_border, results_no_border, predictions = Fixer.fix_single_merge( cnn, cropped_image, cropped_prob, cropped_binary, real_border=real_border, N=N, erode=True, oversampling=False) if result_no_border.shape[0] == 0: continue if best_border_image.max() == 0: # print 'no solution' continue # if before_merge_error.shape[0] != result_no_border.shape[0] or before_merge_error.shape[1] != result_no_border.shape[1]: # result_no_border = np.resize(result_no_border, before_merge_error.shape) # if before_merge_error.size != mh.croptobbox(r) # compare_result = np.zeros(before_merge_error.shape, dtype=np.uint8) # compare_result[:] = result_no_border[101:-101, 101:-101][0:before_merge_error.shape[0], 0:before_merge_error.shape[1]] best_vi = np.inf vi_diffs = [] # sorted_predictions = sorted(predictions) for r in results_no_border: if r.shape[0] == 0: continue r = r[100:-100, 100:-100] result_no_border_center = (r.shape[0] / 2, r.shape[1] / 2) before_merge_center = ( before_merge_error.shape[0] / 2 - 10, before_merge_error.shape[1] / 2 - 10) r = r[result_no_border_center[0] - before_merge_center[0]: result_no_border_center[0] + before_merge_center[0], result_no_border_center[1] - before_merge_center[1]: result_no_border_center[1] + before_merge_center[1]] b = before_merge_error[result_no_border_center[0] - before_merge_center[0]: result_no_border_center[0] + before_merge_center[0], result_no_border_center[1] - before_merge_center[1]: result_no_border_center[1] + before_merge_center[1]] vi_after_fixing = Util.vi(b.astype(np.uint8), r.astype(np.uint8)) vi_diffs.append(vi_before - vi_after_fixing) # now we have vi_diffs for this one merge error slice_vi_diffs.append((vi_diffs, predictions)) global_vi_diffs.append(slice_vi_diffs) vi_correction_bins = [0, 0, 0, 0, 0] bin_counts = [0, 0, 0, 0, 0] for s in global_vi_diffs: for merge_errors in s: vi_diff_per_error = merge_errors[0] predictions_per_error = merge_errors[1] # sort by prediction found_borders = sorted(zip(vi_diff_per_error, predictions_per_error), key=lambda x: x[1]) for i in range(5): if len(found_borders) > i: for j in range(i, len(found_borders)): print i, j, len(vi_correction_bins), len( found_borders) vi_correction_bins[j] += found_borders[j][0] bin_counts[j] += 1 for i in range(5): vi_correction_bins[i] /= bin_counts[i] return global_vi_diffs, vi_correction_bins
def test_croptobbox_3d(): YXZ = np.indices((32, 32, 64), float) YXZ -= 8 Y, X, Z = YXZ ball = ((X**2 + Y**2 + Z**2) < 64).astype(np.uint8) assert np.sum(ball) == np.sum(mh.croptobbox(ball))
def croppBoundingBox(self): # Returns a version of img cropped to the image’s bounding box. # http://mahotas.readthedocs.io/en/latest/api.html#mahotas.croptobbox return mh.croptobbox(self.imgArray, 0)
def test_croptobbox_3d(): YXZ = np.indices((32,32,64), float) YXZ -= 8 Y,X,Z = YXZ ball = ((X**2+Y**2+Z**2) < 64).astype(np.uint8) assert np.sum(ball) == np.sum(mh.croptobbox(ball))