123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import sys
- from skimage.measure import label
- import matplotlib.pyplot as plt
- import numpy as np
- def dil(arr, struct):
- res = np.zeros_like(arr)
- for y in range(1, arr.shape[0] - 1):
- for x in range(1, arr.shape[1] - 1):
- sub = arr[y - 1 : y + 2, x - 1 : x + 2]
- rsub = np.logical_and(arr[y, x], struct)
- res[y - 1 : y + 2, x - 1 : x + 2] = np.logical_or(
- res[y - 1 : y + 2, x - 1 : x + 2], rsub
- )
- return res
- def erros(arr, struct):
- result = np.zeros_like(arr)
- for y in range(1, arr.shape[0] - 1):
- for x in range(1, arr.shape[1] - 1):
- sub = arr[y - 1 : y + 2, x - 1 : x + 2]
- if np.all(sub >= struct):
- result[y, x] = 1
- return result
- def cl(arr, struct):
- return dil(erros(arr, struct), struct)
- def op(arr, struct):
- return erros(dil(arr, struct), struct)
- if len(sys.argv) < 2:
- print("No path provided")
- exit()
- num = np.load(sys.argv[1])
- m = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])
- plt.subplot(1, 2, 1)
- plt.imshow(num)
- plt.subplot(1, 2, 2)
- plt.imshow(cl(num, m))
- for w in np.unique(label(num))[1:]:
- res = label(cl(num, m))[label(num) == w]
- match len(np.unique(res)[1:]):
- case 1:
- print("Провод не порван")
- case 0:
- print("Провод уничтожен")
- case _:
- print(f"Провод {w} порван на {len(np.unique(res)[1:])}")
- plt.show()
|