Вот третий способ сделать это без необходимости писать Python.Он просто использует ImageMagick в Терминале - он установлен на большинстве дистрибутивов Linux и доступен для macOS и Windows.
По сути, он использует те же методы, что и другие мои ответы - порог, медианный фильтри «Анализ подключенных компонентов» , он же «маркировка» .
magick article.jpg -colorspace gray -threshold 95% -median 19x19 \
-define connected-components:verbose=true \
-define connected-components:area-threshold=100 \
-connected-components 4 -auto-level output.png
Пример вывода
Objects (id: bounding-box centroid area mean-color):
4: 963x241+38+333 519.0,453.0 231939 srgb(0,0,0)
0: 1045x590+0+0 528.0,204.0 155279 srgb(255,255,255)
2: 393x246+292+73 488.0,195.5 96534 srgb(0,0,0)
3: 303x246+698+73 849.0,195.5 74394 srgb(0,0,0)
1: 238x246+39+73 157.5,195.5 58404 srgb(0,0,0)
В выводе есть строка заголовка, в которой указано, что это за поля, а затем по одной строке для каждого сгустка, найденного на изображении.Давайте посмотрим на линию:
2: 393x246+292+73 488.0,195.5 96534 srgb(0,0,0)
Это означает, что существует шарик шириной 393 пикселя и высотой 246 пикселя со смещением 292,73 от верхнего левого угла, который мы можем нарисовать полупрозрачным синим цветом.с этим:
magick article.jpg -fill "rgba(0,0,255,0.5)" -draw "rectangle 292,73 685,319" result.png
И мы можем обрезать с этим:
magick article.jpg -crop 393x246+292+73 result.png
Помеченное изображение (output.png
) с самой первой команды выглядит следующим образом - вы увидите, что каждый шарик помечен своим цветом (оттенок серого):
Обратите внимание, что если ваша версия ImageMagick v6 или старше, вам нужно использовать convert
вместо magick
во всех вышеперечисленных командах.