| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | import cv2 |
| | import numpy as np |
| |
|
| |
|
| | lvmin_kernels_raw = [ |
| | np.array([ |
| | [-1, -1, -1], |
| | [0, 1, 0], |
| | [1, 1, 1] |
| | ], dtype=np.int32), |
| | np.array([ |
| | [0, -1, -1], |
| | [1, 1, -1], |
| | [0, 1, 0] |
| | ], dtype=np.int32) |
| | ] |
| |
|
| | lvmin_kernels = [] |
| | lvmin_kernels += [np.rot90(x, k=0, axes=(0, 1)) for x in lvmin_kernels_raw] |
| | lvmin_kernels += [np.rot90(x, k=1, axes=(0, 1)) for x in lvmin_kernels_raw] |
| | lvmin_kernels += [np.rot90(x, k=2, axes=(0, 1)) for x in lvmin_kernels_raw] |
| | lvmin_kernels += [np.rot90(x, k=3, axes=(0, 1)) for x in lvmin_kernels_raw] |
| |
|
| | lvmin_prunings_raw = [ |
| | np.array([ |
| | [-1, -1, -1], |
| | [-1, 1, -1], |
| | [0, 0, -1] |
| | ], dtype=np.int32), |
| | np.array([ |
| | [-1, -1, -1], |
| | [-1, 1, -1], |
| | [-1, 0, 0] |
| | ], dtype=np.int32) |
| | ] |
| |
|
| | lvmin_prunings = [] |
| | lvmin_prunings += [np.rot90(x, k=0, axes=(0, 1)) for x in lvmin_prunings_raw] |
| | lvmin_prunings += [np.rot90(x, k=1, axes=(0, 1)) for x in lvmin_prunings_raw] |
| | lvmin_prunings += [np.rot90(x, k=2, axes=(0, 1)) for x in lvmin_prunings_raw] |
| | lvmin_prunings += [np.rot90(x, k=3, axes=(0, 1)) for x in lvmin_prunings_raw] |
| |
|
| |
|
| | def remove_pattern(x, kernel): |
| | objects = cv2.morphologyEx(x, cv2.MORPH_HITMISS, kernel) |
| | objects = np.where(objects > 127) |
| | x[objects] = 0 |
| | return x, objects[0].shape[0] > 0 |
| |
|
| |
|
| | def thin_one_time(x, kernels): |
| | y = x |
| | is_done = True |
| | for k in kernels: |
| | y, has_update = remove_pattern(y, k) |
| | if has_update: |
| | is_done = False |
| | return y, is_done |
| |
|
| |
|
| | def lvmin_thin(x, prunings=True): |
| | y = x |
| | for i in range(32): |
| | y, is_done = thin_one_time(y, lvmin_kernels) |
| | if is_done: |
| | break |
| | if prunings: |
| | y, _ = thin_one_time(y, lvmin_prunings) |
| | return y |
| |
|
| |
|
| | def nake_nms(x): |
| | f1 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8) |
| | f2 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8) |
| | f3 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8) |
| | f4 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8) |
| | y = np.zeros_like(x) |
| | for f in [f1, f2, f3, f4]: |
| | np.putmask(y, cv2.dilate(x, kernel=f) == x, x) |
| | return y |
| |
|
| |
|