Если 3 требуемых компонента всегда находятся в одном и том же месте, вы можете просто извлечь их в соответствии с координатами:
convert image.png -crop 164x146+27+0 +repage result-0.png
convert image.png -crop 12x146+0+0 +repage result-1.png
convert image.png -crop 30x7+138+151 +repage result-2.png
Последний пустой!
Если они не всегда находятся в одном и том же месте, я бы посмотрел на слой альфа / прозрачности изображения:
convert image.png -alpha extract alpha.png
Поскольку он показывает нужные вам биты на белом, я бы искал белые пятна, используя «Анализ связанных компонентов»
convert image.png -alpha extract \
-define connected-components:verbose=true \
-define connected-components:area-threshold=200 \
-connected-components 4 -normalize result.png
выход
Objects (id: bounding-box centroid area mean-color):
2: 164x146+27+0 108.5,72.5 23944 srgb(255,255,255)
3: 32x161+174+0 196.5,87.0 2670 srgb(2,2,2)
5: 174x15+0+146 79.8,152.8 2370 srgb(1,1,1)
1: 15x146+12+0 19.0,72.5 2190 srgb(2,2,2)
0: 12x146+0+0 5.5,72.5 1752 srgb(255,255,255)
39: 30x7+138+151 152.5,154.0 210 srgb(255,255,255)
Это показывает нам все пятна на вашем изображении. Оглядываясь назад на альфа-слой, вам нужны только белые и второе поле на линии, потому что оно говорит вам, где обрезать этот шарик.
Это приводит нас к этому:
#!/bin/bash
# Edit this according to your input image name
image="image.png"
i=0
convert "$image" -alpha extract \
-define connected-components:verbose=true \
-define connected-components:area-threshold=200 \
-connected-components 4 -normalize result.png |
awk '/255,255,255/{print $2}' |
while read c ; do
convert "$image" -crop "$c" +repage result-$i.png
((i=i+1))
done
который, надеюсь, делает то, что вы хотите.