from skimage.filters import threshold_otsu from skimage.measure import label, regionprops from skimage.morphology import binary_closing, binary_dilation, binary_erosion, binary_opening import matplotlib.pyplot as plt import pathlib def binary_append(image, func, times: int = 1): result = image[:] for _ in range(times): result = func(result) return result all_pencils = 0 for index in range(1, 12): image = plt.imread(f'pencils/images/img ({index}).jpg').mean(axis=2) thrashold = threshold_otsu(image) image[image < thrashold] = 1 image[image > thrashold] = 0 # Большой closing result = binary_append(image, binary_dilation, 25) result = binary_append(result, binary_erosion, 25) pen_count = 0 labeled = label(result) regions = regionprops(labeled) for region in regions: min_row, min_col, max_row, max_col = region.bbox width = max_col - min_col height = max_row - min_row if (width / result.shape[1] > 0.4 or height / result.shape[0] > 0.4) and \ not (max_row == result.shape[0] or max_col == result.shape[1]): pen_count += 1 plt.subplot(3,4,index) plt.title(f'{pen_count} карандашей') plt.imshow(labeled) all_pencils += pen_count plt.show()