| 663 | return mesh, add_node_time, add_edge_time, add_far_near_time |
| 664 | |
| 665 | def clean_far_edge(mask_edge, mask_edge_with_id, context_edge, mask, info_on_pix, global_mesh, anchor): |
| 666 | if isinstance(mask_edge, torch.Tensor): |
| 667 | if mask_edge.is_cuda: |
| 668 | mask_edge = mask_edge.cpu() |
| 669 | mask_edge = mask_edge.data |
| 670 | mask_edge = mask_edge.numpy() |
| 671 | if isinstance(context_edge, torch.Tensor): |
| 672 | if context_edge.is_cuda: |
| 673 | context_edge = context_edge.cpu() |
| 674 | context_edge = context_edge.data |
| 675 | context_edge = context_edge.numpy() |
| 676 | if isinstance(mask, torch.Tensor): |
| 677 | if mask.is_cuda: |
| 678 | mask = mask.cpu() |
| 679 | mask = mask.data |
| 680 | mask = mask.numpy() |
| 681 | mask = mask.squeeze() |
| 682 | mask_edge = mask_edge.squeeze() |
| 683 | context_edge = context_edge.squeeze() |
| 684 | valid_near_edge = np.zeros_like(mask_edge) |
| 685 | far_edge = np.zeros_like(mask_edge) |
| 686 | far_edge_with_id = np.ones_like(mask_edge) * -1 |
| 687 | near_edge_with_id = np.ones_like(mask_edge) * -1 |
| 688 | uncleaned_far_edge = np.zeros_like(mask_edge) |
| 689 | # Detect if there is any valid pixel mask_edge, if not ==> return default value |
| 690 | if mask_edge.sum() == 0: |
| 691 | return far_edge, uncleaned_far_edge, far_edge_with_id, near_edge_with_id |
| 692 | mask_edge_ids = dict(collections.Counter(mask_edge_with_id.flatten())).keys() |
| 693 | for edge_id in mask_edge_ids: |
| 694 | if edge_id < 0: |
| 695 | continue |
| 696 | specific_edge_map = (mask_edge_with_id == edge_id).astype(np.uint8) |
| 697 | _, sub_specific_edge_maps = cv2.connectedComponents(specific_edge_map.astype(np.uint8), connectivity=8) |
| 698 | for sub_edge_id in range(1, sub_specific_edge_maps.max() + 1): |
| 699 | specific_edge_map = (sub_specific_edge_maps == sub_edge_id).astype(np.uint8) |
| 700 | edge_pxs, edge_pys = np.where(specific_edge_map > 0) |
| 701 | edge_mesh = netx.Graph() |
| 702 | for edge_px, edge_py in zip(edge_pxs, edge_pys): |
| 703 | edge_mesh.add_node((edge_px, edge_py)) |
| 704 | for ex in [edge_px-1, edge_px, edge_px+1]: |
| 705 | for ey in [edge_py-1, edge_py, edge_py+1]: |
| 706 | if edge_px == ex and edge_py == ey: |
| 707 | continue |
| 708 | if ex < 0 or ex >= specific_edge_map.shape[0] or ey < 0 or ey >= specific_edge_map.shape[1]: |
| 709 | continue |
| 710 | if specific_edge_map[ex, ey] == 1: |
| 711 | if edge_mesh.has_node((ex, ey)): |
| 712 | edge_mesh.add_edge((ex, ey), (edge_px, edge_py)) |
| 713 | periphery_nodes = netx.periphery(edge_mesh) |
| 714 | path_diameter = netx.diameter(edge_mesh) |
| 715 | start_near_node = None |
| 716 | for node_s in periphery_nodes: |
| 717 | for node_e in periphery_nodes: |
| 718 | if node_s != node_e: |
| 719 | if netx.shortest_path_length(edge_mesh, node_s, node_e) == path_diameter: |
| 720 | if np.any(context_edge[node_s[0]-1:node_s[0]+2, node_s[1]-1:node_s[1]+2].flatten()): |
| 721 | start_near_node = (node_s[0], node_s[1]) |
| 722 | end_near_node = (node_e[0], node_e[1]) |