Я не думаю, что есть простой способ сделать это.
Я включил два очень похожих подхода. Оба подхода используют библиотеку opencv и ее магию. Второй - в основном там, если вы заинтересованы в упрощенной версии того, как это можно сделать.
Метод 1 (предпочтительно)
Я думаю, это будет самый простой вариант для вас.
import cv2 as cv
img = cv.imread('img.jpg', 0) #Get your image
edges = cv2.Canny(img,100,200)
Затем вы можете посчитать пиксели, чтобы получить периметр.
Более подробную информацию об этом можно найти здесь .
Метод 2
- Сначала используйте Laplacian, чтобы получить величину градиента изображения.
laplacian = cv.Laplacian(img, cv.CV_64F)
Затем вы можете перейти к шагу 3 или сделать это для получения более точных результатов. Используйте не максимальное подавление, чтобы сделать края тонкими на 1 пиксель. Это непросто, но вы можете найти объяснение идеи, стоящей за этим, по ссылке выше.
Подсчитайте оставшиеся пиксели, чтобы получить периметр.
Вы должны знать, что это будет несовершенным, так как такие вещи, как черные пятна внутри ваших объектов, также будут учитываться. Если вы не хотите
что, вы можете сделать операцию закрытия перед не максимальным подавлением, используя:
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
Примечание: Эти решения предполагают, что ваши входные изображения всегда будут такими же, как вы предоставили. Если это не так, то некоторые изменения должны быть сделаны.