ImageMagick и сегментирование смежных островов на прозрачном фоновом изображении - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь преобразовать что-то, похожее на это, в набор небольших изображений или «кусочков», где каждый кусочек может перекрываться с другим, но должен содержать каждый остров непрозрачных пикселей.Длинные непрерывные штрихи не должны быть преобразованы, но большинство «пятен» должно быть.

enter image description here

Так эффективно, я пытаюсь автоматически "нарезать" его, чтобы он выглядел примерно так (грубая ручная нарезка):

enter image description here

Как использовать imagemagick для автоматической обрезки элементов такого изображения, а также для возврата позиции, ширины / высоты, с которой было вырезано каждое субизображение

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Можно использовать «Анализ компонентов подключения» .Поскольку ваше изображение не содержит прозрачности, его трудно использовать, поэтому я взломал его и грубо сделал области шахматной доски прозрачными, как это:

enter image description here

Затем сделайте что-нибудьвдоль этих линий:

magick image.png  -alpha off -colorspace gray -negate -threshold 10%  \
   -define connected-components:verbose=true                          \
   -define connected-components:area-threshold=100                    \
   -connected-components 8 -auto-level output.png

Пример вывода

Objects (id: bounding-box centroid area mean-color):
  1: 498x614+0+0 236.9,317.2 219166 srgb(0,0,0)
  2: 112x583+112+0 177.0,268.6 16094 srgb(255,255,255)
  27: 128x210+350+342 403.8,436.5 14195 srgb(255,255,255)
  7: 104x148+338+85 390.0,160.4 10451 srgb(255,255,255)       <--- this one
  3: 103x145+200+0 250.9,70.9 10317 srgb(255,255,255)
  25: 107x132+202+245 252.7,307.8 9227 srgb(255,255,255)
  36: 117x139+213+428 268.3,497.2 9103 srgb(255,255,255)
  12: 139x77+0+112 62.1,152.4 7162 srgb(255,255,255)
  16: 73x93+414+161 459.0,213.4 4104 srgb(255,255,255)
  37: 51x61+249+457 274.6,488.1 2224 srgb(0,0,0)
  4: 71x36+338+0 382.0,19.6 1507 srgb(255,255,255)
  26: 32x47+238+277 253.1,300.2 875 srgb(0,0,0)
  43: 50x30+283+584 310.7,600.0 833 srgb(255,255,255)
  13: 41x17+31+140 51.0,148.1 410 srgb(0,0,0)
  9: 11x11+174+100 178.7,105.3 104 srgb(255,255,255)

Каждая строка вывода соответствует BLOB-объекту.В начале есть заголовок, который сообщает вам, что представляет собой каждое поле.

Давайте посмотрим на строку:

  7: 104x148+338+85 390.0,160.4 10451 srgb(255,255,255)

и нарисуем этот шарик на ваше изображение полупрозрачным красным:

magick image.png -fill "rgba(255,0,0,0.5)" -draw "rectangle 338,85 442,243" result.png

enter image description here


Обратите внимание, что я фактически отбросил альфа-канал (с -alpha off) в моей команде и использовал преобразованные каналы RGBв оттенках серого как элементы для обнаружения.В зависимости от того, как создается ваше изображение, вам может быть лучше отказаться от каналов RGB и просто использовать альфа-канал или его инверсию (-alpha extract -negate).

0 голосов
/ 23 мая 2019

Не уверен, что ImageMagick может это сделать.

Существует сценарий, который делает нечто подобное для Gimp: ofn-extract-objects.

Техника, которую он использует, довольно проста: выберите фон и преобразуйте выделение в "пути "(т. е. векторы).Векторы будут иметь один «штрих» на непрерывную границу выделения (это означает, что у вас есть вложенные штрихи, если у вас есть объекты с отверстиями, но это не так сложно обнаружить и отфильтровать).Получив штрихи, вы можете использовать координаты якорей и тангенсов для определения их ограничительной рамки.

Если вы не хотите использовать Gimp, вы можете использовать potrace и обработатьвыведите SVG аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...