from skimage.measure import label import matplotlib.pyplot as plt import numpy as np struct = np.ones((3,3)) def dilation(arr, struct=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] rsub = np.logical_and(arr[y,x], struct) result[y-1:y+2, x-1:x+2] = np.logical_or(result[y-1:y+2, x-1:x+2], rsub) return result def errosion(arr, struct=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 closing(arr, struct=struct): return dilation(errosion(arr, struct), struct) def opening(arr, struct=struct): return errosion(dilation(arr, struct), struct) img = np.load('wires5.npy.txt') struct = np.array([[0,1,0], [0,1,0], [0,1,0]]) plt.subplot(1,2,1) plt.imshow(img) plt.subplot(1,2,2) plt.imshow(closing(img, struct)) for wire in np.unique(label(img))[1:]: # print(np.where(label(img)==wire)) res = label(closing(img, struct))[label(img)==wire] match(len(np.unique(res)[1:])): case 1: print("Провод не порван") case 0: print("Провод уничтожен") case _: print(f"Провод {wire} порван на {len(np.unique(res)[1:])}") plt.show()