ImageMagick - Разделить прозрачное изображение вдоль внутренних непрозрачных границ объекта - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть прозрачное изображение, содержащее три непрозрачных объекта, каждый из которых разделен прозрачностью. Есть ли простая команда - не та, которая содержит миллионы опций, аргументов и случайных выродков внутри картинки - разбить эту картинку на три части, каждая в файле изображения.

Пожалуйста, посетите эту ссылку , чтобы посмотреть тип картинки.

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Если в Unix-подобной системе вы можете попробовать мой многоканальный bash-скрипт, использующий ImageMagick. Это скрипт, который очень похож на пример кода Марка Сетчелла с добавлением еще нескольких наворотов.

Введите:

enter image description here

multicrop2 -b none -f 1 -u 3 image.png results.png


Он извлечет каждый объект, например, использование Марком -connected-components, который также использует мой скрипт. -B none говорит сценарию, что цвет фона прозрачный. Параметр -f 1 означает отделение фона от объектов с использованием нечеткого значения 1%. Параметр -u 3 означает отсутствие поворота полученных изображений.

Результаты:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Если вам безразличны буквы, вы можете сделать

multicrop2 -b none -f 1 -u 3 -d 100 test.png results2.png


-D 100 отбрасывает любую область, которая содержит менее 100 смежных пикселей. Таким образом, вы получите только первые 3 изображения, показанные выше.

Смотрите мои сценарии на http://www.fmwconcepts.com/imagemagick/index.php

0 голосов
/ 05 сентября 2018

Если 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

enter image description here

enter image description here

Последний пустой!


Если они не всегда находятся в одном и том же месте, я бы посмотрел на слой альфа / прозрачности изображения:

convert image.png -alpha extract alpha.png

enter image description here

Поскольку он показывает нужные вам биты на белом, я бы искал белые пятна, используя «Анализ связанных компонентов»

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

который, надеюсь, делает то, что вы хотите.

...