def test_barcode(): N = 200 N_s = 50 k = int(N/5) w = .5 r = .6 vertices = get_image('C', 1, size=200, sample_size=N)[0] tangents = hm.find_tangents(vertices, k) curve = hm.get_curve(vertices, k = k, w = w) sparse = sparse_sample(vertices, N_s) v_s = vertices[sparse,:] t_s = tangents[sparse] c_s = curve[sparse] edges = hm.get_rips_complex(v_s, tangents=t_s, k = k, w = w, r = r) f, ax = plt.subplots(1,2) plt_edges, plt_barcode = ax plt_edges.scatter(v_s[:,0], v_s[:,1], marker = '.', c=c_s, s=200) for edge in edges: plt_edges.plot(v_s[edge, 0], v_s[edge, 1], lw = 1, c = 'blue') plt_edges.invert_yaxis() ordered_simplices, curve_lookup = hm.get_ordered_simplices(v_s, c_s, edges) barcode = bc.get_barcode(ordered_simplices, degree_values=c_s[np.argsort(c_s)]) b0 = barcode[barcode[:,2] == 0, :] bc.plot_barcode_gant(b0, plt=plt_barcode) plt.show()
def image_preprocessing(): N = 500 N_s = 30 sample, vertices, image, original = get_image('A', 1, size=200, sample_size=N) f, ax = plt.subplots(2,2, gridspec_kw = {'width_ratios':[1,1]}) ax[0][0].imshow(original, cmap='binary') ax[0][0].set_xticks([]) ax[0][0].set_yticks([]) ax[0][0].set_title("Original Image") ax[0][1].imshow(image, cmap='binary') ax[0][1].set_xticks([]) ax[0][1].set_yticks([]) ax[0][1].set_title("Scaled, Cropped & Thinned") ax[1][0].scatter(sample[:,0], sample[:,1], marker='.') ax[1][0].invert_yaxis() ax[1][0].set_xticks(np.arange(-1, 1.1)) ax[1][0].set_yticks(np.arange(-1, 1.1)) ax[1][0].set_title('Random Sampling') sparse_idx = sparse_sample(sample, N_s) sparse = sample[sparse_idx, :] ax[1][1].scatter(sparse[:,0], sparse[:,1], marker='.') ax[1][1].invert_yaxis() ax[1][1].set_xticks(np.arange(-1, 1.1)) ax[1][1].set_yticks(np.arange(-1, 1.1)) ax[1][1].set_title('Downsampled') plt.tight_layout() plt.show()
def delaunay_complex_2d(vertices, N_s): sparse = sparse_sample(vertices, N_s) landmarks = vertices[sparse, :] tri = spatial.Delaunay(landmarks) edges = np.concatenate( [tri.simplices[:, :2], tri.simplices[:, 1:], tri.simplices[:, [2, 0]]], axis=0) return edges, landmarks, sparse
def witness_complex_2d(vertices, N_s): sparse = sparse_sample(vertices, N_s) landmarks = vertices[sparse, :] D = spatial.distance.cdist(vertices, landmarks) closest = np.argsort(D, axis=1) edges = closest[:, :2] edges = remove_duplicate_edges(edges) return edges, landmarks, sparse
def test_sparse_sampling(): N = 500 vertices = get_image_skeleton('P', 0, size=200, sample_size=N)[0] plt.scatter(vertices[:,0], vertices[:,1], marker = '.', c='#eeeeee') sparse = sparse_sample(vertices, 50) plt.scatter(sparse[:,0], sparse[:,1], marker='+', c='blue') plt.show()
def get_all_rips_2d(vertices, N_s, k, w, r): tangents = find_tangents(vertices, k) curve = find_curve(vertices, tangents, k, w) sparse = sparse_sample(vertices, N_s) v_s = vertices[sparse, :] t_s = tangents[sparse] c_s = curve[sparse] edges = rips_complex_2d(v_s, r=r) return v_s, t_s, c_s, edges
def witness_complex_4d(vertices, tangents, w, N_s): tspace = get_tspace(vertices, tangents, w) sparse = sparse_sample(tspace, N_s) landmarks = tspace[sparse, :] D = spatial.distance.cdist(tspace, landmarks) closest = np.argsort(D, axis=1) edges = closest[:, :2] edges = remove_duplicate_edges(edges) return edges, landmarks, sparse
def delaunay_complex_4d(vertices, tangents, w, N_s): tspace = get_tspace(vertices, tangents, w) sparse = sparse_sample(tspace, N_s) landmarks = tspace[sparse, :] tri = spatial.Delaunay(landmarks) edges = np.concatenate([ tri.simplices[:, 0:2], tri.simplices[:, 1:3], tri.simplices[:, 2:4], tri.simplices[:, 3:5], tri.simplices[:, [4, 0]] ], axis=0) return edges, landmarks, sparse
def test_edges(): N = 200 N_s = 50 k = int(N/5) w = .5 r = .6 vertices = get_image('A', 2, size=200, sample_size=N)[0] tangents = hm.find_tangents(vertices, k) sparse = sparse_sample(vertices, N_s) v_s = vertices[sparse,:] t_s = tangents[sparse] edges = hm.get_rips_complex(v_s, tangents=t_s, k = k, w = w, r = r) plot_edges(v_s, edges, plt) plt.gca().invert_yaxis() plt.show()
def test_delaunay(): N = 200 N_s = 50 k = int(N/5) w = .5 r = .6 vertices = get_image('B', 2, size=200, sample_size=N)[0] sparse = sparse_sample(vertices, N_s) v_s = vertices[sparse,:] edges = hm.delaunay_complex_2d(v_s) plt.scatter(vertices[:,0], vertices[:,1], marker='.', c='gray') plt.scatter(v_s[:,0], v_s[:,1], marker='+', c='red') for edge in edges: plt.plot(v_s[edge,0], v_s[edge,1], lw = 1, c = 'blue') plt.gca().invert_yaxis() plt.show()
def test_tangent(): N = 200 k = int(N/5) vertices, all_points, img, _ = get_image('B', 0, size=200, sample_size=N) tspace = hm.get_tangents(vertices, k = k) sparse = sparse_sample(vertices, 50) plot_tangent_space_2d(tspace[sparse,:]) # plot_tangent_space_3d(tspace[sparse,:]) # f, ax = plt.subplots(1, 3) # ax[0].scatter(vertices[:,0], vertices[:,1], marker='.', c=tspace[:,3]) # ax[0].invert_yaxis() # idx = np.argwhere(tspace[:,3] < 0.25).flatten() # print(idx.shape) # v = vertices[idx,:] # print(v.shape) # ax[1].scatter(v[:,0], v[:,1], marker='.') # ax[1].invert_yaxis() plt.show() return
def test_filtration(): N = 200 N_s = 50 k = int(N/5) w = .5 r = .6 vertices = get_image('A', 2, size=200, sample_size=N)[0] tangents = hm.find_tangents(vertices, k) curve = hm.get_curve(vertices, k = k, w = w) sparse = sparse_sample(vertices, N_s) v_s = vertices[sparse,:] t_s = tangents[sparse] c_s = curve[sparse] edges = hm.get_rips_complex(v_s, tangents=t_s, k = k, w = w, r = r) simplices, curve_lookup = hm.get_ordered_simplices(v_s, c_s, edges) max_degree = np.max(simplices[:,3]) degree_step = math.ceil(max_degree/16.0) verts_degree = simplices[simplices[:,4] == 0,0:3] f, ax = plt.subplots(4,4, sharex=True, sharey=True) ax[0][0].invert_yaxis() for i in range(4): for j in range(4): idx = i*4 + j deg = min(idx * degree_step, max_degree) plot_simplices(simplices, deg, v_s, ax[i][j]) ax[i][j].set_title("κ={0:1.4f}".format(curve[verts_degree[deg,0]]), fontsize=8) ax[i][j].set_xticklabels([]) ax[i][j].set_yticklabels([]) plt.tight_layout() plt.figure() barcode = bc.get_barcode(simplices, degree_values=c_s[np.argsort(c_s)]) b0 = barcode[barcode[:,2] == 0, :] bc.plot_barcode_gant(b0, plt=plt) plt.show()