]> AND Private Git Repository - myo-class.git/blob - helpers.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
stable, day after meeting
[myo-class.git] / helpers.py
1 from timeit import timeit
2 import numpy as np
3
4
5 INPUT_DIR = '../../Data/Images_anonymous/Case_0002/'
6 OUT_DIR = './generated/'
7
8
9 np.set_printoptions(edgeitems=272, linewidth=500)# hey numpy, take advantage of my large screen
10
11 def check(p1, p2, Mat):
12     """
13     Not by @res
14     Uses the line defined by p1 and p2 to check array of 
15     input indices against interpolated value
16
17     Returns boolean array, with True inside and False outside of shape
18     """
19     idxs = np.indices(Mat.shape) # Create 3D array of indices
20
21     try:
22         p1 = p1.astype(float)
23         p2 = p2.astype(float)
24
25         # Calculate max column idx for each row idx based on interpolated line between two points
26         max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) +  p1[1]    
27         sign = np.sign(p2[0] - p1[0])
28         return idxs[1] * sign <= max_col_idx * sign
29     except RuntimeWarning as e:
30         print("p1, p2")
31         print(p1, p2)
32         return True
33
34 def drawcontours(Mat, vertices):
35     """
36     Not by @res
37     
38     Mat.shape : (20,20) or something like..
39     vertices : np.array([
40         [5,12],
41         [8,18],
42         [13,14],
43         [11,6],
44         [4,6],
45     ])
46
47     return Mat : the resulting matrix
48     
49     Creates np.array with dimensions defined by shape
50     Fills polygon defined by vertices with ones, all other values zero"""
51
52     fill = np.ones(Mat.shape) # Initialize boolean array defining shape fill
53
54     # Create check array for each edge segment, combine into fill array
55     for k in range(vertices.shape[0]): # .shape[0] is the number of vertices, like len(vertices)
56         fill = np.all([fill, check(vertices[k-1], vertices[k], Mat)], axis=0)
57
58     # Set all values outside polygon to zero
59     # print("fill")
60     # print(fill)
61     Mat[np.invert(fill)] = 0
62
63     return Mat
64
65 def getdir(filepath):
66     return '/'.join(filepath.split('/')[:-1]) + '/'
67
68
69 if __name__ == '__main__':
70     # vertices = np.array(list(reversed([
71     #     (5,12),
72     #     (8,18),
73     #     (13,14),
74     #     (11,6),
75     # ]) ))
76
77     vertices = np.array([
78         [ 97, 129],
79         [103, 134],
80         [108, 139],
81         [109, 146],
82         [109, 155],
83         [105, 161],
84         [ 99, 165],
85         [ 93, 166],
86         [ 83, 164],
87         [ 78, 161],
88         [ 73, 153],
89         [ 72, 147],
90         [ 72, 140],
91         [ 75, 133],
92         [ 79, 129],
93         [ 85, 127],
94         [ 93, 127],
95     ])
96
97     from topng import topng
98     Mat = topng(INPUT_DIR+'Image00003', OUT_DIR + INPUT_DIR.split('/')[-2] +'-Image00003', epimask="/Users/user/Desktop/Master/Stage/Data/json/json_GT/0_Case_0002/contours/1.2.3.4.5.6/31/-85.9968/Epicardic.json")
99     # print(Mat)
100     # Mat = np.ones((20, 25)).astype(np.int32)
101     # Mat[:,:] = 14
102
103     # print( timeit(lambda:create_polygon([20,20], vertices), number=100000) )
104     polygon_array = drawcontours(Mat, vertices)
105     print(polygon_array.shape)
106     # print(polygon_array.astype(np.int32))